Здравствуйте, 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 >>
Описание проблемы:
Я хочу на некоторую кнопочку повесить вывод двух диалоговых окошек. После отображения второго Ме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
Ну неужели ни кто не сталкивался с такой проблемой

подскажите в чем дело
Здравствуйте, 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();
}
}
Здравствуйте, Сан Саныч, Вы писали:
СС>Здравствуйте, 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).

Да забыл сказать баг должен воспроизводиться на JDK 1.3.1_06
Здравствуйте, 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>
Большое спасибо

, в жизни бы не нашел этот метод!!

действительно все работает и в одном потоке. Круто