触发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