Java programming выпуск 25-й
Здравствуйте дорогие читатели!
После полуторамесячного молчания, наконец-то я смог выпустить в свет этот номер. Но зато и номер получился приличный по объему!
Так вот у меня возник следующий вопрос к вам, который я надеюсь вы не оставите без внимания.
Как дальше выпускать рассылку? Большим объемом, но раз в месяц или маленьким объемом, но почаще?
Может необходимо открыть еще какой либо раздел?
Добавить интерактивности, проводить различные опросы, тесты?
Может юмора добавить или еще чего?
Выберите свой вариант, и если нетрудно оставьте свой комментарий или пожелания.
Также можете оставить свой отзыв или предложение в форуме, где открыт специальный раздел для обсуждения дальнейшего развития сайта.
Начинающим
Классы (продолжение)
Замещение методов
Новый подкласс Point3D класса Point наследует реализацию метода distance своего суперкласса. Проблема заключается в том, что в классе Point уже определена версия метода distance(int х, int у), которая возвращает обычное расстояние между точками на плоскости. Мы должны заместить (override) это определение метода новым, пригодным для случая трехмерного пространства. В следующем примере проиллюстрировано и совмещение (overloading), и замещение (overriding) метода distance.
class Point
{
int х, у;
Point(int х, int у)
{
this.x = х;
this.у = у;
}
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.х, p.y);
}
}
class Point3D extends Point
{
int z;
Point3D(int х, int y, int z)
{
super(x, y);
this.z = z;
}
double distance(int х, int y, int z)
{
int dx = this.x - х;
int dy = this.y - y;
int dz = this.z - z;
return Math.sqrt(dx*dx + dy*dy + dz*dz);
}
double distance(Point3D other)
{
return distance(other.х, other.y, other.z);
}
double distance(int х, int y)
{
double dx = (this.x / z) - х;
double dy = (this.у / z) - y;
return Math.sqrt(dx*dx + dy*dy);
}
}
class Point3DDist
{
public static void main(String args[])
{
Point3D p1 = new Point3D(30, 40, 10);
Point3D p2 = new Point3D(0, 0, 0);
Point p = new Point(4, 6);
System.out.println("p1 = " + p1.x + ", " + p1.y + ", " + p1.z);
System.out.println("p2 = " + p2.x + ", " + p2.y + ", " + p2.z);
System.out.println("p = " + p.x + ", " + p.y);
System.out.println("p1.distance(p2) = " + p1.distance(p2));
System.out.println("p1.distance(4, 6) = " + p1.distance(4, 6));
System.out.println("p1.distance(p) = " + p1.distance(p));
}
}
Ниже приводится результат работы этой программы:
С:\> Java Point3DDist
p1 = 30, 40, 10
р2 = 0, 0, 0
р = 4, 6
p1.distance(p2) = 50.9902
p1.distance(4, 6) = 2.23607
p1.distance(p) = 2.23607
Обратите внимание — мы получили ожидаемое расстояние между трехмерными точками и между парой двумерных точек. В примере используется механизм, который называется динамическим назначением методов (dynamic method dispatch).
Динамическое назначение методов
Давайте в качестве примера рассмотрим два класса, у которых имеют простое родство подкласс / суперкласс, причем единственный метод суперкласса замещен в подклассе.
class A
{
void callme()
{
System.out.println("Inside A's callrne method");
}
}
class В extends A
{
void callme()
{
System.out.println("Inside B's callme method");
}
}
class Dispatch
{
public static void main(String args[])
{
A a = new B();
a.callme();
}
}
Обратите внимание — внутри метода main мы объявили переменную а класса А, а проинициализировали ее ссылкой на объект класса В. В следующей строке мы вызвали метод callme. При этом транслятор проверил наличие метода callme у класса А, а исполняющая система, увидев, что на самом деле в переменной хранится представитель класса В, вызвала не метод класса А, а callme класса В. Ниже приведен результат работы этой программы:
С:\> Java Dispatch
Inside B's calime method
Программистам Delphi / C++ следует отметить, что все Java по умолчанию являются виртуальными функциями (ключевое слово virtual).
Рассмотренная форма динамического полиморфизма времени выполнения представляет собой один из наиболее мощных механизмов объектно-ориентированного программирования, позволяющих писать надежный, многократно используемый код.
Тема "на заказ"
Вывод сжатых HTML документов из сервлета
Как-то раз мне попался довольно интересный пример осуществления вывода сжатого HTML документа, генерируемого сервлетом. Что, по утверждению его автора, позволяет уменьшать траффик в среднем на 60-80%.
Решение смотрите в коде - вроде бы всё понятно. Замечание - этот пример сам определяет, поддерживает ли браузер сжатые документы.
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.zip.*;
public class ZipServlet extends HttpServlet
{
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException
{
response.setContentType("text/html");
String encodings = request.getHeader("Accept-Encoding");
String encodeFlag = request.getParameter("encoding");
PrintWriter out;
if((encodings != null)&&
(encodings.indexOf("gzip") != -1)&&
!"none".equals(encodeFlag))
{
OutputStream out1 = response.getOutputStream();
out = new PrintWriter(new GZIPOutputStream(out1), false);
response.setHeader("Content-Encoding", "gzip");
}
else out = response.getWriter();
out.println("writing HTML document"); //пишем тело документа
out.close();
}
}
JNI: взаимодействие Java с другими языками
На сайте появились четыре статьи по данной теме:
Переход к реализованной IBM 64-разрядной JVM для 64-разрядного издания Windows 2000
JNI: взаимодействие Java с другими языками
C++ и Java: совместное использование
Совместная отладка Java и C/C++ кода
Вопрос - ответ
Вопрос:
Как сделать чтобы при открытии окна в таблице показывались не первые строки а последние?
|
Ответ:
С учетом того что таблица находится в JScrollPane.
|
Вопрос:
Можно ли проигрывать звуки в java 1.1.* в приложениях (не Applet-ах и без использования Swing)?
|
Ответ: Я делаю следующим образом
|
Вопрос:
Как мне в Java округлить число типа double или float с заданной точностью или просто отбросить дробную часть, например, начиная с 3-го знака после запятой?
|
Ответ: Стандартной функции не припомню но вот один вариант:
где dz -количество знаков после запятой.
|
Вопрос:
Начал jsp изучать. Вот такой вопрос : |
Ответ: В enter.jsp:
|
Вопрос:
1. Можно ли как-нибудь, в SWING-приложении (или апплете) рисовать не только компоненты, а, скажем, в некотором JPane отобралить линию, круг, или еще какой примитив, как в обычном апплете? Если да, то каким макаром? |
Ответ: 1.Если в самом компоненте то
Если из другого компонента хочешь нарисовать на panel то так
Но при перерисовке компонента во втором варианте линия исчезнет.2. Нет в том же компоненте
|
Вопрос: Как работать с куками из сервлета?
|
Ответ: Вот посмотрите небольшой пример по установке, чтению и удалению кукисов. |
Вопрос:
Подскажите мне как сравнить два объекта и отсортировать их?
Есть интерфейс Comparable, но я так и не понял как все это работает.
|
Ответ:
Что бы разрешить этот вопрос ознакомьтесь с небольшими статьями:
|
Вопрос: Расскажите немного о библиотеках custom тэгов. |
Вопрос:
Где должны хранится файлы картинок в MIDlete?
|
Ответ:
Например у вас есть jar файл вашего мидлета:
И в нем у вас есть поддиректории: И к примеру поддиректория "icons" где лежат картинки (image1.png, image2.png...), тогда что бы создать объект Image вы в мидлете пишите следующий код:
|
Вопрос:
Как узнать ситемные свойства ОС? Версию например?
|
Ответ: Ниже приведен код, который выводит на консоль все! системные свойства о которых знает JVM и их значения, после знака "=".
|
Вопрос: Не могу понять, как вывести простое диалоговое окно с кнопкой "ОК" и "Отмена"? Есть ли функция типа MessageBox в Джаве? |
Ответ: JOptionPane.showConfirmDialog(); |
Вопрос: Vожно ли уменьшить размеры фонтов по умолчанию. Дмитрий |
Ответ: Да, это можно сделать с помощью look and feel. В классе UIManager есть метод put который служит для того, что бы устанавливать параметры того как будет веглядеть какой-либо визуальный компонент. Например для того, что бы изменить шрифт которым отрисовываются статический текст (Label), надо создать объект класса Font и написать что-то вроде:
Для изменения размера шрифта в меню:
или
|
Вопрос:
|
Ответ:
|
Программный код…
Рассмотрим пример создания "круглой" SWING кнопки (http://java.sun.com/jdc/TechTips/index.html).На основе этого примера можно создать кнопки и других форм.
import java.awt.*;
import java.awt.geom.*;
import javax.swing.*;
public class RoundButton extends JButton
{
public RoundButton(String label)
{
super(label);
Dimension size = getPreferredSize();
// Делаем нашу кнопочку вписанной в квадрат.
// Дабы не получился у нас овал:)
size.width = size.height = Math.max(size.width, size.height);
setPreferredSize(size);
// Не закрашиваем кнопочку.
setContentAreaFilled(false);
}
// Рисуем нашу кнопочку.
protected void paintComponent(Graphics g)
{
if (getModel().isArmed())
{
// Устанавливаем цвет по умолчанию.
g.setColor(Color.lightGray);
}
else
{
g.setColor(getBackground());
}
// Рисуем окружность.
g.fillOval(0, 0, getSize().width-1, getSize().height-1);
// Прорисовываем сам JButton.
super.paintComponent(g);
}
// Рисуем бордюр кнопочки.
protected void paintBorder(Graphics g)
{
g.setColor(getForeground());
g.drawOval(0, 0, getSize().width-1, getSize().height-1);
}
// Определяем принадлежность точки к нашей кнопочки.
Shape shape;
public boolean contains(int x, int y)
{
// Если кнопка изменилась в размере
// создаем новый объект shape.
if (shape == null ||!shape.getBounds().equals(getBounds()))
{
shape = new Ellipse2D.Float(0, 0, getWidth(), getHeight());
}
// Возвращаем true если точка принадлежит
// и false если не принадлежит кнопке.
return shape.contains(x, y);
}
// Тестируем полученную кнопку.
public static void main(String[] args)
{
// Создаем кнопку с надписью "Jackpot".
JButton button = new RoundButton("Jackpot");
button.setBackground(Color.green);
// Создаем фрейм и помещаем в него кнопку.
JFrame frame = new JFrame();
frame.getContentPane().setBackground(Color.yellow);
frame.getContentPane().add(button);
frame.getContentPane().setLayout(new FlowLayout());
frame.setSize(150, 150);
frame.setVisible(true);
}
}
JavaScript
Немного отойду от темы JS. Наверняка вы слышали или читали, а может и сами приводили доводы о полезности или, наоборот, о вредности использования фреймов. Но скорее всего вам встречались чаще отрицательные отзывы. Сегодня я предлагаю вам ознакомится с одним интересным мнением неизвестного автора, который приводит аргументы в пользу фреймов.
Вопрос: Как сделать так, чтобы при наведении на ячейку таблицы она выделялась бы бордюром из, скажем, одного пикселя. Вариант со встроенными таблицами не подходит (ведь там нужно указывать цвет фона ячейки, а он должен быть прозрачным, чтобы смог отражать фон таблицы, в которую вложена данная). Все это применяется в меню сайта.
По идее, нужно по свойству onMouseOver изменять стиль ячейки, но как это сделать???
|
Ответ: Вот посмотрите мое решение данной задачи. |
Вопрос:
Как определить наличие plugin-а (jre 1.N.i, где N >= 2) в IE с помощью JS?
|
Ответ: помощью JavaScript такое сделать нельзя, но есть выход с использованием апплета. |
Вопрос:
Здравствуйте !
Как с помощью JS определить есть ли в броузере пользователя, который зашел на мой сайт , Flash Player.
И какой он версии?
|
Ответ: Посмотрите вот этот пример. |
Вопрос:
Можете ли подсказать где можно найти большую коллекцию скриптов и информации по JavaScript?
|
Ответ: Я и пытаюсь собрать коллекцию скриптов на сайте JavaPortal.ru в разделе JavaScript: Примеры |
Вопрос:
Мне нужно создать задержку времени, но setTimeout() не подходит, так как при этом выполняются другие функции
|
Ответ: Воспользуйтесь следующей функцией
|
Вопрос:
На всех сайтах с обоями приходится с картинками грузить кучу всяких банеров и прочей чепухи. Можно ли как ни будь вытащить только одни картинки??
|
Ответ:
Ну и задали вы мне задачку:) Конечно можно!
Генерите страничку с ссылками на все картинки и потом закачиваете их любым менеджером закачек (я пользуюсь FlashGet).
|
Вопрос: Как отключить кэширование страниц в браузере с помощью Javascript? |
Ответ: Вообще то это делается с помощью HTML тэга meta:
|
Вопрос: Как проверить с какова адреса(WWW) пришел посетитель и если не с заданного то закрыть страницу.(javascript) |
Ответ:
|
Вопросы присылайте на E-mail
[email protected] с пометкой "Вопрос по Java".
А лучше задавайте их в форуме.
Жду вопросов и предложений.