Java:JScrollPane重写JFrame游标设置,但仅在启动时

时间:2011-10-04 18:05:16

标签: java swing jscrollpane mouse-cursor

我有一个程序在启动时会做一些工作(在后台线程中),所以我想在填充表时显示一个忙碌的光标片刻。不幸的是,无论我做了什么,如果我的窗口(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上这样做。

1 个答案:

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