title image


Smiley SWING Problem mit dem Update eines Popupmenüs
Hallo Leute,ich dachte, ich möchte in ein (möglicherweise bereits sichtbares) JPopupMenü/JMenu einige Items hinzufügen.Die eingefügten Items sind von Fall zu Fall unterschiedlich. Ich muss das Menü also updaten, wenn es geöffnet wurde. Das löse ich innerhalb eines MenuListeners aus (menuSelected()). Da die Aktion etwas länger (auch mal mehr als 1s) dauern kann, muss natürlich ein Thread her - sonst blockiert das GUI. Die Änderung des Menüs muss dann wieder im EDT erfolgen, also -> SwingUtilities.invokeLater().Mache ich das alles so, dann werden die MenuItems NICHT angezeigt, obwohl der Thread die Daten nachweislich abholt und die MenuItems dem Menü hinzugefügt wurden.Lasse ich die Sache mit dem Thread weg gibts kein Problem (davon abgesehen, dass das GUI blockiert).Hier etwas Sample-Code, viel weniger geht leider nicht:package swing.popup;import java.awt.Dimension;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JMenu;import javax.swing.JMenuItem;import javax.swing.JPanel;import javax.swing.JPopupMenu;import javax.swing.SwingUtilities;import javax.swing.event.MenuEvent;import javax.swing.event.MenuListener;public class DynamicPopupExample { public DynamicPopupExample() { JFrame frame = new JFrame(); JPanel panel = new JPanel(); JPopupMenu popupMenu = new JPopupMenu("Popupmenu"); final JMenu submenu = new JMenu("Submenu"); popupMenu.add(submenu); submenu.addMenuListener(new MenuListener() { public void menuCanceled(MenuEvent e) { removeAllItems(e); } private void removeAllItems(MenuEvent e) { System.out.println(".removeAllItems()"); JMenu source = (JMenu) e.getSource(); source.removeAll(); source.validate(); } public void menuDeselected(MenuEvent e) { removeAllItems(e); } public void menuSelected(MenuEvent e) { removeAllItems(e); new Thread() { @Override public void run() { // Arbeit vortäuschen: try { sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } // Resultat vortäuschen: final String result = "test1\ntest2\ntest3\ntest4"; // items dem submenu hinzufügen String[] split = result.split("\n"); for (final String string : split) { SwingUtilities.invokeLater(new Runnable() { public void run() { JMenuItem menuItem = new JMenuItem(string); submenu.add(menuItem); // schon probiert: /*menuItem.revalidate(); menuItem.repaint(); submenu.revalidate(); submenu.repaint();*/ System.out.println("Added submenu: " + string); } }); } } }.start(); } }); popupMenu.add(new JMenuItem("empty")); panel.setComponentPopupMenu(popupMenu); panel.add(new JLabel("Rechtsklick, um das Menü zu sehen.")); frame.getContentPane().add(panel); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); panel.setPreferredSize(new Dimension(300, 200)); frame.pack(); frame.setVisible(true); } public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { public void run() { new DynamicPopupExample(); } }); }}Hat jemand ne Idee oder Ahnung, wie das dann doch noch klappt? Mit validate, repaint etc habe ichs schon probiert, aber vielleicht hat ja jemand nen Tipp, den ich noch nicht kenne... Danke schonmal und viele Grüße,Dirk


"The pure and simple truth is rarely pure and never simple."
Oscar Wilde


geschrieben von

Login

E-Mail:
  

Passwort:
  

Beitrag anfügen

Symbol:
 
 
 
 
 
 
 
 
 
 
 
 
 

Überschrift: