Java programming выпуск 19-й
Здравствуйте дорогие читатели!
Начинающим
В прошлом номере при рассмотрении условного оператора if-else был приведён пример:class IfElseClass { public static void main(String args[]) { int age=6; if(age>=0&&age;<7) System.out.println("You very young"); else if(age>=7&&age;<18) System.out.println("You young"); else if(age>=18&&age;<50) System.out.println("You adult"); else if(age>=50&&age;<80) System.out.println("You old"); else if(age>=80&&age;<=180) System.out.println("You very old"); else if(age>180) System.out.println("You deadmen"); else System.out.println("Wrong age"); } }В нем закралась грубая ошибка которую подметил Иван aka Atlanoff, процитирую его письмо:
В последнем номере был такой фрагмент: ======================================== class IfElseClass { public static void main(String args[]) { int age=6; if(age>=0&&age;<7) System.out.println("You very young"); else if(age>=7&&age;<18) System.out.println("You young"); else if(age>=18&&age;<50) System.out.println("You adult"); else if(age>=50&&age;<80) System.out.println("You old"); else if(age>=80&&age;<=180) System.out.println("You very old"); else if(age>180) System.out.println("You deadmen"); else System.out.println("Wrong age"); } } ================================== Может быть правильней было бы написать так: -- int age=6; if (age<0) System.out.println("Wrong age"); else if(age<7) System.out.println("You very young"); else if(age<18) System.out.println("You young"); else if(age<50) System.out.println("You adult"); else if(age<80) System.out.println("You old"); else if(age<180) System.out.println("You very old"); else System.out.println("You deadmen"); --- Что я имею в виду: 1. Потерялся порядок: сначала от нуля и до максимального, а в конце - проверка на отрицательные значения. Лучше всё-таки придерживаться порядка. 2. Потерялся смысл вложенных if. На самом деле фишка в том, что предыдущие if относительно некоторого текущего гарантировано не выполнились и нет смысла делать дополнительные проверки. Не то что бы пример не работает, но у него плохой стиль, и он труден для отладки. Например я бы перепутал "меньше" и "меньше-либо-равно". В Вашем случае глюки будут более жуткими и трудноотлавливаемыми. Или через месячишко Вас собьёт с толку вывод сообщения при отрицательном значении после всех других проверок.
Да я с вами полностью согласен Иван, и со своей стороны постараюсь больше не выпускать в номер таких "сырых" примеров.
Циклы
Любой цикл можно разделить на 4 части — инициализацию, тело, итерацию и условие завершения. В Java есть три циклические конструкции: while (с пред-условием), do-while (с пост-условием) и for (с параметровм).
while
Этот цикл многократно выполняется до тех пор, пока значение логического выражения равно true. Ниже приведена общая форма оператора while:
[ инициализация; ]
while ( завершение )
{
тело;
[итерация;]
}
Инициализация и итерация необязательны.
Приведем пример цикла while для печати десяти пронумерованных строк.
class WhileExample { public static void main(String args[]) { int n = 0; while (n < 10) { System.out.println("Строка " + n); n++; } } }
do-while
Иногда возникает потребность выполнить тело цикла по крайней мере один раз — даже в том случае, когда логическое выражение с самого начала принимает значение false. Для таких случаев в Java используется циклическая конструкция do-while. Ее общая форма записи такова:
[ инициализация; ]
do
{
тело;
[итерация;]
}
while ( завершение );
В следующем примере тело цикла выполняется до первой проверки условия завершения. Это позволяет совместить код итерации с условием завершения:
class DoWhileExample { public static void main(String args[]) { int n = 0; do { System.out.println("Строка " + n); } while (++n < 10); } }
for
В этом операторе предусмотрены места для всех четырех частей цикла. Ниже приведена общая форма оператора записи for.
for ( инициализация; завершение; итерация ) тело;
Любой цикл, записанный с помощью оператора for, можно записать в виде цикла while, и наоборот. Если начальные условия таковы, что при входе в цикл условие завершения не выполнено, то операторы тела и итерации не выполняются ни одного раза.
class ForExample { public static void main(String args[]) { for (int i = 0; i <10; i++) System.out.println("Строка " + i); } }
Тема "на заказ"
Многопоточность (продолжение)
Потоки-демоны
Вызвав для потока метод setDaemon, вы превращаете обычный поток в поток-демон. Такой поток работает в фоновом режиме независимо от породившего его потока. Если поток-демон создает другие потоки, то они также станут получат статус потока-демона.
Заметим, что метод setDaemon необходимо вызывать после создания потока, но до момента его запуска, то есть перед вызовом метода start.
С помощью метода isDaemon вы можете проверить, является поток демоном, или нет.
В прошлом номере я обещал привести пример более функционального многопоточного приложения:
Многопоточное GUI приложение, задача которого - читать по http
указанные файлы (может быть неограничено). Есть возможность
запуска и остановки процесса, протоколирование в файл, времени
прочтения указанного файла, а так же результат этого прочтения (если возникает
ошибка, указывается, какая именно). Последние результаты для всех файлов выводятся на экран в таблицу.
Другими словами это приложение - проверялщик отвечаемости WEB сайтов с минимальной статистикой.
Так как размер программы получился не маленький и не уместился в лимит рассылки привожу ссылку на исходные коды.
Вопрос - ответ
Вопрос: Перспективы ява. |
Ответ:
Да, что касается апплетов ситуация близка к этому. Хотя я довольно часто встречаю, на зарубежных сайтах, различные решения реализованные с помощью апплетов, та же анимация может быть реализована апплетом с меньшим размером файла, чем во флеш. (А вообще то я сторонник SVG формата). |
Вопрос: Имеется ли какая ни будь возможность,
как например на Визуальном Васике, перебирать элементы управления на
панели, анализировать их на принадлежность к определенному
классу (например Button) и
изменять их свойства (например setBackground(Color.green)).
|
Ответ: Один из вариантов привожу в "Программном коде". |
Вопрос: Скажите пожалуйста, как из апплета сказать броузеру перейти на какую-нибудь страничку?
|
Ответ: getAppletContext().showDocument(URL);URL- ссылка на страничку. |
Вопрос: Как сделать scroll'ер на Джава
|
Ответ:
Используйте |
Программный код…
import java.awt.*; import java.awt.event.*; import javax.swing.*; public class Frame1 extends JFrame { JPanel contentPane; BorderLayout borderLayout1 = new BorderLayout(); public Frame1() { enableEvents(AWTEvent.WINDOW_EVENT_MASK); try { jbInit(); } catch(Exception e) { e.printStackTrace(); } } /**Component initialization*/ private void jbInit() throws Exception { contentPane = (JPanel) this.getContentPane(); contentPane.setLayout(borderLayout1); this.setSize(new Dimension(400, 300)); this.setTitle("Frame Title"); contentPane.add(new JButton("Button2"),BorderLayout.EAST); contentPane.add(new JButton("Button3"),BorderLayout.NORTH); contentPane.add(new JButton("Button4"),BorderLayout.WEST); contentPane.add(new JLabel("Label"),BorderLayout.SOUTH); JButton jb=new JButton("Click here"); jb.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(ActionEvent e) { // ***Перебор компонентов*** // Используем оператор instanceof for(int i=0;i<contentPane.getComponentCount;();i++) if (contentPane.getComponent(i) instanceof JButton) { JButton b=(JButton)contentPane.getComponent(i); b.setBackground(new Color((int)(Math.random()*255), (int)(Math.random()*255),(int)(Math.random()*255))); } // ************************* } }); contentPane.add(jb,BorderLayout.CENTER); } /**Overridden so we can exit when window is closed*/ protected void processWindowEvent(WindowEvent e) { super.processWindowEvent(e); if (e.getID() == WindowEvent.WINDOW_CLOSING) { System.exit(0); } } }
JavaScript
Вопрос: Есть некоторый рисунок, который используется как менюшка, т.е. в хтмл используется карта (map). Одна из ссылок на котором вроде каталога: вместо этого рисунка подставляет другой, но на другом все ссылки расположены по другому ..., в общем надо при изменении картинки накладывать на нее другую карту. У меня меняется рисунок, а карта остается!!! Делал так: <script; language="JavaScript"> <!-- hide function Ctrl(where) { if (where==0) { document.CtrlImage.src="/images/control.gif"; document.CtrlImage.usemap="#map1"; } if (where==1) { document.CtrlImage.src="/images/control1.gif"; document.CtrlImage.usemap="#map2" } } // --> </script> Komarov D |
Ответ:
Вы всё делаете правильно, за исключением маленькой ошибочки: document.CtrlImage.usemap="#map1"; document.CtrlImage.usemap="#map2";надо писать: document.CtrlImage.useMap="#map1"; document.CtrlImage.useMap="#map2"; Действующий пример смены рисунка и карты ссылок можно посмотреть тут. |
Вопрос: Как проверить включена ли в браузере графика?
|
Ответ: <html;> <head;> <script; language="JavaScript"> <!-- function testGraphics() { if(document.tImage.width==100)alert("Enable graphics"); else alert("Disable graphics"); } // --> </script> </head> <body;> <img; src="test.gif" alt="Image" name="tImage"> <script; language="JavaScript"> <!-- testGraphics() // --> </script> </body> </html>При условии что ширина test.gif = 100 |
Вопрос: Как сделать таблицу, чтобы при наводе мышки на ячейку менялся ее цвет заднего фона?
|
Ответ: <html;> <body;> <table;> <tr;> <td; onmouseover="this.bgColor='#aaaaaa'" onmouseout="this.bgColor='#ffffff'"> Ячейка 1 </td> <td;> Ячейка 2 </td> </tr> </table> </body> </html> |
Вопросы присылайте на E-mail
[email protected] с пометкой "Вопрос по Java".
Жду вопросов и предложений.
Подписаться на эту рассылку и посмотреть архив можно тут /subs/subs.html