Не ответ, а объяснение того, что происходит.Возможно, это вызовет идею ...
Проблема в том, что мышь нажимает на кнопку модели кнопки, а mouseReleased фактически меняет выбранное значение модели.
Когда вы выполняете радиокнопку с кодом FocusListener, модель находится в неопределенном состоянии.Даже если вы добавите код FocusListener в конец EDT с помощью invokeLater, он все равно будет выполняться до того, как будет сгенерировано событие mouseReleased.
Ниже показано, как можно кодировать слушатель для обработки этого.Предполагается, что состояние кнопки собирается измениться:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class FocusSSCCE extends JPanel
{
public FocusSSCCE()
{
final JRadioButton radio = new JRadioButton("Radio");
add( radio );
radio.setMnemonic('R');
JTextField textField = new JTextField(10);
add( textField );
JButton button = new JButton("Button");
add( button );
textField.addFocusListener( new FocusAdapter()
{
public void focusLost(FocusEvent e)
{
boolean isSelected = radio.isSelected();
// Assumes selected state will change
if (radio.getModel().isArmed())
isSelected = !isSelected;
System.out.println( isSelected );
}
});
}
private static void createAndShowUI()
{
JFrame frame = new JFrame("FocusSSCCE");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add( new FocusSSCCE() );
frame.pack();
frame.setLocationRelativeTo( null );
frame.setVisible( true );
}
public static void main(String[] args)
{
EventQueue.invokeLater(new Runnable()
{
public void run()
{
createAndShowUI();
}
});
}
}
Однако даже этот подход не может гарантировать работу.Если по какой-то причине пользователь генерирует событие mousePressed на переключателе, и он перемещает мышь от переключателя до отпускания мыши, то выбранное состояние переключателя не изменяется.
Аналогично, дажеВаша первоначальная реализация для сна в течение 250 мсек не может гарантированно работать, поскольку теоретически пользователь может удерживать мышь нажатой более 250 мсек, что также приведет к неправильному значению.
Мой обходной путь для этого должен был сделатьпереключатели не фокусируются
Я не могу придумать лучшего подхода.
Редактировать:
Я только что подумал о диком решении.
textField.addFocusListener( new FocusAdapter()
{
public void focusLost(FocusEvent e)
{
if (e.getOppositeComponent() instanceof JRadioButton)
{
final JRadioButton radio = (JRadioButton)e.getOppositeComponent();
MouseListener ml = new MouseAdapter()
{
public void mouseReleased(MouseEvent e)
{
System.out.println( radio.isSelected() );
radio.removeMouseListener(this);
}
};
radio.addMouseListener( ml );
}
else
System.out.println( radio.isSelected() );
}
});
Обычно ваш код обработки не будет выполняться, пока не будет отпущена мышь, когда вы нажмете переключатель.