将默认光标更改为忙光标无法正常工作

问题描述 投票:1回答:2

[经过多次尝试使JProgressBar正常工作后,我终于成功实现了自己的目标。我使用了@MadProgrammeradvice,并使用了SwingWorker最终使程序按我的意愿工作。

现在,我希望光标变为BUSY_CURSOR当我的JProgressBar从0%变为100%时。我搜索了一下,发现

setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));

是执行此操作的代码。我已经尝试过了,但是没有按预期工作。

相关代码段:

JProgressBar progress;
JButton button;     
JDialog dialog;      //Fields of my GUI class

progress=new JProgressBar(JProgressBar.HORIZONTAL,0,100);
button=new JButton("Done");
dialog=new JDialog();             //Done from methods

progress.setValue(0);
progress.setStringPainted(true);
progress.setBorderPainted(true);  //Also done from methods

button.addActionListener(this);   //Also done from methods

dialog.setLayout(new FlowLayout(FlowLayout.CENTER));
dialog.setTitle("Please wait...");
dialog.setBounds(475,150,250,100);
dialog.setModal(true);            //Also done from methods

dialog.add(new JLabel("Loading..."));
dialog.add(progress);             //Also done from methods

这是actionPerformed方法:

public void actionPerformed(ActionEvent e)
{
    setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));

    Task task=new Task();
    task.addPropertyChangeListener(this);
    task.execute();
    dialog.setVisible(true);
}

propertyChange方法:

public void propertyChange(PropertyChangeEvent evt) {
    if("progress" == evt.getPropertyName()){
        int progressnum = (Integer) evt.getNewValue();
        progress.setValue(progressnum);
    }
}

和嵌套类Task

   class Task extends SwingWorker<Void, Void> {
        /*
         * Main task. Executed in background thread.
         */
        @Override
        public Void doInBackground() {
            int progressnum = 0;
            setProgress(0);

            while (progressnum < 100) {
                try {
                    Thread.sleep(10);
                } catch (InterruptedException ex) {
                    System.err.println("An error occured:"+ex);
                    ex.printStackTrace();
                }

                progressnum ++;
                setProgress(Math.min(progressnum, 100));
            }
            return null;
        }

        /*
         * Executed in event dispatching thread
         */
        @Override
        public void done() {
            //setCursor(null); //turn off the wait cursor
            setCursor(Cursor.getDefaultCursor()); //Is this one or the one above it right?
            dialog.dispose();
            progress.setValue(progress.getMinimum());
        }
    }

当我按button时,将出现带有JProgressBar的JDialog,并且JProgressBar从0%变为100%。在此期间,需要将光标更改为BUSY_CURSOR(忙光标),并且当JProgressBar达到100%时,普通光标(NORMAL_CURSOR)需要恢复。

问题是,当我按button时,光标变为忙碌光标一秒钟,然后又变回原来的光标。我希望光标忙到JProgressBar达到100%。

我已经添加了代码,可以在actionPerformed方法中将光标转换为忙光标,并在嵌套类doneTask方法中恢复普通光标。请注意,我还包括了必要的软件包。

  • 导致问题的原因是什么?
  • 我该如何解决?
  • 我应该使用

    setCursor(null);
    

    setCursor(Cursor.getDefaultCursor());
    

    要恢复光标?

java swing cursor swingworker jprogressbar
2个回答
1
投票

当您在setCursor()上调用JFrame时,它仅对框架有效,而对对话框无效。同样,当您在setCursor()上调用JDialog时,它仅对对话框有效,对框架无效。出现问题:您没有为对话框设置光标,对吧?

我不确定setCursor(null)是否比setCursor(Cursor.getDefaultCursor())更安全。 :p


1
投票

创建无模式对话框并使用工作线程的荣誉,这将改善用户体验,并减少感知的延迟。考虑在工作程序启动时将MouseListener添加到对话框。在MouseListener的实现中显示WAIT_CURSOR,并在mouseEntered()的实现中恢复默认值。在mouseExited()中删除监听器。当用户的注意力转移到工作人员正在运行的对话框上时,这将使进度和光标的视觉提示重合。

© www.soinside.com 2019 - 2024. All rights reserved.