Java programming выпуск 23-й
Здравствуйте дорогие читатели!
По вашим просьбам, наконец, на сайте открылся форум!!!
Приглашаю вас посетить форум, задать свои вопросы и ответить на вопросы других.
Начинающим
Классы (продолжение)
Совмещение методов
Язык Java позволяет создавать несколько методов с одинаковыми именами, но с разными списками параметров. Такая техника называется совмещением методов (method overloading). В качестве примера приведена версия класса Point, в которой совмещение методов использовано для определения альтернативного конструктора, который инициализирует координаты х и у значениями по умолчанию (-1).
class Point { int х, у; Point(int х, int у) { this.x = х; this.у = у; } Point() { х = -1; у = -1; } } class PointCreateAlt { public static void main(String args[]) { Point p = new Point(); System.out.println("x = " + p.x + " у = " + p.y); } }
В этом примере объект класса Point создается не при вызове первого конструктора, как это было раньше, а с помощью второго конструктора без параметров. Вот результат работы этой программы:
х = -1 у = -1
ЗАМЕЧАНИЕ
Решение о том, какой конструктор нужно вызвать в том или ином случае, принимается в соответствии с количеством и типом параметров, указанных в операторе new. Недопустимо объявлять в классе методы с одинаковыми именами и сигнатурами. В сигнатуре метода не учитываются имена формальных параметров учитываются лишь их типы и количество.
this в конструкторах
Очередной вариант класса Point показывает, как, используя this и совмещение методов, можно строить одни конструкторы на основе других.
class Point { int х, у; Point(int х, int у) { this.x = х; this.у = у; } Point() { this(-1, -1); } }
В этом примере второй конструктор для завершения инициализации объекта обращается к первому конструктору.
Методы, использующие совмещение имен, не обязательно должны быть конструкторами. В следующем примере в класс Point добавлены два метода distance. Функция distance возвращает расстояние между двумя точками. Одному из совмещенных методов в качестве параметров передаются координаты точки х и у, другому же эта информация передается в виде параметра-объекта Point.
class Point { int х, у; Point(int х, int у) { this.x = х; this. y = y; } double distance(int х, int у) { int dx = this.x - х; int dy = this.у - у; return Math.sqrt(dx*dx + dy*dy); } double distance(Point p) { return distance(p.x, p.y); } } class PointDist { public static void main(String args[]) { Point p1 = new Point(0, 0); Point p2 = new Point(30, 40); System.out.println("p1 = " + p1.x + ", " + p1.y); System.out.println("p2 = " + p2.x + ", " + p2.y); System.out.println("p1.distance(p2) = " + p1.distance(p2)); System.out.println("p1.distance(60, 80) = " + p1.distance(60, 80)); } }
Обратите внимание на то как во второй фороме метода distance для получения результата вызывается его первая форма. Ниже приведен результат работы этой программы:
р1 = 0, 0
р2 = 30, 40
р1.distance(p2) = 50.0
p1.distance(60, 80) = 100.0
Тема "на заказ"
Продолжая разговор о проекте векторного редактора
Продолжая разговор о проекте векторного редактора, начатый в 21-ом номере, хотелось бы попросить вас помочь придумать название проекта.
Дело в том, что сейчас идет работа по разработке раздела сайта посвященному этому проекту и необходимо придумать название чтобы связать все во едино.
Вот предлагаю вашему вниманию два варианта предложенных читателями:
-
По аналогии с тем, что эмблемой Линюкса в какой-то степени считается пингвин, в качестве символа можно принять симпатичную собачку (только не слащавую болонку). Во-первых собака - друг человека, а во-вторых, из аббревиатуры DOG можно при желании получить разные варианты - например (не уверена в грамматической правильности и точности перевода, но все же) - Design(er) Of Graphics, Dayly Our Graphics, Draw Own Graph, Developer Of Graphis.
Елена -
У меня возникла сумасшедшая идея названия: GROLD (Graphic Objects Library for Developers). Можно как-нибудь модифицировать.
Дмитрий
Вопрос - ответ
В прошлом номере задавался вопрос:
Как переменной присвоить значение ровное текущему году. Другими словами как системный год узнать?
Артем Золочевский.
Vitaly Landa прислал свой вариант ответа и немного меня покритиковал:)
Я считаю, что это не совсем правильный ответ.
Во-первых, класс Date использовать не желательно, так как класс Date почти полностью является deprecated, а следовательно он не рекомендуем к "употреблению". И оставлен он в основном для поддержки предыдущих версий. Вместо Date следует пользоваться классом Calendar.
А во-вторых, вопрос состоял в том, как узнать системный год? А для этого следует воспользоваться классом System или Runtime.
И тогда ответом на вопрос Артема будет:
Calendar calendar = Calendar.getInstance(); calendar.setTimeInMillis( System.currentTimeMillis() ); Caledar calendar = Calendar.getInstance( new Date( System.currentTimeMillis() ) ); int year = calendar.get( Calendar.YEAR );
Вопрос: Существует некоторый апплет Interf. Необходимо к нему прикрепить компонент, реализующий секундомер. Его заголовок class Timer extends java.awt.Canvas implements Runnable { ... } Когда добавляю этот компонент к апплету делаю следующее: class Interf extendes Applet { Timer t; Thread timer; ... public void init() { setLayout(new GridLayout(1, 1)); t = new Timer(); add(t); timer = new Thread(t); } ... public void start() { timer.start(); } ... } Все конечно хорошо, Timer работает как надо. Однако, он закрашивает всю область и моего апплета не видно. Но это еще не весь вопрос. Я понимаю можно использовать менеджер компоновки, например, setLayout(new GridLayout(2, 1)); и наш Timer будет находиться в первой строке. И тем самым не будет перекрывать апплет. НО, НУЖНО СДЕЛАТЬ ТАК, ЧТОБЫ TIMER РАСПОЛАГАЛСЯ В ТОМ МЕСТЕ, ГДЕ Я ПОЖЕЛАЮ И ИМЕЛ ТЕ РАЗМЕРЫ, КОТОРЫЕ ОПЯТЬ ЖЕ Я ПОЖЕЛАЮ. Что посоветуете? Анатолий |
Вопрос: Не пойму в чем дело. В JBuilder7 делаю New...->Application ... и получаю проект с формой. Перехожу на вкладку Design. Далее, беру JButton кладу на форму. Пытаюсь взятся мышкой за уголки JButton, чтобы сузить площадь кнопки - не получается (Я пытаюсь перелесть с Delphi на JBuilder и знаю что можно мышкой изменять размеры и растановку визуальных компонентов прямо на форме). Получается только перетаскивать кнопку с положения Center в North,South,East,West. А как же визуально изменять размеры компонентов. Эта проблема касается и всех остальных компонентов. Николай |
Ответ: Это просто у вас менеджер размещения такой стоит.:) Поставьте в layout значение null и размещайте компоненты как хотите. В коде это можно сделать: setLayout(null); button.setLocation(x,y); button.setSize(w,h);либо button.setBounds(new Rectangle(x, y, w, h)); |
Вопрос:
Я работаю в сети и хочу, чтобы когда пользователь
заходил на мою страницу было бы приветствие вроде " Добро пожаловать
на страницу <имя компа>". Просто много думал как мне узнать имя компа
зашедшего на сайт, но не получилось. Может вы мне поможете, буду очень рад.
|
Ответ: Можно сделать апплет и в нем вывести строку: String a=InetAddress.getLocalHost().getHostName(); |
Вопрос:
Каким образом в JAVA можно вывести на печать документ.
|
Ответ: Есть класс PrintJob из класса Toolkit. Мы рассматривали пример печати в 12, 13 и 14 выпусках. |
Вопрос:
Подскажите пожалуйста, почему в скачанной версии JDK (
j2re-1_4_1_01-windows-i586-i.exe ), в каталоге BIN нет компилятора javac,
наверное от этого javac у меня не идет? Система вин2кей
|
Ответ: Втом то и дело что это не JDK (SDK), а Java 2 Runtime Environment, т.е. вы скачали только виртуальную машину. Вам необходимо скачать пакет для разработчика j2sdk-1_4_1_01-windows-i586 |
Вопрос:
Пытаюсь сварганить самый простой swing-апплет.
У меня этот паразит никак не хочет к внешним ресурсам обращаться... Т.е. всякие элементы управления располагает нормально, а картинку вывести - ни в какую.
|
Ответ: Вот вариант, работает везде безотказно. |
Вопрос:
Можно ли вообще организовывать базы данных с помощью Java-сервлетов на бесплатных хостингах (например, на narod.ru)?
|
Ответ: На бесплатном хостинге нет, я не знаю бесплатных с БД, да и еще с поддержкой Java. |
Вопрос:
При подписывании JAR файлов кто именно будет выдавать мне сертификат?
Мне как-то надо связаться с Verisign ?
|
Ответ:
Можете сами создать свой сертификат, но вопрос в том будут ли доверять вашему сертификату конечные пользователи. |
Вопрос:
У меня вопросы насчет привилегий апплетов. |
Ответ: Какие права даны апплету смотрите в таблице документации java.sun.com/jdk1.3/docs/tooldocs/win32/jarsigner.html. |
Вопрос:
Почему на вашем сайте не используется технология JSP,
а используется PHP или CGI ? Перспективно ли JSP ?
|
Ответ:
Перспективно ли JSP? Я считаю что да. А почему на сайте использую php? Неохота переезжать к другому хостеру, да и кто знает хорошего с поддержкой Java. Да и обещают вроде как реализовать поддержку в ближайшем будущем. |
Программный код…
Сегодня в приведенном примере постараюсь ответить сразу на несколько вопросов:
- Как присвоить кнопке горячею клавишу.
- Как объединить JRadioButton в группу.
- Как сменить LookAndFeel.
- Как нескольким кнопкам присвоить один обработчик событий.
import java.awt.*; import java.awt.event.*; import javax.swing.*; public class SimpleExample extends JPanel { static JFrame frame; static String metal= "Metal"; static String metalClassName = "javax.swing.plaf.metal.MetalLookAndFeel"; static String motif = "Motif"; static String motifClassName = "com.sun.java.swing.plaf.motif.MotifLookAndFeel"; static String windows = "Windows"; static String windowsClassName = "com.sun.java.swing.plaf.windows.WindowsLookAndFeel"; JRadioButton metalButton, motifButton, windowsButton; public SimpleExample() { // Создаем кнопки JButton button = new JButton("Hello, world"); button.setMnemonic('h'); //задаем горячею клавишу metalButton = new JRadioButton(metal); metalButton.setMnemonic('o'); //каждой кнопке устанавливаем свою команду metalButton.setActionCommand(metalClassName); motifButton = new JRadioButton(motif); motifButton.setMnemonic('m'); motifButton.setActionCommand(motifClassName); windowsButton = new JRadioButton(windows); windowsButton.setMnemonic('w'); windowsButton.setActionCommand(windowsClassName); // Объединяем кнопки в группу ButtonGroup group = new ButtonGroup(); group.add(metalButton); group.add(motifButton); group.add(windowsButton); // Регистрируем обработчик событий для кнопок RadioListener myListener = new RadioListener(); metalButton.addActionListener(myListener); motifButton.addActionListener(myListener); windowsButton.addActionListener(myListener); //Добавляем кнопки add(button); add(metalButton); add(motifButton); add(windowsButton); } /** Класс обработчика событий для кнопок */ class RadioListener implements ActionListener { public void actionPerformed(ActionEvent e) { //для каждой кнопки получаем свою команду String lnfName = e.getActionCommand(); try { //устанавливаем LookAndFeel UIManager.setLookAndFeel(lnfName); //обновляем форму SwingUtilities.updateComponentTreeUI(frame); frame.pack(); } catch (Exception exc) { //на случай ошибки при смене LookAndFeel //делаем кнопку соответствующею этому LookAndFeel //не активной JRadioButton button = (JRadioButton)e.getSource(); button.setEnabled(false); //обновляем состояние кнопок updateState(); System.err.println("Could not load LookAndFeel: " + lnfName); } } } //функция обновления состояния кнопок public void updateState() { String lnfName = UIManager.getLookAndFeel().getClass().getName(); if (lnfName.indexOf(metal) >= 0) { metalButton.setSelected(true); } else if (lnfName.indexOf(windows) >= 0) { windowsButton.setSelected(true); } else if (lnfName.indexOf(motif) >= 0) { motifButton.setSelected(true); } else { System.err.println("SimpleExample is using an unknown L&F;: " + lnfName); } } public static void main(String s[]) { SimpleExample panel = new SimpleExample(); frame = new JFrame("SimpleExample"); frame.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) {System.exit(0);} }); frame.getContentPane().add("Center", panel); frame.pack(); frame.setVisible(true); panel.updateState(); } }
JavaScript
В прошлом номере был вопрос :
Подскажите пожалуйста можно ли сделать на javascript чтобы отрисовывалась одна таблица и по нажатию на определенную кнопку или ссылку
отображалась либо скрывалась строка(строки) в таблице
Alex
Я дал ответ, что мне не видится это возможным.
Пришло с десяток писем как это сделать, но половина из предложенных методов не работало или были. Самый простой и правильный способ прислал Дмитрий. Поправив его совсем чуть-чуть вот что получилось:
<html;> <table; border=0 cellspacing=0 cellpadding=0 width=50%> <tr;><td;>1;</td></tr> <tr;><td; onmouseover="this.style.cursor='hand'" bgcolor="cccccc" onclick="Ne.display=(Ne.display==''?'none':'')" id="ne"> 2</td></tr> <tr;><td;>3;</td></tr> <tr;><td;>4;</td></tr> <tr;><td;>5;</td></tr> </table> <script;>Ne;=document.all.ne.style;</script> </html>
Работает только в IE4-6.
Вопрос:
Как из JavaScript вызвать метод апплета и под какиим браузерами это работает?
|
Ответ: document.applets.имя_апплета.метод(параметры)Должно работать во всех современных браузерах. |
Вопрос: Как можно узнать pазмеp каpтинки?
|
Ответ:
|
Вопрос: Как мне узнать какая клавиша была нажата на клавиатуре?
|
Вопрос:
Как мне вывести сообщение при нажатии определенной клавиши?
|
Ответ:
Вот посмотрите пример определения нажатой клавиши |
Вопросы присылайте на E-mail
[email protected] с пометкой "Вопрос по Java".
Жду вопросов и предложений.