Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Установка фокуса, Не работает метод requestFocus() 
V
    Опции темы
Terentich
Дата 19.3.2008, 10:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 24.11.2007

Репутация: нет
Всего: нет



Добрый день!
Не могу передать фокус на требуемый мне компонент в диалоге. После вызова метода requestFocus(), фокус не переходит куда следует. Всё работает только, если перед requestFocus() вызвать метод pack(), но я не могу использовать pack(). Приведу демонстрационный пример, где не работает requestFocus() без pack():

Код

package test;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class DialogFocus extends JFrame {
    private static final long    serialVersionUID    = 1L;
    private JFrame parent = this;
    
    public DialogFocus() {
        setSize(new Dimension(300, 200));
        setDefaultCloseOperation(EXIT_ON_CLOSE);

        JButton button = new JButton("Dialog");
        button.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                new Dialog(parent, true);        
            }
        });
        
        getContentPane().add(button, BorderLayout.SOUTH);
        setVisible(true);
    }

    public static void main(String[] args) {
        new DialogFocus();
    }
}

class Dialog extends JDialog {
    private static final long    serialVersionUID    = 1L;

    public Dialog(JFrame _parent, boolean _modal) {
        super(_parent, _modal);
        setSize(new Dimension(300, 100));

        JButton button3 = new JButton("button3");

        JPanel panel = new JPanel();
        panel.add(new JButton("button1"));
        panel.add(new JButton("button2"));
        panel.add(button3);

        getContentPane().add(panel, BorderLayout.SOUTH);

        setVisible(true);
        button3.requestFocus();
    }
}


Итак, вопрос: как передать фокус компоненту без вызова метода pack()? И каким образом правильно передавать фокус?

Это сообщение отредактировал(а) Terentich - 19.3.2008, 10:35
PM MAIL   Вверх
LSD
Дата 19.3.2008, 11:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 38
Всего: 538



А чем тебе мешает pack()? Только изменением размеров?
Просто пока окно не Displayable фокус передаваться не будет.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Terentich
Дата 19.3.2008, 11:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 24.11.2007

Репутация: нет
Всего: нет



Да, pack() мешает именно изменением размеров. Неужели нельзя без него обойтись???
Я так понимаю, что его следует вызывать перед установкой фокуса именно для реализации компонента ("realized"). Можно сделать это другим способом?
PM MAIL   Вверх
LSD
Дата 19.3.2008, 11:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 38
Всего: 538



Цитата(Terentich @  19.3.2008,  11:15 Найти цитируемый пост)
Да, pack() мешает именно изменением размеров.

Ну так и в чем проблема:
Код

Rectangle bounds = frame.getBounds();
frame.pack();
frame.setBounds(bounds);


Цитата(Terentich @  19.3.2008,  11:15 Найти цитируемый пост)
Неужели нельзя без него обойтись???

Фрейм надо сделать Displayable, это можно сделать либо pack(), либо setVisible(true).


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Terentich
Дата 19.3.2008, 11:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 24.11.2007

Репутация: нет
Всего: нет



Цитата
Код

Rectangle bounds = frame.getBounds();
frame.pack();
frame.setBounds(bounds);

Спасибо, но довольно странно, что приходится действовать именно таким способом. 

Цитата
Фрейм надо сделать Displayable, это можно сделать либо pack(), либо setVisible(true).

В примере передаю фокус после setVisible(true) для диалога. Или нужно запрашивать фокус для кнопки после вызова setVisible(true) в основном фрейме?  smile  
PM MAIL   Вверх
LSD
Дата 19.3.2008, 12:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 38
Всего: 538



Дык это же модальный диалог, и возврат из метода setVisible(true) происходит только после закрытия окна, и значит метод button3.requestFocus() будет вызван только после того как окно будет закрыто.

Вообще для управления фокусом используются другие средства: Customizing Focus Traversal.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Terentich
Дата 19.3.2008, 12:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 24.11.2007

Репутация: нет
Всего: нет



Цитата
Дык это же модальный диалог, и возврат из метода setVisible(true) происходит только после закрытия окна, и значит метод button3.requestFocus() будет вызван только после того как окно будет закрыто.

Ступил.  smile 

Спасибо за ответы.  smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   jk1
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, jk1.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: GUI и Java FX приложения | Следующая тема »


 




[ Время генерации скрипта: 0.0820 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.