Java:JScrollPane覆盖JFrame游标设置,但仅在启动时覆盖
我有一个程序要在启动时做一些工作(在后台线程中),所以我想在填充表格时显示一个忙碌的光标几分钟。不幸的是,无论我做了什么,如果我的窗口(Java:JScrollPane覆盖JFrame游标设置,但仅在启动时覆盖,java,swing,jscrollpane,mouse-cursor,Java,Swing,Jscrollpane,Mouse Cursor,我有一个程序要在启动时做一些工作(在后台线程中),所以我想在填充表格时显示一个忙碌的光标几分钟。不幸的是,无论我做了什么,如果我的窗口(JFrame)出现在指针下,我都无法让等待光标出现。我做了一些实验,并跟踪到一个简单的测试用例(如下)。基本上,如果存在JScrollPanel(例如,作为JTable的父级)作为JFrame的子级,则只有默认光标才会出现,除非我将指针移出窗口并返回 以下是可编译代码: package cursortest; import java.awt.Cursor; i
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电脑上做的。例如
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);
}
});
}
}
你的例子行得通,但我无法理解它的根本区别。是布局吗?好的,区别在于光标是在调用setVisible之后设置的。请编辑您的回复,包括对这种差异的简短解释,我会将其标记为已接受的答案。非常感谢。很高兴hepl,但最好阅读此线程(如何将事件Dispash线程拆分为两个或多个操作)并亲自学习,这里有一个关于在将记录添加到JTable期间更改光标的示例谢谢您的链接。我读了它和它指出的一些东西,我学到了很多。我以前不知道玻璃窗。然而,我认为这些不适用于我的情况。我实际上希望UI继续响应输入。忙碌的光标只是表示并非所有的后台工作都已完成,但您仍然可以单击某些内容,这没关系。在我的例子中,我们似乎有一个特定于Mac的bug,其中JScrollPane干扰了其父级的光标,即使它没有设置自己的光标。尽管如此,有人可能认为我使用了错误的视觉提示。但这是完全不同的讨论。:)