单选按钮不会立即改变状态(Radio button doesn't change the s

2019-10-21 10:49发布

在我们的项目我的队友通知书单选按钮不寻常的行为,他的动作监听器里有SwingUtilites.invokeLater电话。 动作监听的Archetecture不允许避免这种呼叫,因为被设计成启动另一个线程,然后有一个切换回AWT线程。

有没有办法解决这个问题? 我的意思是改变显示组件的状态。

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

import javax.swing.ButtonGroup;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.WindowConstants;

public class RadioButtonTest {

public static void main(String[] args) {
    try {
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
    } catch (ClassNotFoundException | InstantiationException | IllegalAccessException
            | UnsupportedLookAndFeelException e1) {
        e1.printStackTrace();
    }
    JFrame frame = new JFrame();
    JPanel panel = new JPanel();
    frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    frame.setSize(200, 200);
    frame.add(panel);
    ButtonGroup group = new ButtonGroup();
    JRadioButton b1 = new JRadioButton("Button 1");
    final JRadioButton b2 = new JRadioButton("Button 2");
    b2.addActionListener(new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent arg0) {
            Runnable action = new Runnable() {

                @Override
                public void run() {
                    try {
                        Thread.sleep(2500);
                    } catch (InterruptedException e) {
                        Thread.currentThread().interrupt();
                        e.printStackTrace();
                    }
                }
            };
            SwingUtilities.invokeLater(action);
        }
    });
    group.add(b1);
    group.add(b2);
    panel.add(b1);
    panel.add(b2);

    frame.setVisible(true);
} 
}

Answer 1:

使用SwingWorker的,试试这个代码:

 public void actionPerformed(ActionEvent arg0) {
       SwingWorker<Object,Object> sw = new SwingWorker<Object,Object>()
       {
            @Override
            protected Object doInBackground() throws Exception
            {
                try {
                     Thread.sleep(2500);
                 } catch (InterruptedException e) {
                     Thread.currentThread().interrupt();
                     e.printStackTrace();
                 }
                 return null;
            }
        };
        sw.execute();
}

的SwingWorker是其上由事件调度线程通过调用执行方法调用的单独的工作线程执行。 SwingUtilities.invokeLater方法只是规定运行方法要在事件调度线程异步执行,因此调用了Thread.sleep内就会冻结事件调度线程影响的GUI。



Answer 2:

它看起来像你想避免重复开始一个长期运行的后台任务。 代替的JRadioButton ,使用父JToggleButton ,并设置它的名字和行动时,后台任务开始取消 。 一个FutureSwingWorker使这个方便。 使用一个相关的例子JButton看到这里 。



文章来源: Radio button doesn't change the state immediately