Java programming выпуск 20-й
Здравствуйте дорогие читатели!
Открылась новая рассылка "Новости сайта". Подписавшись на эту рассылку вы будете раз в неделю получать прямые ссылки на новые материалы и другую информацию связанную с развитием сайта!
Подписаться можно прямо на сайте.
Начинающим
Иногда возникают ситуации, когда разделы инициализации или итерации цикла for требуют нескольких операторов. Поскольку составной оператор в фигурных скобках в заголовок цикла for вставлять нельзя, Java предоставляет альтернативный путь. Применение запятой (,) для разделения нескольких операторов допускается только внутри круглых скобок оператора for. Ниже приведен пример цикла for, в котором в разделах инициализации и итерации стоит несколько операторов.
class ForExample2 { public static void main(String args[]) { int a, b; for (a = 1, b = 4; a < b; a++, b--) { System.out.println("a = " + a); System.out.println("b = " + b); } } }
Вывод этой программы показывает, что цикл выполняется всего два раза.
а = 1
b = 4
а = 2
b = 3
continue
В некоторых ситуациях возникает потребность досрочно перейти к выполнению следующей итерации, проигнорировав часть операторов тела цикла, еще не выполненных в текущей итерации. Для этой цели в Java предусмотрен оператор continue. Ниже приведен пример, в котором оператор continue используется для того, чтобы в каждой строке печатались два числа.
class ContinueExample { public static void main(String args[]) { for (int i=0; i < 10; i++) { System.out.print(i + " "); if (i % 2 == 0) continue; System.out.println(""); } } }
Если индекс четный, цикл продолжается без вывода символа новой строки. Результат выполнения этой программы таков:
0 1
2 3
4 5
5 7
8 9
Как и в случае оператора break, в операторе continue можно задавать метку, указывающую, в каком из вложенных циклов вы хотите досрочно прекратить выполнение текущей итерации. Для иллюстрации служит программа, использующая оператор continue с меткой для вывода треугольной таблицы умножения для чисел от 0 до 9:
class ContinueExample2 { public static void main(String args[]) { outer: for (int i=0; i < 10; i++) { for (int j = 0; j < 10; j++) { if (j > i) { System.out.println(""); continue outer; } System.out.print(" " + (i * j)); } } }}
Оператор continue в этой программе приводит к завершению внутреннего цикла со счетчиком j и переходу к очередной итерации внешнего цикла со счетчиком i. В процессе работы эта программа выводит следующие строки:
0
0 1
0 2 4
0 3 6 9
0 4 8 12 16
0 5 10 15 20 25
0 6 12 18 24 30 36
0 7 14 21 28 35 42 49
0 8 16 24 32 40 48 56 64
0 9 18 27 36 45 54 63 72 81
Тема "на заказ"
Модель делегирования событий в JDK 1.1
Большая часть работы по написанию программ пользовательского интерфейса заключает-ся в определении необходимых взаимодействий. Если операционная система определяет, что была нажата клавиша на клавиатуре или кнопка мыши, ее задача — уведомить об этом соот-ветствующее приложение. Оно, в свою очередь, должно выяснить, какой из компонентов интерфейса связан с данным проявлением активности пользователя, и переслать сообщение ему. Начиная с JDK 1.1, фирма SUN реализовала новый метод обмена информацией о собы-тиях—модель делегирования событий. <.p>
Как же работает модель делегирования событий? Каждый элемент взаимодействия между интерфейсом пользователя и программой определяется как событие. Классы приложений выясняют свою заинтересованность в некотором, ожидаемом определенным компонентом событии путем опроса компонента и выдачи ему предложения поместить в список сведения о его блоке прослушивания (listener). Когда происходит некоторое событие, источник события уведомляет о нем все зарегистрированные блоки прослушивания.
Существует два различных типа событий — низкоуровневые и семантические, Все классы этих событий являются производными от класса java.awt.AWTEvent. Низкоуровневые события связаны с физическими аспектами интерфейса пользователя — щелчками мыши, нажа-тиями клавиш клавиатуры и т.д. Семантические события строятся на базе низкоуровневых событий. Например, для выбора команды меню пользователю может потребоваться раскрыть список команд первым щелчком мыши, а затем вторым щелчком выбрать в нем требуемую команду. Щелчок мышью означает нажатие кнопки мыши с последующим ее отпусканием. Эта серия низкоуровневых событий (нажатие кнопки мыши над панелью меню, отпускание кнопки мыши над панелью меню, нажатие кнопки мыши над командой меню, отпускание кнопки мыши над командой меню) может быть объединена в одно семантическое событие.
Рассмотрим небольшую программу в которой при попытке закрытия окна выводится диалоговое окошко подтверждения действия.
import java.awt.*; import java.awt.event.*; import javax.swing.*; class ExampleCloseWindow extends JFrame { public ExampleCloseWindow() { addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { int result = JOptionPane.showConfirmDialog(getParent(), "Close window?","Close window",JOptionPane.YES_NO_OPTION); if(result == JOptionPane.YES_OPTION)System.exit(0); else setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); } }); } public static void main(String args[]) { System.out.println("Starting ExampleCloseWindow..."); ExampleCloseWindow mainFrame = new ExampleCloseWindow(); mainFrame.setSize(400, 400); mainFrame.setTitle("ExampleCloseWindow"); mainFrame.setVisible(true); } }
При создании нового объекта класса JFrame данная программа сообщает ему, что он заинтересован в обработке определённых событий. Однако вместо того, чтобы известить его об этом прямо, конструктор организует посылку ему предупреждения через объект класса adapter—промежуточный класс, который обрабатывает только один тип событий. В дан-ном случае промежуточный объект принадлежит клас-су WindowAdapter, обрабатывающему событие класса WindowEvent. Когда объект фрейма ге-нерирует событие WindowEvent, объект анализирует, является ли оно со-бытием WindowClosing. Если это не так, объект игнорирует его. Если получено ожидаемое событие, в программе запускается процесс описанный в данном обработчике событий.
Вопрос - ответ
Вопрос:
Работаю в JBuilder6. Такая проблема, когда создаю апплет с использованием только ATW(AWT)
компонентов, то все работает нормально, а если использую SWING IE пишет: |
Ответ:
В семнадцатом номере был подобный вопрос и ответ на него следующий: |
Вопрос: public class MyTrees extends JApplet { JLabel ct=new JLabel("Надпись",new ImageIcon("1.jpg"),JLabel.CENTER); Container cp = getContentPane(); String[] data={ "Colors", "Red", "Blue", "Green" }; DefaultMutableTreeNode root = new DefaultMutableTreeNode("Корень"); JTree tr= new JTree(root); JButton but= new JButton("Привет") ; JTextArea txt=new JTextArea(); boolean fack=true; public void init() { for(int i=0;i<data.length;i++) { DefaultMutableTreeNode subtree1= new DefaultMutableTreeNode(data[i]); root.add(subtree1); } final JPanel p = new JPanel(); final JPanel pt = new JPanel(); final JPanel pt2 = new JPanel(); p.add(but); pt.add(tr); but.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { pt2.add(ct) ; txt.append("Была нажата кнопка\n"); } }); cp.add(p, BorderLayout.SOUTH); cp.add(pt,BorderLayout.EAST) ; cp.add(pt2,BorderLayout.NORTH) ; cp.add(new JScrollPane(txt)); } public static void main(String args[]) { BeerGo.run(new MyTrees(),1000,1000); } }У меня никак не получается нормальная работа кнопки... , чтобы нажав на нее отображалась картинка. Sasha |
Ответ: Необходимо утвердить произошедшие изменения в контейнере: but.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { pt2.add(ct) ; txt.append("Была нажата кнопка\n"); cp.validate(); } }); |
Вопрос:
Как убрать мерцание при перерисовке repaint()?
Вся картинка рисуется в painte.
|
Ответ: Посмотрите пример Устранение мерцаний с помощью двойной буферизации |
Вопрос:
Я начинающий программист, сейчас самостоятельно изучаю язык Java
по книгам, а также Ваши уроки, вопросы простые: |
Ответ: Что касается написания программ, как вы выражаетесь в “ДОСе”, просто иногда различные IDE добавляют излишний программный код который может быть непонятен начинающим программистам. Да и написать программу с нуля, а не с шаблона предоставляемого визуальной средой разработки, будет намного поучительней и даст возможность вникнуть в ход написания текста программы. Например чтобы написать простое приложение состоящее из одного окошка достаточно: import java.awt.*; import java.awt.event.*; class FirstApplication extends Frame { public FirstApplication() { addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); } public static void main(String args[]) { FirstApplication mainFrame = new FirstApplication(); mainFrame.setSize(400, 300); mainFrame.setTitle("First Application"); mainFrame.setVisible(true); } } При выполнении той же задачи в JBuilder используя встроенный конструктор получим два класса: package untitled1; import javax.swing.UIManager; import java.awt.*; public class Application1 { boolean packFrame = false; /**Construct the application*/ public Application1() { FirstApplication frame = new FirstApplication(); //Validate frames that have preset sizes //Pack frames that have useful preferred size info, //e.g. from their layout if (packFrame) { frame.pack(); } else { frame.validate(); } //Center the window Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); Dimension frameSize = frame.getSize(); if (frameSize.height > screenSize.height) { frameSize.height = screenSize.height; } if (frameSize.width > screenSize.width) { frameSize.width = screenSize.width; } frame.setLocation((screenSize.width - frameSize.width) / 2, (screenSize.height - frameSize.height) / 2); frame.setVisible(true); } /**Main method*/ public static void main(String[] args) { try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch(Exception e) { e.printStackTrace(); } new Application1(); } } package untitled1; import java.awt.*; import java.awt.event.*; import javax.swing.*; public class FirstApplication extends JFrame { JPanel contentPane; BorderLayout borderLayout1 = new BorderLayout(); /**Construct the frame*/ public FirstApplication() { 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("First Application"); } /**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); } } } Такая конструкция, мне кажется, сложновата для начинающего. |
Вопрос:
Не подскажите как в Java реализовать что-то на подобии стека?
|
Ответ: Если вас интересует сам стек то есть стандартный класс Stack. |
Вопрос:
Как мне сохранить содержимое JTextArea в файл?
|
Ответ: Привожу пример метода записи в файл ниже в разделе "Программный код…". |
Программный код…
Пример сохранения содержимого текстового поля в файл
public boolean saveToFile(String namefile) { try { File file = new File (namefile); FileWriter out = new FileWriter(file); String text = jTextArea1.getText(); out.write(text); out.close(); return true; } catch (IOException e) { System.out.println("Error saving file."); } return false; }
JavaScript
Вопрос: Нужен скрипт, который будет в зависимости от типа браузера перенаправлять на ту или иную страницу.
Конкретно: если IE 5+, то url1 ; иначе url2.
|
Ответ: <html;> <head;> <script; language="JavaScript"> <!-- browserName=navigator.appName; browserVer=parseInt(navigator.appVersion); document.write(browserName); document.write(" "+browserVer); if(browserName=="Microsoft Internet Explorer" && browserVer>=4) location.href="url1" else location.href="url2" //--> </script> </head> </html> |
Вопрос:
При открытие окна необходимо управлять его параметрами. |
Ответ: Этого сделать нельзя, так как это будет уже вторжение в пространство пользователя, что недопустимо. Представьте что каждый сайт будет настраивать ваш броузер под себя, убирать вашу любимую панель инструментов, адресную строку и все прочие удобства. Да и для перехода на другой сайт вам нечего не останется как открывать новое окно броузера. |
Вопрос: Я очень хотел бы узнать коды самого банального, простого Ticker или что-то подобное название, окошечко в котором время от времени меняется текст!!!
|
Ответ: Код бегущей строки вы можете посмотреть тут или тут Для прокрутки страницы не требуется использование JavaScript это делается средствами HTML: В начале страницы помещаем ссылку <a; name=”top”></a> И при нажатии на ссылку в конце документа ссылаемся на ссылку с именем top: <a; href="#top">Наверх</a> <html;> <body;> <a; name=”top”></a> <p;> Текст </p> <p;> Текст </p> ............. <p;> Текст </p> <p;> Текст </p> <a; href="#top">Наверх</a> </html> </body> |
Вопрос: Я хотелбы заняться изучением Javascript? Но незнаю на чем его
писать (всысле редактор) и подскажи пожалуйста, что мне как для
новичка нужно скачать из сети.
|
Ответ: Писать скрипты можно в любом HTML-редакторе. Я например пользуюсь HTML-редактором 1st Page 2000 или пишу в блокноте. Для новичков вполне подойдёт ВВЕДЕНИЕ В JAVASCRIPT ДЛЯ МАГА © 1996, 1997 Стефан Кох (Stefan Koch) |
Вопрос: Нет ли у вас скрипта отсчитывающего количество
оставшихся дней до какой-либо даты?
|
Ответ: Вот посмотрите скрипт отсчитывающий количество дней оставшихся до нового года. |
Вопрос:
Надо по кнопке открывать новое окно и из окна родителя закидывать в новое окно текст. <SCRIPT; language=JavaScript1.2> function newwin(dummy, w, h) { myWin=window.open("","nz","width=" + w + ",height=" + h + ",status=no,toolbar=no,menubar=no,scrollbars=yes,resizable=yes"); } </SCRIPT>есть текст допустим "вперед" и я так открываю новое окно: <a; href="zakaz.htm" onclick="newwin('вперед' , 400, 520 )" target="nz"> <img; border="0" src="img/bott.gif" width="104" height="22"></a>этот текст мне надо записать в поле "T1" нового окна <form; name="form1"><input; type="text" name="T1" size="30"></form>Подскажите, как мне это сделать? Михаил |
Ответ: Вот посмотрите реализацию вашей задачи. |
Вопросы присылайте на E-mail
[email protected] с пометкой "Вопрос по Java".
Жду вопросов и предложений.
Подписаться на эту рассылку и посмотреть архив можно тут /subs/subs.html