我有一个程序在启动时会做一些工作(在后台线程中),所以我想在填充表时显示一个忙碌的光标片刻。不幸的是,无论我做了什么,如果我的窗口(JFrame
)出现在指针下面,我就无法显示等待光标。我做了一些实验,然后将其跟踪到一个简单的测试用例(下面)。基本上,如果存在JScrollPanel
(例如作为JTable
的父级)作为JFrame
的子级,则只有默认光标才会出现,除非我将指针移出窗口又回来了。
这是可编辑的代码:
package cursortest;
import java.awt.Cursor;
import java.awt.Dimension;
import javax.swing.*;
public class CursorTest extends JFrame {
void initPanel() {
JScrollPane panel = new JScrollPane();
panel.setMinimumSize(new Dimension(500, 500));
panel.setMaximumSize(new Dimension(500, 500));
panel.setPreferredSize(new Dimension(500, 500));
GroupLayout layout = new GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(GroupLayout.Alignment.LEADING)
.addComponent(panel)
);
layout.setVerticalGroup(
layout.createParallelGroup(GroupLayout.Alignment.LEADING)
.addComponent(panel)
);
}
public CursorTest() {
initPanel();
setMinimumSize(new Dimension(500, 500));
setMaximumSize(new Dimension(500, 500));
setPreferredSize(new Dimension(500, 500));
setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
pack();
}
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
java.awt.EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
new CursorTest().setVisible(true);
}
});
}
}
启动程序,以便在窗口出现时,鼠标指针位于窗口的范围内。你可能不得不调整大小来实现这一点(我知道我已经以一种人为的方式强迫这个例子)。
如果未调用initPanel
,则鼠标光标将立即显示为等待光标。
如果调用initPanel
,则鼠标光标将默认显示,直到您将指针移出窗口然后再返回。
此外,如果将JScrollPane
替换为其他类型的窗口小部件,例如JLabel
,则此游标问题不会显示。
任何人都可以帮我解决如何解决这个问题吗?我还想过为小部件设置忙碌光标(我的JScrollPanel
和/或JTable
),但这不起作用。您可以通过添加第panel.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
行来尝试。
哦,我应该提一下,我在Mac上这样做。
答案 0 :(得分:2)
例如
import java.awt.Cursor;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import javax.swing.*;
public class CursorTest extends JFrame {
private static final long serialVersionUID = 1L;
private javax.swing.Timer timer = null;
private JScrollPane scroll;
public CursorTest() {
scroll = new JScrollPane();
scroll.setPreferredSize(new Dimension(400,300));
setTitle("CursorTest");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLayout(new FlowLayout());
add(scroll);
setLocation(100, 100);
pack();
setVisible(true);
start();
}
private void start() {
scroll.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
timer = new javax.swing.Timer(5000, stop());
timer.start();
}
public Action stop() {
return new AbstractAction("Change Cursor Action") {
private static final long serialVersionUID = 1L;
@Override
public void actionPerformed(ActionEvent e) {
timer.stop();
scroll.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
}
};
}
public static void main(String[] args) {
java.awt.EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
new CursorTest().setVisible(true);
}
});
}
}