gpt4 book ai didi

java - jcombobox 作为单元格编辑器 java.awt.IllegalComponentStateException : component must be showing on the screen to determine its location

转载 作者:搜寻专家 更新时间:2023-11-01 02:47:26 24 4
gpt4 key购买 nike

我正在使用自定义 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)

谢谢

最佳答案

首先,让我解释一下 comboBox.putClientProperty("JComboBox.isTableCellEditor", Boolean.TRUE); 的作用。通常,将鼠标悬停在某个项目上或按键盘上的箭头键会导致立即选择 JComboBox 上的项目。由于来自 JComboBox 的选择事件将导致单元格编辑过程停止,因此此行为不适用于表格单元格。因此,当设置此特殊客户端属性时,项目将在弹出列表中显示为选中状态,但尚未在 JComboBox 上设置。只有提交的项目(通过单击或 Enter 键)才会更改 JComboBox 上的选定项目,从而导致编辑结束。至少,这适用于 BasicLookAndFeel 及其派生词。

你遇到的问题完全不同。正如异常消息和堆栈跟踪明确指出的那样,外观试图打开与 JComboBox 相关联的 JPopupMenu(如您所请求的),但它无法确定弹出菜单在屏幕上的位置,因为您的 JComboBox 未拍摄显示在屏幕上。它需要 JComboBox 位置的原因是它打开了相对于 JComboBox 的新窗口。

剩下的问题是为什么您从未显示在屏幕上的 JComboBox 收到了 focusGained(或者您认为自己显示的原因)。

关于java - jcombobox 作为单元格编辑器 java.awt.IllegalComponentStateException : component must be showing on the screen to determine its location,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18968815/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com