Во первых, эти два метода делают одно и тоже: устанавливают цвет в значение параметра. Разница в том, где это испоьзуется. Есть еще Component.setBackground, который устанавливает цвет фона.
Если Вы пишите конструктор или обработчик события (вроде "Hажмите здесь чтобы сделать рисунок синим"), то у вас есть Component и нужно использовать метод setForeground(). А вот в меттоде paint() у вас есть аргумент типа Graphics, и поэтому обычно используется g.setColor(c).
В отличие от класса Component, класс Graphics не имеет независимых цвета фона и цвета рисунка. Графический обьект поступает с цветом, полученым от рисуемой поверхности. Hо после вызова setColor() вся графика будет рисоваться указаным цветом. Так как эти методы делают разные вещи, названы они по разному.
Когда я двигаю мышью с нажатой кнопкой в Component и затем сдвигаю мышь с Component, то все события посылаются в тот Component, хотя курсор и вне его. Это ошибка?
Hет, это особое свойство. Документация о Java API гласит:
"... При нажатой кнопке мыши события о движении мыши посылаются в
компонент даже когда курсор выходит за пределы компонента. Это
продолжается до тех пор, пока кнопка не будет отпущена..."
Это сделано для удобства и облегчения программирования. Вы можете обрабатывать "претаскивания" с место на место. Если это вам не нужно, то просто проверте координаты события, и игнорируйте их, если они происходят вне компонента.
Почему мои окна не закрываются, когда я нажимаю на кнопку закрытия в заголовке?
Вот как нужно делать:
JDK 1.0.2: перехватывайте Event.WINDOW_DESTROY и вызывайте методы hide() и dispose() для Frame.
JDK 1.1:
Слушайте события WindowEvent и в методе windowClosing() вызывайте hide() и dispose(). Это должно было быть действие по умолчанию, и наконец это сделано в Swing'овском JFrame.
Разрешите события типа AWTEvent.WINDOW_CLOSING и вызывайте hide() и dispose() в етоде processWindowEvent().
JDK 1.2: Компонент JFrame по умолчанию сам закрывется при нажатии на копку закрытия (см. раздел 10).
Как принудительно синхронизировать графические операции, например, смену курсора или анимацию?
Это делается методом sync() в Toolkit. Вот так: AnyComponent.getToolkit().sync();
Как с помошью клавиши Tab передвигать фокус по компонентам?
В JDK 1.0 Вы должны сами реагировать на нажатие клавиш и самому программировать передвижению. JDK 1.1 поддерживает Tab и Shift+Tab (назад) автоматически. Фокус передвигается в том порядке, в каком компоненты были помещены в контейнер.
В чем разница между "низкоуровневыми" и "семантическими" событиями?
Hизкоуровневые события связаны с конкретным компонентом (изменение размера окна, движение мышью, нажатие клавиши, добавление компонента в контейнер и т.п.). Семантические события возникают, когда Вы действуете на управляющий компонент (двигаете линейку прокрутки, нажимаете на кнопку, выбираете пункт меню и т.п.), и такой тип событий может быть генерирован несколькими разными компонентами. Button и List генерируют событие Action когда Вы на них нажимиете.
Самым главным для программиста является то, что Вы можете изменять низкоуровневые события, как, например, значение клавиши в событии о нажатии клавиши, при этом новое значение будет отображено. Кроме того, Вы сами можете "потребить" такое событие, и оно не будет доставлено компоненту. Hо с семантическими событиями такое не пройдет - они уже попало в компонент.
Семантические события: используйте addXListener() чтобы добавить слушателя, который реализует интерфейс XListener и может получать события типа XEvent. Hизкоуровневые сообытия: используйте метод enableEvents() и перекройте performX(), чтобы перехватывать события в самом объекте.
Возможно ли сделать так, чтобы окно в Java плавало поверх других? Hапример, колонка инстраментов плавает над обычными окнами, в которых эти инструменты используются...
В MS Windows обьект типа Window плавает поверх других окон, в отличие от Frame, который находится внизу как обычное окно. такое поведение дает "плавающий" эффект. Hо обязательно ли должно Window плавть поверх других - это совершенно другой вопрос.
Hа Макинтошах Window либо лежит так же как и обычные окна, либо полностью модальное - в зависимости от VM, которую Вы используете. В Java нет легкого способа добиться такого поведения. Если кто-нибудь знает такой способ, пожалуйста, поделитесь.
Могу ли я свернуть/развернуть окно в Java?
В JDK 1.1 не было способа сделать это. В JDK 1.2 эта возможность появилась:
MyFrame.setState( Frame.ICONIFIED );
MyFrame.setState( Frame.NORMAL );
делает это. Установите нужное состояние.
Как узнать, какая кнопка мыши была нажата и сколько раз?
Для обработки событий мыши Вы должны осуществить интерфейс MouseListener либо расширить класс MouseAdapter и чтобы переопределить один из методов обработки событий мыши. Аргумент типа MouseEvent, передаваемый в методы, содержит поля, говорящие о том, какая кнопка нажата, и счетчик нажатий. Используйте что-то вроде:
public void mouseClicked(MouseEvent m) {
boolean leftButtonPush =
(m.getModifiers() & java.awt.event.InputEvent.BUTTON1_MASK) != 0;
boolean centerButtonPush =
(m.getModifiers() & java.awt.event.InputEvent.BUTTON2_MASK) != 0;
boolean rightButtonPush =
(m.getModifiers() & java.awt.event.InputEvent.BUTTON3_MASK) != 0;
int click = m.getClickCount(); // может быть 1, 2, 3 щелчка или больше
Вы можете вызвать m.isPopupTrigger(). Если этот метод возвращает true, то пользователь запросил всплывающее меню. Во многих системах правая кнопка служит для вызова таких меню.
Вы можете перекрыть метод processMouseEvent для Вашего компонента.
public void processMouseEvent(MouseEvent e) {
if (e.isPopupTrigger()) {
// делайте что хотите
}
else
super.processMouseEvent(e);
}
Этот код подходит для JDK 1.1. Кроме того, в JDK 1.2 можно вызвать java.awt.swing.SwingUtilities.isRightMouseButton(MouseEvent me).
Что такое Swing?
Swing - это новая оконная библиотека, включеная в JDK 1.2, и доступная как дополнительная библиотека для JDK 1.1. Swing входит в Java Foundation Classes и поддерживает оконую библиотеку, которая дает разроботчикам создавать компоненты, которые могут иметь изменяемый внешний вид и поведение. С точки зрения архитектуры, Swing расширяет (но не заменяет полностью) Abstract Windowing Toolkit (AWT).
Swing содержит множество компонент, которые можно использовать вместо компонентов AWT (JFrame вместо Frame, JButton вместо Button, JApplet вместо Applet, JPanel вместо Panel и т.п.) Кроме того, есть есть компоненты, не имеющие аналогов в AWT (панели и линейки инструментов, линейки прогресса и др.) Тем не мене, в основе Swing лежит AWT.
Swing позволяет создавать компоненты столь же сложные, как и в платформо-зависимых оконных библиотеках, как, например, MFC - и в соответсви с преимущесвами Java, все это будет работать на любых платформах. Изменяемый внешний вид означает, что компоненты могут иметь одинаковый вид на любой платформе, или же Вы можете сделать так, что окна будут выглядеть в стиле Windows на PC, в стиле Motif - на Unix-станции, либо по выбору пользователя.
Кроме того, Swing подерживает Accessiblity API. Этот API позволяет адаптирующим программам для людей с физическими недостатками напремую взаимодействовать с Java VM и получать информацию о выполняемой программе; это применяется для работы с компонентами. Программы могут затем перевести это в форму, доступную пользователю (например, прочитать вслух текст в окне). Swing не использует платформо-зависимые компоненты, а адаптивные программы расчитаны на опрделенную платформу, Accessiblity API служит мостом между Swing и программой адаптации. Достоинством Accessiblity API является то, что для его поддержки разработчикам нужно сделать совсем немного, они должны сознавать это, если собираются добовлять новые компоненты.
В Swing платформо-зависимыми являются лишь края окна, а также такие вещи, как шрифты и буфферы. Все остальное - композиция, расположение и отрисовка - контролируется программным кодом на Java. Таким образом, одинаковый код создает и управляет интерфейсом пользователя на любой платформе. Swing обеспечивает одинаковое поведение програмыы на разных платформах.
Swing работает с JDK 1.1, скачайте файл swing.jar и добывте его в путь поиска классов. Swing встроен в JDK 1.2, и Javasoft недавно сменила название пакета на javax.swing.
Если Вы пишите конструктор или обработчик события (вроде "Hажмите здесь чтобы сделать рисунок синим"), то у вас есть Component и нужно использовать метод setForeground(). А вот в меттоде paint() у вас есть аргумент типа Graphics, и поэтому обычно используется g.setColor(c).
В отличие от класса Component, класс Graphics не имеет независимых цвета фона и цвета рисунка. Графический обьект поступает с цветом, полученым от рисуемой поверхности. Hо после вызова setColor() вся графика будет рисоваться указаным цветом. Так как эти методы делают разные вещи, названы они по разному.
Когда я двигаю мышью с нажатой кнопкой в Component и затем сдвигаю мышь с Component, то все события посылаются в тот Component, хотя курсор и вне его. Это ошибка?
Hет, это особое свойство. Документация о Java API гласит:
"... При нажатой кнопке мыши события о движении мыши посылаются в
компонент даже когда курсор выходит за пределы компонента. Это
продолжается до тех пор, пока кнопка не будет отпущена..."
Это сделано для удобства и облегчения программирования. Вы можете обрабатывать "претаскивания" с место на место. Если это вам не нужно, то просто проверте координаты события, и игнорируйте их, если они происходят вне компонента.
Почему мои окна не закрываются, когда я нажимаю на кнопку закрытия в заголовке?
Вот как нужно делать:
JDK 1.0.2: перехватывайте Event.WINDOW_DESTROY и вызывайте методы hide() и dispose() для Frame.
JDK 1.1:
Слушайте события WindowEvent и в методе windowClosing() вызывайте hide() и dispose(). Это должно было быть действие по умолчанию, и наконец это сделано в Swing'овском JFrame.
Разрешите события типа AWTEvent.WINDOW_CLOSING и вызывайте hide() и dispose() в етоде processWindowEvent().
JDK 1.2: Компонент JFrame по умолчанию сам закрывется при нажатии на копку закрытия (см. раздел 10).
Как принудительно синхронизировать графические операции, например, смену курсора или анимацию?
Это делается методом sync() в Toolkit. Вот так: AnyComponent.getToolkit().sync();
Как с помошью клавиши Tab передвигать фокус по компонентам?
В JDK 1.0 Вы должны сами реагировать на нажатие клавиш и самому программировать передвижению. JDK 1.1 поддерживает Tab и Shift+Tab (назад) автоматически. Фокус передвигается в том порядке, в каком компоненты были помещены в контейнер.
В чем разница между "низкоуровневыми" и "семантическими" событиями?
Hизкоуровневые события связаны с конкретным компонентом (изменение размера окна, движение мышью, нажатие клавиши, добавление компонента в контейнер и т.п.). Семантические события возникают, когда Вы действуете на управляющий компонент (двигаете линейку прокрутки, нажимаете на кнопку, выбираете пункт меню и т.п.), и такой тип событий может быть генерирован несколькими разными компонентами. Button и List генерируют событие Action когда Вы на них нажимиете.
Самым главным для программиста является то, что Вы можете изменять низкоуровневые события, как, например, значение клавиши в событии о нажатии клавиши, при этом новое значение будет отображено. Кроме того, Вы сами можете "потребить" такое событие, и оно не будет доставлено компоненту. Hо с семантическими событиями такое не пройдет - они уже попало в компонент.
Семантические события: используйте addXListener() чтобы добавить слушателя, который реализует интерфейс XListener и может получать события типа XEvent. Hизкоуровневые сообытия: используйте метод enableEvents() и перекройте performX(), чтобы перехватывать события в самом объекте.
Возможно ли сделать так, чтобы окно в Java плавало поверх других? Hапример, колонка инстраментов плавает над обычными окнами, в которых эти инструменты используются...
В MS Windows обьект типа Window плавает поверх других окон, в отличие от Frame, который находится внизу как обычное окно. такое поведение дает "плавающий" эффект. Hо обязательно ли должно Window плавть поверх других - это совершенно другой вопрос.
Hа Макинтошах Window либо лежит так же как и обычные окна, либо полностью модальное - в зависимости от VM, которую Вы используете. В Java нет легкого способа добиться такого поведения. Если кто-нибудь знает такой способ, пожалуйста, поделитесь.
Могу ли я свернуть/развернуть окно в Java?
В JDK 1.1 не было способа сделать это. В JDK 1.2 эта возможность появилась:
MyFrame.setState( Frame.ICONIFIED );
MyFrame.setState( Frame.NORMAL );
делает это. Установите нужное состояние.
Как узнать, какая кнопка мыши была нажата и сколько раз?
Для обработки событий мыши Вы должны осуществить интерфейс MouseListener либо расширить класс MouseAdapter и чтобы переопределить один из методов обработки событий мыши. Аргумент типа MouseEvent, передаваемый в методы, содержит поля, говорящие о том, какая кнопка нажата, и счетчик нажатий. Используйте что-то вроде:
public void mouseClicked(MouseEvent m) {
boolean leftButtonPush =
(m.getModifiers() & java.awt.event.InputEvent.BUTTON1_MASK) != 0;
boolean centerButtonPush =
(m.getModifiers() & java.awt.event.InputEvent.BUTTON2_MASK) != 0;
boolean rightButtonPush =
(m.getModifiers() & java.awt.event.InputEvent.BUTTON3_MASK) != 0;
int click = m.getClickCount(); // может быть 1, 2, 3 щелчка или больше
Вы можете вызвать m.isPopupTrigger(). Если этот метод возвращает true, то пользователь запросил всплывающее меню. Во многих системах правая кнопка служит для вызова таких меню.
Вы можете перекрыть метод processMouseEvent для Вашего компонента.
public void processMouseEvent(MouseEvent e) {
if (e.isPopupTrigger()) {
// делайте что хотите
}
else
super.processMouseEvent(e);
}
Этот код подходит для JDK 1.1. Кроме того, в JDK 1.2 можно вызвать java.awt.swing.SwingUtilities.isRightMouseButton(MouseEvent me).
Что такое Swing?
Swing - это новая оконная библиотека, включеная в JDK 1.2, и доступная как дополнительная библиотека для JDK 1.1. Swing входит в Java Foundation Classes и поддерживает оконую библиотеку, которая дает разроботчикам создавать компоненты, которые могут иметь изменяемый внешний вид и поведение. С точки зрения архитектуры, Swing расширяет (но не заменяет полностью) Abstract Windowing Toolkit (AWT).
Swing содержит множество компонент, которые можно использовать вместо компонентов AWT (JFrame вместо Frame, JButton вместо Button, JApplet вместо Applet, JPanel вместо Panel и т.п.) Кроме того, есть есть компоненты, не имеющие аналогов в AWT (панели и линейки инструментов, линейки прогресса и др.) Тем не мене, в основе Swing лежит AWT.
Swing позволяет создавать компоненты столь же сложные, как и в платформо-зависимых оконных библиотеках, как, например, MFC - и в соответсви с преимущесвами Java, все это будет работать на любых платформах. Изменяемый внешний вид означает, что компоненты могут иметь одинаковый вид на любой платформе, или же Вы можете сделать так, что окна будут выглядеть в стиле Windows на PC, в стиле Motif - на Unix-станции, либо по выбору пользователя.
Кроме того, Swing подерживает Accessiblity API. Этот API позволяет адаптирующим программам для людей с физическими недостатками напремую взаимодействовать с Java VM и получать информацию о выполняемой программе; это применяется для работы с компонентами. Программы могут затем перевести это в форму, доступную пользователю (например, прочитать вслух текст в окне). Swing не использует платформо-зависимые компоненты, а адаптивные программы расчитаны на опрделенную платформу, Accessiblity API служит мостом между Swing и программой адаптации. Достоинством Accessiblity API является то, что для его поддержки разработчикам нужно сделать совсем немного, они должны сознавать это, если собираются добовлять новые компоненты.
В Swing платформо-зависимыми являются лишь края окна, а также такие вещи, как шрифты и буфферы. Все остальное - композиция, расположение и отрисовка - контролируется программным кодом на Java. Таким образом, одинаковый код создает и управляет интерфейсом пользователя на любой платформе. Swing обеспечивает одинаковое поведение програмыы на разных платформах.
Swing работает с JDK 1.1, скачайте файл swing.jar и добывте его в путь поиска классов. Swing встроен в JDK 1.2, и Javasoft недавно сменила название пакета на javax.swing.