takidoso
Erfahrenes Mitglied
Halli hallo,
ich bin gerade dabei einen Renderer zusammenzubauen der mit einer JComboBox arbeitet und dabei soller er, wenn man etwas in die Combo eingibt den eingegebenen String nach einer kleinen Verzögerung als Filter für seine Combobox-Liste verwenden, indem er die Liste einfach reduziert.
Mein Ansatz ist wie folgt:
Es Funktioniert auch fast jedoch habe ich das Problem mit dem Anzeigen des Popups der Combo. Und zwar ließe ich die Zeile mit dem //test2 weg bekomme ich kein Problem aber das Popup zeigt sich nicht. Wenn ich Zeile mit //test1 entferne bekomme ich die selbe Exception wie wenn ich beide Zeilen habe. lasse ich nur ein showPopup() stehen und rufe nicht reducePickList(str) auf wird das Popup ganz ordnungsgemäß gezeigt.
zum näheren Verständnis, die Exception die ich bekomme ist:
java.awt.IllegalComponentStateException: component must be showing on the screen to determine its location
at java.awt.Component.getLocationOnScreen_NoTreeLock(Component.java:1507)
at java.awt.Component.getLocationOnScreen(Component.java:1481)
at javax.swing.JPopupMenu.show(JPopupMenu.java:921)
at javax.swing.plaf.basic.BasicComboPopup.show(BasicComboPopup.java:177)
at javax.swing.plaf.basic.BasicComboBoxUI.setPopupVisible(BasicComboBoxUI.java:927)
at javax.swing.JComboBox.setPopupVisible(JComboBox.java:790)
at javax.swing.JComboBox.showPopup(JComboBox.java:775)
at de.mc.gui.MappedValuesCellEditor$2.actionPerformed(MappedValuesCellEditor.java:257)
at javax.swing.Timer.fireActionPerformed(Timer.java:271)
at javax.swing.Timer$DoPostEvent.run(Timer.java:201)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:178)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:454)
at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:201)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:151)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:145)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:137)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:100)
hat jemand eine Idee wie ich dem Problem Herr werden kann?
Oder hat jemand so etwas ähnliches auch versucht und war damit erfolgreich?
mit bestem Dank im Voraus
Takidoso
ich bin gerade dabei einen Renderer zusammenzubauen der mit einer JComboBox arbeitet und dabei soller er, wenn man etwas in die Combo eingibt den eingegebenen String nach einer kleinen Verzögerung als Filter für seine Combobox-Liste verwenden, indem er die Liste einfach reduziert.
Mein Ansatz ist wie folgt:
Code:
public class MappedValuesCellEditor extends DefaultCellEditor
{
...
private final JComboBox m_combo;
private DynKeyListener m_keyListener = null;
private java.util.List m_pickList = null;
...
protected void reducePickList(String filter)
{
m_combo.removeAllItems();
for (int i = 0; i<m_pickList.size(); i++)
{
NamedId item = (NamedId)m_pickList.get(i);
if (item.getName().regionMatches(true,0,filter,0,filter.length()))
{
m_combo.addItem(item);
}
}
}
public void setDynamic(boolean on)
{
if (on)
{
m_keyListener = new DynKeyListener();
m_combo.getEditor().getEditorComponent().addKeyListener(m_keyListener);
}
else
{
m_combo.getEditor().getEditorComponent().removeKeyListener(m_keyListener);
}
}
private class DynKeyListener implements KeyListener
{
private javax.swing.Timer timer;
private int m_delay = 500;
public DynKeyListener()
{
timer = new javax.swing.Timer(m_delay,
new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
String str = (String)m_combo.getEditor().getItem();
System.out.println("str="+str);
m_combo.showPopup(); //test1
reducePickList(str);
m_combo.showPopup(); //test2
}
});
timer.setRepeats(false);
}
public DynKeyListener(int delay)
{
this();
m_delay = delay;
}
public void keyTyped(KeyEvent e)
{
timer.restart();
}
public void keyPressed(KeyEvent e)
{
}
public void keyReleased(KeyEvent e)
{
}
}
...
}
Es Funktioniert auch fast jedoch habe ich das Problem mit dem Anzeigen des Popups der Combo. Und zwar ließe ich die Zeile mit dem //test2 weg bekomme ich kein Problem aber das Popup zeigt sich nicht. Wenn ich Zeile mit //test1 entferne bekomme ich die selbe Exception wie wenn ich beide Zeilen habe. lasse ich nur ein showPopup() stehen und rufe nicht reducePickList(str) auf wird das Popup ganz ordnungsgemäß gezeigt.
zum näheren Verständnis, die Exception die ich bekomme ist:
java.awt.IllegalComponentStateException: component must be showing on the screen to determine its location
at java.awt.Component.getLocationOnScreen_NoTreeLock(Component.java:1507)
at java.awt.Component.getLocationOnScreen(Component.java:1481)
at javax.swing.JPopupMenu.show(JPopupMenu.java:921)
at javax.swing.plaf.basic.BasicComboPopup.show(BasicComboPopup.java:177)
at javax.swing.plaf.basic.BasicComboBoxUI.setPopupVisible(BasicComboBoxUI.java:927)
at javax.swing.JComboBox.setPopupVisible(JComboBox.java:790)
at javax.swing.JComboBox.showPopup(JComboBox.java:775)
at de.mc.gui.MappedValuesCellEditor$2.actionPerformed(MappedValuesCellEditor.java:257)
at javax.swing.Timer.fireActionPerformed(Timer.java:271)
at javax.swing.Timer$DoPostEvent.run(Timer.java:201)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:178)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:454)
at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:201)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:151)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:145)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:137)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:100)
hat jemand eine Idee wie ich dem Problem Herr werden kann?
Oder hat jemand so etwas ähnliches auch versucht und war damit erfolgreich?
mit bestem Dank im Voraus
Takidoso