2013-05-28 50 views
2

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

以下是等待光标我得到了下面的代码:

enter image description here

我开发,以满足我上面的要求如下代码:

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); 
     } 

此代码工作良好根据我的要求。但是当我想在点击按钮时在按钮上显示另一个Processing Image Icon时,我得到的结果是相反的。我的意思是当按钮被点击并且页面被加载时,按钮上不显示Processing Image Icon,但是当执行操作并且在页面加载后释放按钮时,应用程序会在按钮上显示Processing Image Icon。

以下是处理图片图标我收到了下面的代码:

enter image description here

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

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是我想要获取处理图像图标的按钮。

如何修改我的代码来定制按钮上的图标,当它被点击并且应用程序正在加载页面时?

回答

1

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

+0

我这里没有使用任何线程,我用了布尔值和方法上的帧像frame.setCursor(waitCursor), frame.setCursor(defaultCursor)你能否建议我基于上述代码开发的代码? –

+0

@JavaDeveloper正如Russsell所说 - 上述方法已被打破,不应使用。它与摆动事件模型相矛盾,因此不会导致期望的结果。 – Howard

+0

您可能还想提及['SwingWorker'](http://docs.oracle.com/javase/7/docs/api/javax/swing/SwingWorker.html)类,它具有'process'和'done '这将自动在EDT上调用。 – Howard

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);