当前位置: 首页 > 面试题库 >

触发setCursor方法后光标图标未更改

姚骁
2023-03-14
问题内容

有一个JTable在我的可调整大小的标题列的应用程序。通常,当我将光标移到表标题上方以调整大小时,光标图标会更改为调整大小的箭头,例如<->。

但是在以下情况下情况有所不同。

在同一按钮操作中Frame,在执行操作期间,我将光标设置为忙碌图标,并在完成操作后使用Container.setCurosr(Cursor cursor)方法将其更改为默认光标。

有时,如果将光标移到调整大小的表标题上,则在执行按钮操作后,光标图标不会更改为调整大小箭头,光标也不会更改。

可以将其视为Java Swing中的错误,还是可以解决此问题?

更新:附带示例代码

import java.util.*;  
import java.awt.*;  
import javax.swing.*;  
import java.awt.event.*;

public class ColumnResizeIconTest extends JFrame {

JScrollPane scrollPane;
JTable table;
JButton button;

public ColumnResizeIconTest() {
    setLayout(new BorderLayout());
    addComponents();
    setSize(300,300);
}

private void addComponents() {
    addButton();
    addTable();
}

private void addButton() {
    button = new JButton("Click Me");
    button.addActionListener( new ActionListener() {
        public void actionPerformed(ActionEvent ae) {
            setWaitCursor();
            for(int i=0; i<2000; i++) {
                System.out.print(i);
            }
            setDefaultCursor();
        }
    });
    add(button, BorderLayout.NORTH);
}

private void addTable() {
    scrollPane = new JScrollPane(createTable());
    add(scrollPane, BorderLayout.CENTER);
}

private JTable createTable() {
    Object[][] cellData = { { "1-1", "1-2","1-3" }, { "2-1", "2-2", "2-3" }, { "3-1", "3-2", "3-3" } };
    String[] columnNames = { "column1", "column2", "column3" };
    table = new JTable(cellData, columnNames);
    return table;
}

private void setWaitCursor() {
    Container container = getContentPane();
    setWaitCursor(container);
}

private void setWaitCursor(Container container) {
    for(int iCount = 0; iCount < container.getComponentCount(); iCount++) {
        Component child = (Component) container.getComponent(iCount);
        if(child instanceof Container) {
            setWaitCursor((Container) child);
        } else {
            child.setCursor(new Cursor(Cursor.WAIT_CURSOR));
        }
    }
    container.setCursor(new Cursor(Cursor.WAIT_CURSOR));
}

private void setDefaultCursor() {
    Container container = getContentPane();
    setDefaultCursor(container);
}

private void setDefaultCursor(Container container) {
    for(int iCount = 0; iCount < container.getComponentCount(); iCount++) {
        Component child = (Component) container.getComponent(iCount);
        if(child instanceof Container) {
            setDefaultCursor((Container) child);
        } else {
            child.setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
        }
    }
    container.setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
}

public static void main(String[] argv) throws Exception {
    ColumnResizeIconTest test = new ColumnResizeIconTest();
    test.setVisible(true);
}
}

单击按钮几次,然后尝试调整表格列的大小。光标卡在默认光标上。


问题答案:

正如我的评论中已经提到的那样:重新/设置游标并不是一件容易的事,甚至对于单个组件也不是很简单的:-)基本问题(在递归游标设置中等待)是假设所有组件
具有默认值光标。

如表头所示,这种假设是不正确的:在该组件上,“默认”是defaultCursor或resizeCursor,具体取决于鼠标的位置。另外,内部光标切换不是很聪明:它不检查状态(从我的头顶看,前一阵子被这个事实击中了:-)

不能完全确定要达到的目标,因此没有具体解决方案,除了完全删除递归设置外,很难正确地做到这一点。选项可能是

  • 使(框架根窗格的)glassPane可见,并在其上设置waitCursor
  • 在较小的区域上使用JLayer(jdk7)或JXLayer(jdk6),然后在该区域上设置waitCursor
  • 在某个地方使用JProgressBar或JXBusyLabel(在SwingX项目中)使用较少干扰的可视化

附录 (@mKorbel :-)

这个问题很容易重现,只需对OP
SSCCE稍作更改(谢谢!):如下更改addButton方法,然后单击按钮,在显示等待光标的同时,将鼠标移到标题中,然后另一列(跨列边界)。这样做多次将导致标题上出现不可预测的游标…

private void addButton() {
    button = new JButton("Click Me");
    final ActionListener off = new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent e) {
            setDefaultCursor();
            button.setEnabled(true);
        }

    };
    button.addActionListener( new ActionListener() {
        public void actionPerformed(ActionEvent ae) {
            setWaitCursor();
            button.setEnabled(false);
            Timer timer = new Timer(2000, off);
            timer.setRepeats(false);
            timer.start();
        }
    });

    add(button, BorderLayout.NORTH);
}


 类似资料:
  • 我有一个组件如下所示: 目前,我使用的是圆形薄图标。我想更改它,以便每次单击图标时,它都会更改为圆点图标。比如单选按钮。不过,我不太清楚如何做到这一点。 https://snack.expo.io/toTSYc2fD 我希望能够选择多个/取消选择选项。我不想在所有字段上同时应用相同的规则。 注意:onPress功能也可以直接用于图标,而不是TouchableOpacity(尽管不是首选)

  • 问题内容: 我在JList中有一个单词列表。每次将鼠标光标指向一个单词时,我都希望光标变为手形光标。现在我的问题是该怎么做? 有人可以帮我解决这个问题吗? 问题答案: 在JList上使用MouseMotionListener来检测鼠标何时输入,然后调用将其转换为。 样例代码:

  • 我有一个子类JPanel的PointPanel,我想在其中实现以下行为:如果鼠标悬停在实例上,按下shift键,鼠标光标变为手光标;如果松开shift键,鼠标光标将变回默认光标。 为了实现这一点,我尝试在构造函数中添加一个: 这种方法不起作用。 包含此面板的窗口应该具有焦点,因为它是应用程序的唯一可见窗口。 我错过了什么?

  • 我使用的是spring boot、kotlin和junit5。我有一个测试类,当我在未触发所有函数之前使用RunWith(SpringRunner::class)@时,但当我删除该类时,它会给lateinit字段带来错误。

  • 光标组件允许我们通过点击和凝视与实体交互。光标组件被用于 光线投射(raycaster)来实现: 监听鼠标点击事件和基于凝视的行为。 仅捕获第一个相交实体。 发出特殊的鼠标和悬停事件(例如,与鼠标向下/向上/进入/离开相关)。 有更多的悬停状态。 当鼠标单击时,与光标相交的最近可见实体(如果有)将发出 单击事件。注意光标组件只是应用了光线投射行为。要为光标提供形状或外观,可以应用 geometry

  • 我尝试了几乎所有的方法,但是鼠标拖动事件没有触发,就像这里解释的那样: https://openjfx.io/javadoc/11/javafx.graphics/javafx/scene/input/MouseDragEvent.html 下面是一个简单的示例,您可以尝试一下(我在JavaFX11.0.2中使用Java11): 我想通过在或中获取的引用。有许多嵌套窗格等,因为我想保持原来的项目布