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

有一个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);

}

以上是 触发setCursor方法后光标图标未更改 的全部内容, 来源链接: utcz.com/qa/420528.html

回到顶部