2

我想在单击按钮后在按钮上显示处理图标,以使用户了解应用程序正在加载页面,他必须等到它完成。

以下是我为以下代码获得的等待光标:

在此处输入图像描述

我为满足上述要求而开发的代码如下:

 public static boolean waitCursorIsShowing;
 public Cursor waitCursor, defaultCursor;

 waitCursor = new Cursor(Cursor.WAIT_CURSOR);
 defaultCursor = new Cursor(Cursor.DEFAULT_CURSOR);

 waitCursorIsShowing = true;
 if (waitCursorIsShowing)
        {          
            JFrame frame.setCursor(waitCursor);

            -----------------------------------------------
            /* code to load the page/ perform the business logic */
            -----------------------------------------------

            waitCursorIsShowing = false;
            frame.setCursor(defaultCursor);
        }

此代码根据我的要求运行良好。但是,当我想在单击按钮时显示另一个处理图像图标时,我得到的结果是相反的顺序。我的意思是当单击按钮并加载页面时,按钮上不会显示处理图像图标,但是当执行操作并在页面加载后释放按钮时,应用程序会在按钮上显示处理图像图标。

以下是我为以下代码获得的处理图像图标:

在此处输入图像描述

请帮助我在哪里编码不正确。以下是修改后的代码。

public static boolean waitCursorIsShowing;
 public Cursor waitCursor, defaultCursor;

 waitCursor = new Cursor(Cursor.WAIT_CURSOR);
 defaultCursor = new Cursor(Cursor.DEFAULT_CURSOR);

 waitCursorIsShowing = true;
 if (waitCursorIsShowing)
        {          

            URL url = getClass().getResource("/Images/loader8.gif");
            b4.setText("Loading");
            b4.setIcon(new ImageIcon(url));

            -----------------------------------------------
            /* code to load the page/ perform the business logic */
            -----------------------------------------------

            waitCursorIsShowing = false;
            b4.setIcon(new ImageIcon());
                b4.setText("Submit");
        }

b4 是我想要获取处理图像图标的按钮。

如何修改我的代码以在单击按钮并且应用程序正在加载页面时自定义按钮上的图标?

4

2 回答 2

1

您可以使用SwingWorker

    final JFrame frame = new JFrame("Example");
    final JButton button = new JButton("Please, press me!");
    frame.getContentPane().add(button, BorderLayout.NORTH);

    final JTextPane pane = new JTextPane();
    frame.getContentPane().add(pane);

    final Cursor defaultCursor = Cursor.getDefaultCursor();
    final Cursor busyCursor = Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR);
    final ImageIcon loadingIcon = new ImageIcon(ImageIO.read(getClass().getResource("/Images/loader8.gif")));

    button.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            button.setIcon(loadingIcon);
            frame.setCursor(busyCursor);

            SwingWorker<String, Object> worker = new SwingWorker<String, Object>() {
                @Override
                public String doInBackground() throws InterruptedException {
                    // do some work...
                    StringBuilder sb = new StringBuilder();
                    for (int i = 0; i < 25; i++) {
                        sb.append((char)(i + 65));
                        Thread.sleep(25);
                    }
                    return sb.toString();
                }

                @Override
                protected void done() {
                    try {
                        //set result of doInBackground work
                        pane.setText(get());
                        frame.setCursor(defaultCursor);
                        button.setIcon(null);

                    } catch (Exception ignore) {
                    }
                }
            };
            worker.execute();
        }
    });

    frame.setSize(new Dimension(400, 300));
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setVisible(true);
于 2013-05-28T14:49:01.550 回答
1

请记住,事件都在事件调度线程上处理,该线程与处理绘画的线程相同。如果您在该线程上加载页面,则在加载完成之前框架将无法重新绘制。相反,在后台线程上进行加载,并在SwingUtilities.invokeLater()完成后使用调用将图标设置回来。

于 2013-05-28T13:53:21.090 回答