java.awt弹出表格_java - jcombobox作为单元格编辑器java.awt.IllegalComponentStateException:必须在屏幕上显示组件以确定其位置 - 堆栈内存...

作者在使用自定义JComboBox作为JTable单元格编辑器时遇到问题,当尝试通过键盘打开下拉列表时,会触发非法组件状态异常。已尝试设置属性但未解决问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我使用自定义JComboBox作为JTable中的单元格编辑器。 当用户使用键盘控件进入单元格时,它会尝试打开弹出窗口。 这会导致以下错误:

java.awt.IllegalComponentStateException: component must be showing on the screen to determine its location

at java.awt.Component.getLocationOnScreen_NoTreeLock(Component.java:1964)

at java.awt.Component.getLocationOnScreen(Component.java:1938)

at javax.swing.JPopupMenu.show(JPopupMenu.java:887)

at javax.swing.plaf.basic.BasicComboPopup.show(BasicComboPopup.java:191)

at javax.swing.plaf.basic.BasicComboBoxUI.setPopupVisible(BasicComboBoxUI.java:859)

at javax.swing.JComboBox.setPopupVisible(JComboBox.java:796)

我看过一些文章说这是一个已知问题,解决方法是设置:

comboBox.putClientProperty("JComboBox.isTableCellEditor", Boolean.TRUE);

但这并没有帮助。 无论如何这应该做什么?

我读过的关于这个的所有主题和文章对于问题的本质都非常模糊。

有没有人对这个问题出现的原因有什么了解? 我的组合框是非常自定义的,所以它有助于理解问题的基础,所以我可以修复代码。

这是在捕获的组合框上的焦点获取事件上触发并调用setPopupVisible(true);

public void focusGained(java.awt.event.FocusEvent e)

{

//if focus is gained then make sure we show the popup if it is suppose to be visible

setPopupVisible(true);

//and highlight the selected text if any

comboTextEditor.setCaretPosition(comboTextEditor.getText().length());

comboTextEditor.moveCaretPosition(0);

}

顺便说一句,我在Java 1.7_40中获得与Java 1.6_45相同的结果

完整堆栈跟踪:

Exception in thread "AWT-EventQueue-1" java.awt.IllegalComponentStateException: component must be showing on the screen to determine its location

at java.awt.Component.getLocationOnScreen_NoTreeLock(Component.java:1964)

at java.awt.Component.getLocationOnScreen(Component.java:1938)

at javax.swing.JPopupMenu.show(JPopupMenu.java:887)

at javax.swing.plaf.basic.BasicComboPopup.show(BasicComboPopup.java:191)

at javax.swing.plaf.basic.BasicComboBoxUI.setPopupVisible(BasicComboBoxUI.java:859)

at javax.swing.JComboBox.setPopupVisible(JComboBox.java:796)

at com.mbs.generic.view.swing.combobox.AutoCompleteComboBox$1.focusGained(AutoCompleteComboBox.java:185)

at java.awt.AWTEventMulticaster.focusGained(AWTEventMulticaster.java:203)

at java.awt.Component.processFocusEvent(Component.java:6179)

at java.awt.Component.processEvent(Component.java:6046)

at java.awt.Container.processEvent(Container.java:2039)

at java.awt.Component.dispatchEventImpl(Component.java:4653)

at java.awt.Container.dispatchEventImpl(Container.java:2097)

at java.awt.Component.dispatchEvent(Component.java:4481)

at java.awt.KeyboardFocusManager.redispatchEvent(KeyboardFocusManager.java:1848)

at java.awt.DefaultKeyboardFocusManager.typeAheadAssertions(DefaultKeyboardFocusManager.java:901)

at java.awt.DefaultKeyboardFocusManager.dispatchEvent(DefaultKeyboardFocusManager.java:513)

at java.awt.Component.dispatchEventImpl(Component.java:4525)

at java.awt.Container.dispatchEventImpl(Container.java:2097)

at java.awt.Component.dispatchEvent(Component.java:4481)

at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:648)

at java.awt.EventQueue.access$000(EventQueue.java:84)

at java.awt.EventQueue$1.run(EventQueue.java:607)

at java.awt.EventQueue$1.run(EventQueue.java:605)

at java.security.AccessController.doPrivileged(Native Method)

at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)

at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:98)

at java.awt.EventQueue$2.run(EventQueue.java:621)

at java.awt.EventQueue$2.run(EventQueue.java:619)

at java.security.AccessController.doPrivileged(Native Method)

at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)

at java.awt.EventQueue.dispatchEvent(EventQueue.java:618)

at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)

at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)

at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)

at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)

at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)

at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)

谢谢

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值