title image


Smiley Re: SWING Problem mit dem Update eines Popupmenüs
Hi"Brute force": Wenn man das Menu kurz versteckt und wieder anzeigt, scheint's zu funktionieren... Wirklich ... "profund" ist das zwar nicht, und das ist vermutlich auch kein Verhalten, das eindeutig von der API-Definition zugesichert ist, aber fallst du eine "schöne(re)" Lösung haben willst, kannst du ja notfalls mal im Quelltext schauen, WAS genau beim verstecken/wiederanzeigen passiert (d.h. wo dort das aktualisieren vorgenommen wird).Ob der Benutzer diese Verzögerung so toll findet, weiß ich aber auch nicht... Du solltest auf jeden Fall Sensimillias Vorschlag in Erwägung ziehen, das Menü möglichst früh zu bauen, so dass der Benutzer beim Klick keine Verzögerung bemerkt. Und wenn das nicht möglich ist (weil z.B. erst beim Klick die "Grundlage" für die Brechnung ermittelt werden kann) dann solltest du das ggf. durch eine kleine Nachricht (in Form eines disabledten MenuItems) anzeigen... ungefähr so...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;import javax.swing.event.*;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(final MenuEvent e) { removeAllItems(e); JMenuItem mi = new JMenuItem("computing..."); mi.setEnabled(false); submenu.add(mi); new Thread() { @Override public void run() { // Arbeit vortäuschen: try { sleep(3000); } catch(InterruptedException e) { e.printStackTrace(); } // Resultat vortäuschen: final String result = "test1\ntest2\ntest3\ntest4"; // items dem submenu hinzufügen final String[] split = result.split("\n"); SwingUtilities.invokeLater(new Runnable() { public void run() { removeAllItems(e); for(final String string : split) { JMenuItem menuItem = new JMenuItem(string); submenu.add(menuItem); // schon probiert: /*menuItem.revalidate(); menuItem.repaint(); submenu.revalidate(); submenu.repaint();*/ System.out.println("Added submenu: " + string); submenu.setPopupMenuVisible(false); submenu.setPopupMenuVisible(true); } } }); } }.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(); } }); }}bye



geschrieben von

Login

E-Mail:
  

Passwort:
  

Beitrag anfügen

Symbol:
 
 
 
 
 
 
 
 
 
 
 
 
 

Überschrift: