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






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


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

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

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

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

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




Rambler's Top100
Rambler's Top100

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

Java programming выпуск 29-й

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

Сегодня объявлен старт проекта:

Проект "Тестирование и анализ сред разработки программного обеспечения для Java"

"Testing and analyses IDE for Java" (TAIDEJ)

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

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

Данный проект ориентировочно будет состоять из трех частей.

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

Вторая часть – разработка, собственно методик тестирования и анализа IDE – средств.

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

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

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

Так же следует отметить, что проект является некоммерческим, а следовательно мы надеемся и стремимся получить объективную и независимую оценку.

Просьба всем пройти опросный лист!

Надеемся на совместное плодотворное сотрудничество!!!!!!!
Координационная группа JavaPortal.ru

mailto:webmaster@javaportal.ru

Начинающим

Работа со стороками

Давайте обсудим средства языка Java для работы со строками. В язы­ках С и C++ отсутствует встроенная поддержка такого объекта, как строка. В них при необхо­димости передается адрес последовательности байтов, содержимое которых трактуется как символы до тех пор, пока не будет встречен нулевой байт, отмечающий конец строки. В пакет java.lang встроен класс, инкапсулирующий структуру данных, соответ­ствующую строке. Этот класс, называемый String, не что иное, как объ­ектное представление неизменяемого символьного массива. В этом классе есть методы, которые позволяют сравнивать строки, осуществлять в них поиск и извлекать определенные символы и подстроки. Класс StringBuffer используется тогда, когда строку после создания требу­ется изменять.

ВНИМАНИЕ
И String, и StringBuffer объявлены final, что означает, что ни от одного из этих классов нельзя производить подклассы. Это было сделано для того, чтобы можно было применить некоторые виды оптимизации по­зволяющие увеличить производительность при выполнении операций обработки строк.

Конструкторы

Как и в случае любого другого класса, вы можете создавать объекты типа String с помощью оператора new. Для создания пустой строки ис­пользуется конструктор без параметров:

String s = new String():

Приведенный ниже фрагмент кода создает объект s типа String иници­ализируя его строкой из трех символов, переданных конструктору в ка­честве параметра в символьном массиве.


char chars[] = { 'а', 'b', 'с' }: 
String s = new String(chars); 
System.out.println(s): 

Этот фрагмент кода выводит строку «abc». Итак, у этого конструктора — 3 параметра:


String(char chars[], int начальныйИндекс, int числоСимволов); 

Используем такой способ инициализации в нашем очередном примере:


char chars[] = { 'a', 'b', 'с', 'd', 'e', 'f' }: 
String s = new String(chars,2,3); 
System.out.println(s); 

Этот фрагмент выведет «cde».

Специальный синтаксис для работы со строками

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

Создание строк

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


String s = "abc"; 
System.out.println(s); 

Один из общих методов, используемых с объектами String — метод length, возвращающий число символов в строке. Очередной фрагмент вы­водит число 3, поскольку в используемой в нем строке — 3 символа.


String s = "abc"; 
System.out.println(s.length); 

В Java интересно то, что для каждой строки-литерала создается свой представитель класса String, так что вы можете вызывать методы этого класса непосредственно со строками-литералами, а не только со ссылоч­ными переменными. Очередной пример также выводит число 3.


System.out.println("abc".Length()); 

Слияние строк

Строку


String s = «Не is » + age + " years old."; 

в которой с помощью оператора + три строки объединяются в одну, про­честь и понять безусловно легче, чем ее эквивалент, записанный с яв­ными вызовами тех самых методов, которые неявно были использованы в первом примере:


String s = new StringBuffer("He is ").append(age); 
s.append(" years old.").toString(); 

По определению каждый объект класса String не может изменять­ся. Нельзя ни вставить новые символы в уже существующую строку, ни поменять в ней одни символы на другие. И добавить одну строку в конец другой тоже нельзя. Поэтому транслятор Java преобразует опера­ции, выглядящие, как модификация объектов String, в операции с род­ственным классом StringBuffer.

ЗАМЕЧАНИЕ
Все это может показаться вам необоснованно сложным. А почему нельзя обойтись одним классом String, позволив ему вести себя при­мерно так же, как StringBuffer? Все дело в производительности. Тот факт, что объекты типа String в Java неизменны, позволяет транслято­ру применять к операциям с ними различные способы оптимизации.

Последовательность выполнения операторов

Давайте еще раз обратимся к нашему последнему примеру:


String s = "Не is " + age + " years old."; 

В том случае, когда age — не String, а переменная, скажем, типа int, в этой строке кода заключено еще больше магии транслятора. Целое значение переменной int передается совмещенному методу append класса StringBuffer, который преобразует его в текстовый вид и добавляет в конец содержащейся в объекте строки. Вам нужно быть вниматель­ным при совместном использовании целых выражений и слияния строк, в противном случае результат может получиться совсем не тот, который вы ждали. Взгляните на следующую строку:


String s = "four: " + 2 + 2; 

Быть может, вы надеетесь, что в s будет записана строка «four: 4»? Не угадали — с вами сыграла злую шутку последовательность выпол­нения операторов. Так что в результате получа­ется "four: 22".

Для того, чтобы первым выполнилось сложение целых чисел, нужно использовать скобки :


String s = "four: " + (2 + 2); 

Преобразование строк

В каждом классе String есть метод toString — либо своя собственная реализация, либо вариант по умолчанию, наследуемый от класса Object. Класс в нашем очередном примере замещает наследуемый метод toStrring своим собственным, что позволяет ему выводить значения переменных объекта.


class Point { 
int х, у; 
Point(int x, int у) { 
this.x = х; 
this.у = у; 
} 
public String toString() { 
return "Point[" + x + ", " + у + "]"; 
} } 

class toStringDemo { 
public static void main(String args[]) { 
Point p = new Point(10, 20); 
System.out.println("p = " + p); 
} } 

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


С:\> Java toStringDemo 
p = Point[10, 20] 

Извлечение символов

Для того, чтобы извлечь одиночный символ из строки, вы можете со­слаться непосредственно на индекс символа в строке с помощью метода charAt. Если вы хотите в один прием извлечь несколько символов, можете воспользоваться методом getChars. В приведенном ниже фрагменте показано, как следует извлекать массив символов из объекта типа String.


class getCharsDemo { 
public static void main(String args[]) { 
String s = "This is a demo of the getChars method."; 
int start = 10; 
int end = 14; 
char buf[] = new char[end - start]; 
s.getChars(start, end, buf, 0); 
System.out.println(buf); 
} } 

Обратите внимание — метод getChars не включает в выходной буфер символ с индексом end. Это хорошо видно из вывода нашего примера — выводимая строка состоит из 4 символов.


С:\> java getCharsDemo 
demo 

Для удобства работы в String есть еще одна функция — toCharArray, которая возвращает в выходном массиве типа char всю строку. Альтернативная форма того же самого механизма позволяет записать содержимое строки в массив типа byte, при этом значения старших бай­тов в 16-битных символах отбрасываются. Соответствующий метод на­зывается getBytes, и его параметры имеют тот же смысл, что и пара­метры getChars, но с единственной разницей — в качестве третьего параметра надо использовать массив типа byte.

Сравнение

Если вы хотите узнать, одинаковы ли две строки, вам следует воспользоваться методом equals класса String. Альтернативная форма этого метода называется equalsIgnoreCase, при ее использовании различие ре­гистров букв в сравнении не учитывается. Ниже приведен пример, иллюстрирующий использование обоих методов:


class equalDemo { 
public static void main(String args[]) { 
String s1 = "Hello"; 
String s2 = "Hello"; 
String s3 = "Good-bye"; 
String s4 = "HELLO"; 
System.out.println(s1 + " equals " + s2 + " -> " + s1.equals(s2)); 
System.out.println(s1 + " equals " + s3 + " -> " + s1.equals(s3)); 
System.out.println(s1 + " equals " + s4 + " -> " + s1.equals(s4)); 
System.out.println(s1 + " equalsIgnoreCase " + s4 + " -> " +                                      
                   s1.equalsIgnoreCase(s4)); 
} } 

Результат запуска этого примера :


С:\> java equalsDemo 
Hello equals Hello -> true 
Hello equals Good-bye -> false 
Hello equals HELLO -> false 
Hello equalsIgnoreCase HELLO -> true 

В классе String реализована группа сервисных методов, являющихся специализированными версиями метода equals. Метод regionMatches используется для сравнения подстроки в исходной строке с подстрокой в строке-параметре. Метод startsWith проверяет, начинается ли данная подстрока фрагментом, переданным методу в качестве параметра. Метод endsWith проверяет совпадает ли с параметром конец строки.

Равенство

Метод equals и оператор == выполняют две совершенно различных проверки. Если метод equal сравнивает символы внутри строк, то опе­ратор == сравнивает две переменные-ссылки на объекты и проверяет, указывают ли они на разные объекты или на один и тот же. В очеред­ном нашем примере это хорошо видно — содержимое двух строк оди­наково, но, тем не менее, это — различные объекты, так что equals и == дают разные результаты.


class EqualsNotEqualTo { 
public static void main(String args[]) { 
String s1 = "Hello"; 
String s2 = new String(s1); 
System.out.println(s1 + " equals " + s2 + " -> " + s1.equals(s2)); 
System.out.println(s1 + " == " + s2 + ", -> " + (s1 == s2)); 
} } 

Вот результат запуска этого примера:


C:\> java EqualsNotEqualTo 
Hello equals Hello -> true 
Hello == Hello -> false 

Упорядочение

Зачастую бывает недостаточно просто знать, являются ли две строки идентичными. Для приложений, в которых требуется сортировка, нужно знать, какая из двух строк меньше другой. Для ответа на этот вопрос нужно воспользоваться методом compareTo класса String. Если целое значение, возвращенное методом, отрицательно, то строка, с которой был вызван метод, меньше строки-параметра, если положительно — больше. Если же метод compareTo вернул значение 0, строки идентичны. Ниже приведена программа, в которой выполняется пузырьковая сорти­ровка массива строк, а для сравнения строк используется метод compareTo. Эта программа выдает отсортированный в алфавитном порядке список строк.


class SortString { 
static String arr[] = {"Now", "is", "the", "time", "for", "all",    
                       "good", "men", "to", "come", "to", "the",     
                       "aid", "of", "their", "country" }; 
public static void main(String args[]) { 
for (int j = 0; i < arr.length; j++) { 
     for (int i = j + 1; i < arr.length; i++) { 
          if (arr[i].compareTo(arr[j]) < 0) { 
              String t = arr[j]; 
              arr[j] = arr[i]; 
              arr[i] = t; 
          } 
     }  
     System.out.println(arr[j]); 
} 
} } 

Продолжение в следующем номере.

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

Продолжаем объединенную тему прошлого номера

package supertiler;

import java.awt.*;
import java.awt.geom.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.JComponent;
import java.util.ResourceBundle;
import java.applet.*;
import java.net.URL;


/**
 * Title:        Super Tiler
 * Description:
 * Copyright:    Copyright (c) 2002
 * Company:      Ladik Studio
 * @author Yura Ladik
 * @version 1.0
 */
public class STButtonPanel extends JComponent
{
 boolean stafSound=false;
 int countColors=5;
 // Подгружаем звуковые файлы
 AudioClip okClip=Applet.newAudioClip(getClass().getResource("/supertiler/sounds/ok.wav"));
 AudioClip scootClip=Applet.newAudioClip(getClass().getResource("/supertiler/sounds/scoot.wav"));

 // Картинка не активной кнопки
 Image imgstop;
 // Картинка фона всего компонента
 Image imgbutfon;

 // Номер активной на данный момент кнопки
 int activButton=-1;
 // Игровое поле
 private STGameField  gameField;
 // В данном массиве компонентов Ellipse2D мы будем хранить координаты наших
 // кругленьких кнопочек
 Ellipse2D[] elps =new Ellipse2D[20];
 // Обработчик событий от мышки
 private MouseListener MouseL;
 // Обработчик событий движения курсора мышки
 private MouseMotionListener MouseML;



 public STButtonPanel(STGameField gameField1)
 {
  // Получаем ссылку на объект игрового поля(ИП)
  this.gameField=gameField1;
  // Получаем картинки из компонента ИП
  imgstop=gameField.imgstop;
  imgbutfon=gameField.imgbutfon;
  // Инициализируем массив
  for(int i=0;i<20;i++)elps[i]=new Ellipse2D.Float(27,29+i*25,18,18);

  // Обработчик событий
  MouseML= new MouseMotionAdapter()
  {
   public void mouseMoved(MouseEvent e)
   {
    boolean ok=false;
    // Проходим по количеству доступных нам кнопок
    for(int i=0;i<gameField.colorCount;i++)
      // Если находимся над кнопкой и она доступна
      // (т.е. этим цветом не играет ни один из противников)
    if(elps[i].contains(e.getPoint())&&
       (i!=gameField.gamerColor&&i!=gameField.comp1Color&&i!=gameField.comp2Color
        &&i!=gameField.comp3Color))
    {
     ok=true;
     // Играем звук и выбираем номер кнопки над которой находится курсор
     if(!stafSound)
     {
       if(scootClip!=null)scootClip.play();
       stafSound=true;
       activButton=i;
     }
    }
    if(ok)stafSound=true;
    else
    {
     stafSound=false;
     activButton=-1;
    }
    // Перерисовываем компонент
    repaint();
   }
  };

  // Оброботчик событий от мышки
  MouseL=new MouseAdapter()
  {
   public void mouseClicked(MouseEvent e)
   {
    // Проходим по количеству доступных нам кнопок
    for(int i=0;i<gameField.colorCount;i++)
    {
     // Если нажата кнопочка и курсор находится над доступной кнопкой
     if(elps[i].contains(e.getPoint())&&
        (i!=gameField.gamerColor&&i!=gameField.comp1Color&&i!=gameField.comp2Color
           &&i!=gameField.comp3Color))
     {
      // то играем звук и говорим игровому полю сделать ход игрока цвето номер i
      if(okClip!=null)okClip.play();
      gameField.turnGamer(i);
      // Перерисовываем компонент
      repaint();
     }
    }
   }
   };
   // Добавляем обработчики
   addMouseListener(MouseL);
   addMouseMotionListener(MouseML);
  }

 // Функция прорисовки компонента
 public void paintComponent(Graphics g)
 {
  Graphics2D g2 = (Graphics2D)g;
  // Активируем антиалиасинг
  g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
  g2.setColor(Color.black);
  // рисуем наши кнопочки
  g2.fillRect(0,0,getWidth(),getHeight());
  for(int i=0;i<20;i++)
  {
   // Если кнопочка доступна рисууем её
   if(i<gameField.colorCount&&(i!=gameField.gamerColor&&i!=gameField.comp1Color&&
                               i!=gameField.comp2Color&&i!=gameField.comp3Color))
   {
    g2.setColor(gameField.colors[i]);
    g2.fill(elps[i]);
    // Если кнопочка активна то затемняем её
    if(i==activButton){
    g2.setColor(gameField.colors[i].darker());
    g2.fillOval((int)elps[i].getX()+2,(int)elps[i].getY()+2,14,14);
    }
   }
   // Если кнопочка не доступна рисуем на её месте крестик
   else g2.drawImage(imgstop,25,i*25+27,this);
  }
  // Рисуем фоновую картинку
  g2.drawImage(imgbutfon,0,0,this);
 }
}

Мне пришел вопрос, почему мы не пишем данную игру с нуля???

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

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

Также даю ссылку на рабочую beta версию игры, можете посмотреть, как это работает.

Рассмотренный выше компонент это правая панель с кнопками.

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

Возможно ли сделать два шрифта в одной JLabel??

Ответ: http://www.javaportal.ru/java/examples/font2jlabel.html

Как мне заменить подстроку на строку в строке?

Ответ: http://www.javaportal.ru/java/examples/string_Replace.html

Как работать с JTabbedPane
Сергей

Ответ: http://www.javaportal.ru/java/examples/useJTabbedPane.html

Вопрос: Как передать все поля одного объекта-потока в другой объект-поток?

Ответ: http://www.javaportal.ru/java/examples/threadprop.html

JavaScript

Сегодня предлагаю вашему вниманию подборку примеров:

Вопросы присылайте на E-mail faq@javaportal.ru с пометкой "Вопрос по Java".
А лучше задавайте их в форуме.

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

Юрий Ладик.


Warning: mysql_connect() [function.mysql-connect]: Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2) in /pub/home/javaport/javaportal/books/show2b.php on line 11

Warning: mysql_db_query() [function.mysql-db-query]: Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2) in /pub/home/javaport/javaportal/books/show2b.php on line 19

Warning: mysql_db_query() [function.mysql-db-query]: A link to the server could not be established in /pub/home/javaport/javaportal/books/show2b.php on line 19

Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /pub/home/javaport/javaportal/books/show2b.php on line 30
Узнай о чем ты на самом деле сейчас думаешь тут.


[an error occurred while processing this directive]



Warning: mysql_connect() [function.mysql-connect]: Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2) in /pub/home/javaport/javaportal/news/worldnews.php on line 91

Warning: mysql_db_query() [function.mysql-db-query]: Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2) in /pub/home/javaport/javaportal/news/worldnews.php on line 93

Warning: mysql_db_query() [function.mysql-db-query]: A link to the server could not be established in /pub/home/javaport/javaportal/news/worldnews.php on line 93

Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /pub/home/javaport/javaportal/news/worldnews.php on line 95



Выпуск 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-й