Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:JScrollPane覆盖JFrame游标设置,但仅在启动时覆盖_Java_Swing_Jscrollpane_Mouse Cursor - Fatal编程技术网

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干扰了其父级的光标,即使它没有设置自己的光标。尽管如此,有人可能认为我使用了错误的视觉提示。但这是完全不同的讨论。:)