проблема с раздвоением фокуса, двойной фокус
От: antonnov  
Дата: 08.07.03 07:29
Оценка:
Описание проблемы:
Я хочу на некоторую кнопочку повесить вывод двух диалоговых окошек. После отображения второго МеssageDialog (cм. листинг ниже) в фокусе оказывается и кнопочка "ОК" в диалоговом окошке и кнопочка "test" в окошке программы.

После закрытия MessageDialog фокус устанавливается на tfField а кнопка "test" остается в рамочке фокуса и фокус пsперестает на нее переходить по клавише "tab".

На следующей итерации таким же образом "зависает" tfField и т.д. Таким образом фокусы размножаются .

Листинг:

final JButton btn = new JButton("test");
        btn.addActionListener(new AbstractAction(){
            public void actionPerformed(ActionEvent e) {
                JOptionPane.showMessageDialog(null, "AAAAAA");
                JOptionPane.showMessageDialog(null, "AAAAAA");
                tfField.transferFocus(); // cущественная строчка, фокус надо переставлять 
                                                     // на другую компоненту
              }               
            });



Мои решения:
Я придумал два способа борьбы с этим "багом". Оба меня не устраивают. Первый помещать каждый ShowMessage диалог в отдельный поток. Второй скрывать основную форму,
setVisible(false)
в начале и
setVisible(true)
в конце метода actionPerformed().

В Java не большой специалист, если кто знает в чем дело -- помогите плз. :D
Re: проблема с раздвоением фокуса, двойной фокус
От: antonnov  
Дата: 16.07.03 15:44
Оценка:
Ну неужели ни кто не сталкивался с такой проблемой подскажите в чем дело
Re[2]: проблема с раздвоением фокуса, двойной фокус
От: Сан Саныч Россия  
Дата: 17.07.03 06:55
Оценка:
Здравствуйте, antonnov, Вы писали:

A>Ну неужели ни кто не сталкивался с такой проблемой подскажите в чем дело


Вопрос задан немного непонятно.... может тебе надо сделать так


import javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JOptionPane;
import javax.swing.JTextField;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;

public class Main extends JDialog {
    public static void main(String[] args) {
        final JTextField tfField = new JTextField(10);
        final JButton btn = new JButton("test");
        btn.addActionListener(new AbstractAction() {
            public void actionPerformed(ActionEvent e) {
                JOptionPane.showMessageDialog(null, "AAAAAA");
                JOptionPane.showMessageDialog(null, "AAAAAA");
                tfField.requestFocus();
            }
        });

        Main main = new Main();
        main.getContentPane().setLayout(new FlowLayout());
        main.getContentPane().add(tfField);
        main.getContentPane().add(btn);
        main.pack();
        main.show();

    }
}
Re[3]: проблема с раздвоением фокуса, двойной фокус
От: antonnov  
Дата: 17.07.03 07:47
Оценка:
Здравствуйте, Сан Саныч, Вы писали:

СС>Здравствуйте, antonnov, Вы писали:


A>>Ну неужели ни кто не сталкивался с такой проблемой подскажите в чем дело


СС>Вопрос задан немного непонятно.... может тебе надо сделать так



СС>
СС>import javax.swing.AbstractAction;
СС>import javax.swing.JButton;
СС>import javax.swing.JDialog;
СС>import javax.swing.JOptionPane;
СС>import javax.swing.JTextField;
СС>import java.awt.FlowLayout;
СС>import java.awt.event.ActionEvent;

СС>public class Main extends JDialog {
СС>    public static void main(String[] args) {
СС>        final JTextField tfField = new JTextField(10);
СС>        final JButton btn = new JButton("test");
СС>        btn.addActionListener(new AbstractAction() {
СС>            public void actionPerformed(ActionEvent e) {
СС>                JOptionPane.showMessageDialog(null, "AAAAAA");
СС>                JOptionPane.showMessageDialog(null, "AAAAAA");
СС>                tfField.requestFocus();
СС>            }
СС>        });

СС>        Main main = new Main();
СС>        main.getContentPane().setLayout(new FlowLayout());
СС>        main.getContentPane().add(tfField);
СС>        main.getContentPane().add(btn);
СС>        main.pack();
СС>        main.show();

СС>    }
СС>}
СС>


Я откомпилировал, твой пример и имею на нем все тот же баг (рис1).
После нажатия на кнопку "Test" кнопка остается в рамочке а сам фокус переходит на TextField и на самом деле кнопка в некотором смысле подвисает т.к. на нее перестает переходить фокус при нажатии клавиши tab.
На самом деле создав более сложное окно баг будет более наглядный (рис.2).

Re[3]: проблема с раздвоением фокуса, двойной фокус
От: antonnov  
Дата: 17.07.03 07:50
Оценка:
Да забыл сказать баг должен воспроизводиться на JDK 1.3.1_06
Re[4]: проблема с раздвоением фокуса, двойной фокус
От: TRV  
Дата: 17.07.03 13:19
Оценка: 3 (1)
Здравствуйте, antonnov, Вы писали:

СС>> tfField.requestFocus();


Попробуйте вместо этой строки вызвать следующий метод, передав ему в качестве аргумента текстфилд:
public static void requestFocusLater(final java.awt.Component component) {
    javax.swing.SwingUtilities.invokeLater(
        new Runnable() {
            public void run() {
                component.requestFocus();
            }
        }
    );
}
... << RSDN@Home 1.1 beta 1 >>
WBR, Руслан
Re[5]: проблема с раздвоением фокуса, двойной фокус
От: antonnov  
Дата: 17.07.03 16:29
Оценка:
Здравствуйте, TRV, Вы писали:

TRV>Здравствуйте, antonnov, Вы писали:


СС>>> tfField.requestFocus();


TRV>Попробуйте вместо этой строки вызвать следующий метод, передав ему в качестве аргумента текстфилд:

TRV>
TRV>public static void requestFocusLater(final java.awt.Component component) {
TRV>    javax.swing.SwingUtilities.invokeLater(
TRV>        new Runnable() {
TRV>            public void run() {
TRV>                component.requestFocus();
TRV>            }
TRV>        }
TRV>    );
TRV>}
TRV>


Большое спасибо , в жизни бы не нашел этот метод!! действительно все работает и в одном потоке. Круто
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.