Java 更新Swing UI内部按钮单击事件

Java 更新Swing UI内部按钮单击事件,java,swing,Java,Swing,我有一个swing应用程序。我正在试着显示正在加载的玻璃窗 从数据库中读取数据。但这种行为并不是我所期望的 public class Sample { JFrame frame; JPanel loadingPanel; JLabel iconLabel; JPanel glassPane; pr

我有一个swing应用程序。我正在试着显示正在加载的玻璃窗 从数据库中读取数据。但这种行为并不是我所期望的

public class Sample {
                    JFrame frame;
                    JPanel loadingPanel;
                    JLabel iconLabel;
                    JPanel glassPane;

                    private PropertyChangeSupport changeListeners = new PropertyChangeSupport(this);

                    public static void main(String[] args) {
                        EventQueue.invokeLater(new Runnable() {
                            public void run() {
                                try {
                                    Sample window = new Sample ();
                                    window.frame.setVisible(true);
                                } catch (Exception e) {
                                    e.printStackTrace();
                                }
                            }
                        });
                    }

                    public Sample () {
                        initialize();
                    }


                    private void initialize() {
                        frame = new JFrame();
                        frame.setBounds(100, 100, 450, 300);
                        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

                        JPanel panel = new JPanel();
                        panel.setSize(new Dimension(500,500));
                        frame.getContentPane().add(panel);
                        panel.setLayout(null);

                        // ---------Select button--------------------------------
                        JButton btnSelect = new JButton("Select");
                        btnSelect.addActionListener(loadDataActionListner);
                        btnSelect.setBounds(132, 7, 137, 32);
                        btnSelect.setFocusPainted(false);
                        panel.add(btnSelect);


                        glassPane = new GlassPanel();
                        glassPane.setOpaque(false);
                        glassPane.setLayout(new GridBagLayout());
                        glassPane.add(new JLabel("loading... "));
                        frame.setGlassPane(glassPane);

                        ChangeListener listener = new ChangeListener(this);
                        changeListeners.addPropertyChangeListener(listener);
                    }

                    public void changeVisibility(boolean  visibility){
                       glassPane.setVisible(visibility);
                       frame.validate();
                       frame.repaint();
                    }


                    ActionListener loadDataActionListner = new ActionListener() {
                        public void actionPerformed(ActionEvent e) {
                          SwingUtilities.invokeLater(new Runnable() {
                          @Override
                          public void run() {
                            JFileChooser fileChooser = new JFileChooser();
                            fileChooser.setCurrentDirectory(new File(System.getProperty("user.home")));
                            int result = fileChooser.showOpenDialog(frame);
                            if (result == JFileChooser.APPROVE_OPTION) {

                                changeListeners.firePropertyChange("visibility", false, true); //Line 01
                                Response response = DataManager.getInstance().loadData("myfile.txt");
                                changeListeners.firePropertyChange("visibility", true, false);

                            }
                           }
                          });

                        }
                    };
                }

        public class GlassPaneUpdateWorker extends SwingWorker<Object, Boolean> {

            private boolean visibility;
            private Sample sample;

            public GlassPaneUpdateWorker(Sample  sample) {
                this.sample = sample;
            }

            @Override
            protected Object doInBackground() throws Exception {
                publish(visibility);
                return null;
            }

            @Override
            protected void process(List<Boolean> chunks) {
                if (chunks != null && !chunks.isEmpty()) {
                    sample.changeVisibility(chunks.get(0));
                }
            }

            protected void changeVisibility(boolean visibility) {
                this.visibility = visibility;
            }

        }

        public class ChangeListener  implements PropertyChangeListener{

            private Sample sample;

            public ChangeListener(Sample sample) {
                this.sample =  sample;
            }

            @Override
            public void propertyChange(PropertyChangeEvent evt) {
                GlassPaneUpdateWorker glassPaneUpdater = new GlassPaneUpdateWorker(sample);
                glassPaneUpdater.changeVisibility((Boolean)evt.getNewValue());
                glassPaneUpdater.execute();
            }

        }
公共类示例{
JFrame框架;
JPanel装载面板;
JLabel-iconLabel;
JPanel玻璃窗格玻璃;
私有PropertyChangeSupport changeListeners=新的PropertyChangeSupport(此);
公共静态void main(字符串[]args){
invokeLater(新的Runnable(){
公开募捐{
试一试{
样本窗口=新样本();
window.frame.setVisible(true);
}捕获(例外e){
e、 printStackTrace();
}
}
});
}
公众样本(){
初始化();
}
私有void初始化(){
frame=新的JFrame();
机架立根(100450300);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel面板=新的JPanel();
面板设置尺寸(新尺寸(500500));
frame.getContentPane().add(面板);
panel.setLayout(空);
//------选择按钮--------------------------------
JButton btnSelect=新JButton(“选择”);
btnSelect.addActionListener(loadDataActionListner);
b选择立根(132、7、137、32);
b选择setFocusPainted(假);
面板。添加(b选择);
glassPane=新的GlassPanel();
玻璃材质窗格玻璃。设置不透明(假);
setLayout(新的GridBagLayout());
玻璃窗格。添加(新的JLabel(“加载…”);
框架。设置玻璃窗格(玻璃窗格);
ChangeListener listener=新的ChangeListener(此);
addPropertyChangeListener(监听器);
}
公共void变更可见性(布尔可见性){
玻璃材质窗格玻璃。设置为可见(可见性);
frame.validate();
frame.repaint();
}
ActionListener loadDataActionListner=新ActionListener(){
已执行的公共无效操作(操作事件e){
SwingUtilities.invokeLater(新的Runnable(){
@凌驾
公开募捐{
JFileChooser fileChooser=新的JFileChooser();
fileChooser.setCurrentDirectory(新文件(System.getProperty(“user.home”));
int result=fileChooser.showOpenDialog(框架);
if(result==JFileChooser.APPROVE\u选项){
changeListeners.firePropertyChange(“可见性”,false,true);//第01行
Response-Response=DataManager.getInstance().loadData(“myfile.txt”);
firePropertyChange(“可见性”,真,假);
}
}
});
}
};
}
公共类GlassPaneUpdateWorker扩展SwingWorker{
私有布尔可见性;
私人样本;
公共玻璃器皿更新工人(样本){
这个样本=样本;
}
@凌驾
受保护对象doInBackground()引发异常{
发布(可见性);
返回null;
}
@凌驾
受保护的无效进程(列表块){
if(chunks!=null&&!chunks.isEmpty()){
sample.changeVisibility(chunks.get(0));
}
}
受保护的void changeVisibility(布尔可见性){
这个.可见性=可见性;
}
}
公共类ChangeListener实现PropertyChangeListener{
私人样本;
公共ChangeListener(示例){
这个样本=样本;
}
@凌驾
公共作废属性更改(属性更改事件evt){
GlassPaneUpdateWorker glassPaneUpdater=新的GlassPaneUpdateWorker(样本);
glassPaneUpdater.changeVisibility((布尔)evt.getNewValue());
glassPaneUpdater.execute();
}
}

在actionPerformed方法中执行所有代码块后,将显示加载玻璃面板。如何更改此设置,以便在执行“第01行”后立即更新UI?

我可以使用SwingWorker完成此操作,如下所示,无需任何侦听器

ActionListener loadDataActionListner = new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            SwingUtilities.invokeLater(new Runnable() {
                @Override
                public void run() {
                    JFileChooser fileChooser = new JFileChooser();
                    fileChooser.setCurrentDirectory(new File(System.getProperty("user.home")));
                    int result = fileChooser.showOpenDialog(frame);
                    if (result == JFileChooser.APPROVE_OPTION) {
                        SwingWorker<?, ?> worker = new SwingWorker<Void, Integer>() {
                            protected Void doInBackground() {
                                showLoadingPanel();
                                Response response = DataManager.getInstance().loadData("myfile.txt");
                                hideLoadingPanel();
                                //Do something..
                                return null;
                            }
                        };
                        worker.execute();

                    }
                }
            });

        }
    };
ActionListener loadDataActionListner=new ActionListener(){
已执行的公共无效操作(操作事件e){
SwingUtilities.invokeLater(新的Runnable(){
@凌驾
公开募捐{
JFileChooser fileChooser=新的JFileChooser();
fileChooser.setCurrentDirectory(新文件(System.getProperty(“user.home”));
int result=fileChooser.showOpenDialog(框架);
if(result==JFileChooser.APPROVE\u选项){
SwingWorker worker=新SwingWorker(){