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




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


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

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

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

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

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




Rambler's Top100

РассылкиАрхив Java programmingВыпуск 15-й

Здравствуйте дорогие читатели!

У нас новость сайт JavaPortal переехал на домен второго уровня javaportal.ru

Приглашаем авторов к опубликованию материалов по соответствующей тематике у нас на сервере.

Присылайте нам

  • cтатьи
  • обзоры
  • переводы
  • скрипты
  • программные коды
По вопросам публикации материалов обращайтесь по адресу [email protected]

Содержание

1.Начинающим
2.Тема "на заказ"
3.Вопрос - ответ
4.Программный код…
5.JavaScript

Начинающим

Операторы быстрой оценки логических выражений (short circuit logical operators)

Существуют два интересных дополнения к набору логических опера­торов. Это — альтернативные версии операторов AND и OR, служащие для быстрой оценки логических выражений. Вы знаете, что если первый операнд оператора OR имеет значение true, то независимо от значения второго операнда результатом операции будет величина true. Аналогично в случае оператора AND, если первый операнд — false, то значение вто­рого операнда на результат не влияет — он всегда будет равен false. Если вы в используете операторы && и || вместо обычных форм & и |, то Java не производит оценку правого операнда логического выражения, если ответ ясен из значения левого операнда. Общепринятой практикой является использование операторов && и || практически во всех случаях оценки булевых логических выражений. Версии этих операторов & и | применяются только в битовой арифметике.

Тернарный оператор if-then-else

Общая форма оператора if-then-else такова:
выражение1? выражение2: выражениеЗ

В качестве первого операнда — «выражение1» — может быть исполь­зовано любое выражение, результатом которого является значение типа boolean. Если результат равен true, то выполняется оператор, заданный вторым операндом, то есть, «выражение2». Если же первый операнд paвен false, то выполняется третий операнд — «выражениеЗ». Второй и третий операнды, то есть «выражение2» и «выражениеЗ», должны воз­вращать значения одного типа и не должны иметь тип void.

В приведенной ниже программе этот оператор используется для про­верки делителя перед выполнением операции деления. В случае нулевого делителя возвращается значение 0.


class Ternary
{ 
 public static void main(String args[])
 { 
  int a = 42; 
  int b = 2; 
  int c = 99; 
  int d = 0; 
  int e = (b == 0) ? 0 : (a / b); 
  int f = (d == 0) ? 0 : (c / d); 
  System.out.println("a = " + a); 
  System.out.println("b = " + b); 
  System.out.println("c = " + c); 
  System.out.println("d = " + d); 
  System.out.println("a / b = " + e); 
  System.out.println("c / d = " + f); 
 }
} 

При выполнении этой программы исключительной ситуации деления на нуль не возникает и выводятся следующие результаты:


С: \>java Ternary 
а = 42 
b = 2 
с = 99 
d = 0 
a / b = 21 
с / d  = 0 

Приоритеты операторов

В Java действует определенный порядок, или приоритет, операций. В элементарной алгебре нас учили тому, что у умножения и деления более высокий приоритет, чем у сложения и вычитания. В программировании также приходится следить и за приоритетами операций. В таблице ука­заны в порядке убывания приоритеты всех операций языка Java.

cellSpacing="0" cellpading="0"
Высший
() [] .
~ !
* / %
+ -
>> >>> <<
> >= < <=
= !=
&
^
|
&&
||
?:
= op=
Низший

В первой строке таблицы приведены три необычных оператора, о которых мы пока не говорили. Круглые скобки () используются для явной установки приоритета. Квадратные скобки [] используются для индексирования переменной-массива. Оператор . (точка) использует­ся для выделения элементов из ссылки на объект.

Явные приоритеты

Поскольку высший приоритет имеют круглые скобки, вы всегда мо­жете добавить в выражение несколько пар скобок, если у вас есть со­мнения по поводу порядка вычислений или вам просто хочется сделать свои код более читабельным.

а >> b + 3

Какому из двух выражений, а >> (b + 3) или (а >> b) + 3, соответствует первая строка? Поскольку у оператора сложения более высокий приоритет, чем у оператора сдвига, правильный ответ — а>> (b + а). Так что если вам требуется выполнить операцию (а>>b)+ 3 без скобок не обойтись.

Тема "на заказ"

Многопоточность

Сегодня уже нет необходимости объяснять, что такое многопоточность. Все современные операционные системы, способны работать в многопоточном режиме, повышая общую производительность системы за счет эффективного распараллеливания выполняемых потоков. Пока один поток находится в состоянии ожидания, например, завершения операции обмена данными с медленным периферийным устройством, другой может продолжать выполнять свою работу. Пользователи уже давно привыкли запускать параллельно несколько приложений для того чтобы делать несколько дел сразу.

Создавая приложения на языках программирования С или С++, миожно решать многие задачи, такие как анимация или работа в сети, и без использования многопоточности. Например, для анимации можно было обрабатывать сообщения соответствующим образом настроенного таймера. Приложениям Java такая методика недоступна, так как в этой среде не предусмотрено способов периодического вызова каких-либо процедур. Поэтому для решения многих задач вам просто не обойтись без многопоточности.

Процессы, потоки и приоритеты

Прежде чем приступить к разговору о многопоточности, следует уточнить некоторые термины.

Обычно в любой многопоточной операционной системе выделяют такие объекты, как процессы и потоки. Между ними существует большая разница, которую следует четко себе представлять.

Процесс

Процесс (process) - это объект, который создается операционной системой, когда пользователь запускает приложение. Процессу выделяется отдельное адресное пространство, причем это пространство физически недоступно для других процессов. Процесс может работать с файлами или с каналами связи локальной или глобальной сети.

Поток

Для каждого процесса операционная система создает один главный поток (thread ), который является потоком выполняющихся по очереди команд центрального процессора. При необходимости главный поток может создавать другие потоки, пользуясь для этого программным интерфейсом операционной системы.

Все потоки, созданные процессом, выполняются в адресном пространстве этого процесса и имеют доступ к ресурсам процесса. Однако поток одного процесса не имеет никакого доступа к ресурсам потока другого процесса, так как они работают в разных адресных пространствах. При необходимости организации взаимодействия между процессами или потоками, принадлежащими разным процессам, следует пользоваться системными средствами, специально предназначенными для этого.

Приоритеты потоков в приложениях Java

Если процесс создал несколько потоков, то все они выполняются параллельно, причем время центрального процессора (или нескольких центральных процессоров в мультипроцессорных системах) распределяется между этими потоками.

Распределением времени центрального процессора занимается специальный модуль операционной системы - планировщик. Планировщик по очереди передает управление отдельным потокам, так что даже в однопроцессорной системе создается полная иллюзия параллельной работы запущенных потоков.

Распределение времени выполняется по прерываниям системного таймера. Поэтому каждому потоку дается определенный интервал времени, в течении которого он находится в активном состоянии.

Заметим, что распределение времени выполняется для потоков, а не для процессов. Потоки, созданные разными процессами, конкурируют между собой за получение процессорного времени.

Каким именно образом?

Приложения Java могут указывать три значения для приоритетов потоков. Это NORM_PRIORITY, MAX_PRIORITY и MIN_PRIORITY.

По умолчанию вновь созданный поток имеет нормальный приоритет NORM_PRIORITY. Если остальные потоки в системе имеют тот же самый приоритет, то все потоки пользуются процессорным времени на равных правах. При необходимости вы можете повысить или понизить приоритет отдельных потоков, определив для них значение приоритета, соответственно, MAX_PRIORITY или MIN_PRIORITY. Потоки с повышенным приоритетом выполняются в первую очередь, а с пониженным - только при отсутствии готовых к выполнению потоков, имеющих нормальный или повышенный приоритет.

В следующем номере мы рассмотрим реализацию многопоточности в Java

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

Вопрос:
Можно ли кнопку Button сделать неактивной? А JButton?
Влад.

Ответ:


  JButton jButton1 = new JButton();
  jButton1.setEnabled(false);

Вопрос:
Пишет Вам Александр. Как сделать простейшую программу (консольную), запрашивающую у юзера число. Ну и впоследствии чтобы с этим числом можно что-нибудь сделать ;-) (типа cin >> или scanf в C)
Александр

Ответ:

Консольный ввод осуществляется путем считывания байтов из потока ввода. Метод read() - метод ввода самого низкого уровня. Он считывает один байт из потока и возвращает целочисленное значение. Если встречается конец потока, то метод возвращает -1.

System.in.read(b); где b массив байтов.

Следовательно нам после считывания надо массив байтов перевести в число типа int. Подумав немного я ничего лучше придумать не смог:


class Primer
{
 public static void main(String args[])
 {
  int j=0;
  int k=0;
  byte[] b=new byte[1024];
  System.out.print("Введите число:");
  try 
  {
   j=System.in.read(b);
  }
  catch (Exception e)
  {
   System.out.print("Ошибка ввода:"+e);
  }
  try 
  {
    Integer i = new Integer(new String(b,0,j-2));
    k= i.intValue();
  }
  catch (Exception e)
  {
   System.out.print("Вы ввели не число");
  }
   
  System.out.println("Число:"+k);
 }
}


Вопрос:
Кто знает как в яве под виндами максимизировать окно перед отображением. Хоть какие нибудь намеки.
Тимофей Неволин

Ответ:
В SDK 1.3. можно только минимизировать и возвращать в исходное состояние с помощью


frame.setState(JFrame.ICONIFIED)
frame.setState(JFrame.NORMAL)


В SDK 1.4. максимизировать можно следующем образом:


frame.setExtendedState(Frame.MAXIMIZED_BOTH);


Вопрос:
Помогите мне плиз в одном плевом дельце. Мне нужно отмасштабировать картинку ( *.jpg ) и вывести ее на JLabel. Я так понял, что рыть нужно в сторону java 2d. начал рыть и понял - зароюсь. Уж больно эта билиотека обширная. Konstantin Andreev

Ответ:
Можно обойтись и без java 2D привожу пример кода в разделе "Программный код…"

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


import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
class LoadImg extends JFrame
{
 JLabel jl = new JLabel();
 public LoadImg()
 {
  addWindowListener(new WindowAdapter()
   {
    public void windowClosing(WindowEvent e)
    {
     dispose();
	 System.exit(0);
    }
   });
  this.getContentPane().add(jl);
 }
 public static void main(String args[])
 {
  System.out.println("Starting LoadImg...");
  LoadImg mainFrame = new LoadImg();
  mainFrame.setSize(640, 480);
  mainFrame.setTitle("LoadImg");
  mainFrame.setVisible(true);
 }
 public void paint(Graphics g)
 {
  Image img=getToolkit().getImage("c:\\1.jpg");
  ImageIcon ii = new ImageIcon(img.getScaledInstance(640,480,Image.SCALE_FAST));
  jl.setIcon(ii);
 }
}

JavaScript

Вопрос:
Помогите пожалуста, я видел что можно сделать меню напоминающее по структуре меню Пуск в Windows. Но в тех примерах которые я видел, есть недостатки они независимы по положению а хотелось бы привязать к таблице. И кроме того в тех примерах есть сложности в добавлении элементов и клонировании целого меню. Немоглибы вы написать скрипт учитывающий все эти недостатки, если есть возможность реализовать такое с помощью JavaScript.
Дроздов Александр

Ответ:
Вот тут могу предложить посмотреть простейший текстовый вариант.
Я в данный момент работаю над созданием подобного меню навигации (с поддержкой текстового и графического варианта), так что в ближайшей рассылке я опубликую более сносный вариант меню навигации.
P.S. Правда все меню адаптированы под IE.

Вопрос:
Hужно, чтоб скрипт проверял делиться ли число без остатка скажем на 4. Как это можно сделать???

Ответ:



<script; language="JavaScript">
<!--
function checknum(num)
{
if (num%4) alert ('Hе делится')
else alert ('Делится');
}
checknum(87)
//-->
</script>

Вопрос:
Помогите пожалуйста скриптом, а то я долгое время не могу решить свою проблему. Как можно сделать, что бы при щелчке мыши не выезжало контекстное меню? Я нашел такой но там выскакивало сообщение, а мне этого не надо. Мне надо, что бы вообще ничего не происходило. Я пробовал удалить ненужный алерт, но скрипт переставал работать. Вот пример скрипта:


<HTML;><BODY;>
<SCRIPT; LANGUAGE="JavaScript1.1">
function right(e) {
if (navigator.appName == 'Netscape' && 
(e.which == 3 || e.which == 2))
return false;
else if (navigator.appName == 'Microsoft Internet Explorer' && 
(event.button == 2 || event.button == 3)) {
alert("Хрен вам");
return false;
}
return true;
}
document.onmousedown=right;
document.onmouseup=right;
if (document.layers) window.captureEvents(Event.MOUSEDOWN);
if (document.layers) window.captureEvents(Event.MOUSEUP);
window.onmousedown=right;
window.onmouseup=right;
</script></BODY></HTML>

Алексей

Ответ:
Этот скрипт и расчитан на то, что алерт перекрывает контекстное меню, и по другому сделать нельзя.
НО! в IE (начиная с какой версии не помню) есть следующий метод:


 document.oncontextmenu = function(){return false;};

То есть будет работать вот так:

<html;><body;>
<script; LANGUAGE="JavaScript1.1">
<!--
document.oncontextmenu = function(){return false;};
//-->
</script></body></html>

Вопрос:
Возможно ли сделать так, чтобы под окошком с текстом отображалось количество введенных символов? А еще лучше, чтобы отображалось сколько осталось до предела (например, 1000 символов максимум), и при достижении предела больше вводить было бы нельзя?

Ответ:
Посмотрите реализацию примера






Вопросы присылайте на E-mail [email protected] с пометкой "Вопрос по Java".

Жду вопросов и предложений.

Юрий Ладик.

Подписаться на эту рассылку и посмотреть архив можно тут /subs/subs.html


Генри Бекет
"Java SOAP для профессионалов"
Подробнее>>
Заказать>>


Любош Бруга
"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-й