Архив Java programming
Выпуск 19-й
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



Узнай о чем ты на самом деле сейчас думаешь


