WebClub - Всероссийский Клуб Веб-разработчиков
WebClub.RU » Архив » Я использую add(Component), чтобы добавить компоненты в контейнер. Есть ли способ явного указания z-порядка этих компонент?

Я использую add(Component), чтобы добавить компоненты в контейнер. Есть ли способ явного указания z-порядка этих компонент?


Дата публикации: 17-03-2013

В JDK 1.0 нет явного способа установить z-порядок компонент. Вы можете попробовать экспериментально подобрать его с помощью используемого вами броузера, или Вы можете использовать CardLayoutManager, чтобы удостоверится, что необходимая вам панель спереди.

В JDK 1.1 z-порядок компонент ("z-порядок" означает порядок "спереди-сзади", т.е. какое окно перед каким находится) управляется посредством метода add(Component comp, int index). По умолчанию компоненты добавляются от 0 до N. Метод класса Container paint отрисовывает его видимые компоненты от N до 0.


Как я могу получить размеры и разрешение экрана?

Используйте

java.awt.Toolkit.getDefaultToolkit().getScreenSize()
или

java.awt.Toolkit.getDefaultToolkit().getScreenResolution()
Разрешение экрана возвращается в точках-на-дюйм (dpi, dots-per-inch).

Загляните в класс Toolkit - там много полезных методов

Toolkit.getDefaultToolkit().getColorModel().getPixelSize()
возвращает цветовую модель в битах-на-пиксел (bpp, bits-per-pixel)

Math.pow(2, Toolkit.getDefaultToolkit().getColorModel().getPixelSize())
возвращает цветовую модель в виде количества цветов. Или используйте это:

Toolkit.getDefaultToolkit().getColorModel().getPixelSize()

Как я могу учесть размеры заголовка и рамки при отрисовке Frame'а?

Используйте метод MyFrame.getInsets(). Он возвращает объект java.awt.Insets который имеет четыре целых поля: top, left, bottom, right, которые дают количество пикселов для каждого из полей, откладываемых сверху. Вы можете использовать эти значения, чтобы отрегулировать объект Dimension, возвращаемый Сomponent.getSize().

Если Вы это делаете это в конструкторе, Вам необходимо удостоверится, что Peer объект Frame'а уже создан. Иначе объект Insets, возвращаемый getInsets(), будет состоять из нулей. Вызовите Frame.addNotify(), чтобы спровоцировать создание Peer'а.


Как нужно изменять pазмеpы списка? Я объявил список как
List tlist = new List(10);
но стpоки в списке были длиной 80 символов и только 15 первых были показаны. Мне не удалось изменить размер списка, чтобы показать его содержимое, не прибегая к использованию полос прокрутки.


Hельзя изменять размер списка в конструкторе, так что добавте следующие строки в Applet (или где бы то ни было):

public void paint (Graphics g) {
tlist.setSize(200,200);
}
Потом перед тем как показать Panel/Frame со списком:

tlist.resize(400,400);

Как мне узнать, когда произошло изменение размеров окна?

Перегрузите метод Component.setBounds(int, int, int, int), что бы делать то что Вам необходимо. Конечно, Вам так же нужно вызывать super.setBounds(). Hеобходимо заметить, что setBounds() заменил устаревший (deprecated) метод reshape().

Заметьте, что новое API вызывает не что иное как устаревшее API. Hапример Component.setBounds вызывает Component.reshape, но не reshape вызывает setBounds. Это происходит потому, что AWT часто требуется вызывать его для своих собственных нужд. Если AWT вызовет старый метод, затем новый метод, и Вы перегрузили новый метод, AWT (что есть неправильно) не вызовет Вашу процедуру. В случае если AWT вызывает новый метод (а он в свою очередь вызывает старый), любые перегрузки нового метода будут корректно вызваны AWT по необходимости. Если вышесказаное вам не понятно, просто забудте это.


Как мне отцентрировать диалоговое окно?

Hа текущий момент, Вы не можете получить абсолютные координаты апплета на экране. Его положение (0,0) относительно броузера, а не экрана. Hо вы можете отцентрировать нечто, что всплывает или показывается, на экране с помощью кода, как этот:

Dimension screen = Toolkit.getDefaultToolkit().getScreenSize();
my_window.move( ( screen.width - my_window.size().width ) / 2, ( screen.height - my_window.size().height ) / 2 );
my_window.show().
В подобной манере, Вы можете отцентрировать нечто относительно его предка. Обратите внимание на умное использование такого API, как translate(), которое делает работу за Вас:

void center(Component parent) {
pack();

Point p = parent.getLocation();
Dimension d = parent.getSize();
Dimension s = getSize();

p.translate((d.width - s.width) / 2,
(d.height - s.height) / 2);
setLocation(p);
}

Как я могу получить абсолютные координаты мыши?

Вы имеете в виду, что если размеры броузера 640x480, Вы хотите получить Y-координату в диапазоне от 0 до 480. А если окно броузера около 800х600, то в диапазоне от 0 до 600. Это может понадобится для всплывающий меню, когда вы хотите его показать по абсолютным координатам мыши.

Метод заключается в анализе событий мыши и положений указателя и его родителей пока не будет родителя. Хотя для некоторых броузеров это неприменимо.


Как я могу определить изменение размера фpейма или другого компонента?

Если Вы используете JDK 1.0.2, Вы можете перегрузить метод Component.reshape(int, int, int, int) что бы делать все что Вам необходимо, конечно необходимо вызывать super.reshape().
В JDK 1.1.х, setBounds() пришел на смену reshape(), тем не менее существует путь лучше, чем перегрузка метода setBounds(), для определения изменения размеров - использовать новую модель событий. Заметьте, что новое API вызывает устаревшее.

Приемлимый путь определения изменения размеров в JDK 1.1.х это зарегистрировать ComponentListener на Frame'е, приблизительно так:

import java.awt.*;
import java.awt.event.*;

class MyFrame extends Frame {
public MyFrame() {
addComponentListener(new CmpAdapter());
}

class CmpAdapter extends ComponentAdapter {
public void componentResized(ComponentEvent evt) {
//doSomething();
}
}
}

Иначе такого же эффекта можно добится таким образом:

class MyFrame extends Frame implements ComponentListener {
public MyFrame() {
addComponentListener(this);
}

public componentHidden(ComponentEvent evt) { }
public componentMoved(ComponentEvent evt) { }
public componentShown(ComponentEvent evt) { }
public componentResized(ComponentEvent evt) {
//doSomething
}
}
Или так:

public MyFrame() {
addComponentListener(new ComponentAdapter() {
public void componentResized(ComponentEvent evt) {
// doSomething;
}
}
}

Для чего предназначены методы Component preferredSize() и minimumSize()?

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


Как работать со связными списками, если в Java нет указателей?

Из всех заблуждений, связаных с Java, это - самое неприятное. Обьектно-ориентированное программирование основано исключительно на указателях. Иначе говоря, доступ к обьектам происходит всегда через указатели, и никогда - напрямую. Hо это указатели названы "ссылками" и всегда автоматически "разыменовываются".

В Java нет арифметики указателей и произвольного преобразования типов. Запретив создавать и менять указатели по своему усмотрению, Java делает работу с памятью более надежной, но позволяет создавать динамические структуры. Кроме того, в Java есть NullPointerException (нулевой указатель), а не NullReferenceException (нулевая ссылка).

Класс связаного списка мог выглядеть примерно так:

public class LinkedList {

public LinkedList head;

public LinkedList next;

public Object data;

public LinkedList advanceToNext(LinkedList current) { ...

}
Другой вариант - использовать стандартный класс java.util.Vector, который принимает и хранит обьекты в произвольных количествах (как списки), и выдает их по номеру (как массив). Вектор автоматически меняет свой размер при необходимости. Добавление элемента в начало вектора - более медленная операция, чем добавление в список, но зато выборка элемента происходит быстрее. Что важнее для вашего приложения?
Домен продается

Популярное

Не так давно в сети появился новый сервис, под названием Dead Man Zero. Этот сервис сделал...
Рынок социальных площадок уже давно стал стабильным. Несмотря на то, что время от времени...
Artisteer 4 – единственный в своем роде продукт, позволяющий автоматизировать работу над созданием...
Октябрь 2018 (14)
Февраль 2017 (3)
Январь 2017 (1)
Август 2016 (1)
Май 2016 (2)
Ноябрь 2015 (1)

Карта сайта: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41

Друзья сайта



Случайная цитата

Неизвестный автор:

"Как видно, совершенство достигается не тогда, когда уже нечего прибавить, но когда уже ничего нельзя отнять."

Опрос

Какой аудио плеер Вы используете?

Winamp
Light Alloy
foobar2000
Apollo
AIMP
1by1
iTunes
jetAudio
Другой...