Логин:   Пароль:




Новости
Рассылки
Форум
Поиск


Java
- Апплеты
- Вопрос-ответ
- Классы
- Примеры
- Руководства
- Статьи
- IDE
- Словарь терминов
- Скачать

Мобильная Java
- Игры
- Примеры
- Статьи
- WAP, WML и пр.

JavaScript
- Вопрос-ответ
- Примеры
- Статьи

Веб-мастеринг
- HTML
- CSS
- SSI

Разминка для ума
Проекты
Книги
Ссылки
Программы
Юмор :)




Rambler's Top100

РассылкиАрхив 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 сайтов с минимальной статистикой.

Так как размер программы получился не маленький и не уместился в лимит рассылки привожу ссылку на исходные коды.

Вопрос - ответ

Вопрос: Перспективы ява.
Мне кажется, что ява-апплеты стали практически анахронизмом. Их напрочь вытеснили флеш-ролики, JS-заменители, серверные скрипты .... Зато всяческие серверные вариации стабильно набирают силу. И единственным сдерживающим фактором является лишь хостинг. Может стоит всё-таки рассказать о JSP, сервлетах, JBoss, Cocoon, JDBC и прочих штуках.

Иван

Ответ:

Да, что касается апплетов ситуация близка к этому. Хотя я довольно часто встречаю, на зарубежных сайтах, различные решения реализованные с помощью апплетов, та же анимация может быть реализована апплетом с меньшим размером файла, чем во флеш. (А вообще то я сторонник SVG формата).
Относительно JBoss, Cocoon, JDBC, сервлетов, JSP не хочется забегать вперед да и просто пока нет времени, так как данные темы не уместятся в один номер рассылки, хотя можете посмотреть небольшие статейки по JSP и JDBC.
Может у кого есть интересные материалы по данным темам, присылайте!

Вопрос: Имеется ли какая ни будь возможность, как например на Визуальном Васике, перебирать элементы управления на панели, анализировать их на принадлежность к определенному классу (например Button) и изменять их свойства (например setBackground(Color.green)).
bob

Ответ: Один из вариантов привожу в "Программном коде".

Вопрос: Скажите пожалуйста, как из апплета сказать броузеру перейти на какую-нибудь страничку?

Ответ:


getAppletContext().showDocument(URL);

URL- ссылка на страничку.

Вопрос: Как сделать scroll'ер на Джава
Александр

Ответ: Используйте ScrollPane или JScrollPane

Программный код…



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


Дэвид Флэнаган
"Java в примерах. Справочник"
Подробнее>>
Заказать>>


Е. Е. Аккуратов
"Знакомьтесь: Java. Самоучитель"
Подробнее>>
Заказать>>

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


[an error occurred while processing this directive]



Apache Struts 2.0.11
Apache MyFaces Trinidad Core 1.2.3.
Sun переводит мобильные устройства с Java ME на Java SE
Хакерская атака!



Выпуск 29-й
Выпуск 28-й
Выпуск 27-й
Выпуск 26-й
Выпуск 25-й
Выпуск 24-й
Выпуск 23-й
Выпуск 22-й
Выпуск 21-й
Выпуск 20-й
Выпуск 19-й
Выпуск 18-й
Выпуск 17-й
Выпуск 16-й
Выпуск 15-й
Выпуск 14-й
Выпуск 13-й
Выпуск 12-й
Выпуск 11-й
Выпуск 10-й
Выпуск 9-й
Выпуск 8-й
Выпуск 7-й
Выпуск 6-й
Выпуск 5-й
Выпуск 4-й
Выпуск 3-й
Выпуск 2-й
Выпуск 1-й