2017-10-24 3 views
1

Es gibt ein Panel, das 4 Komponenten enthält; 1 JLabel, 1 JButton, 1 JTextField und 1 JPopupMenu
Es gibt eine Methode "testMethod()", in der ich zuerst die Anzahl der Komponenten aus dem Panel und dann den Typ der Komponente (JButton, JLabel usw.) erhalte.Unterschiedlicher Wert der Komponenten von JPanel bei verschiedenen Ereignistypen

Nun gibt es zwei Szenarien auftreten, wenn der Steuerablauf zu testmethod geht():

  1. Wenn durch Click-Ereignis JButton kommt, zeigt es vier Komponenten auf Platte und nach erhalten alle 4 Komponenten
  2. kommend durch JMenuItem Click-Ereignis, zeigt es drei Komponenten auf Platte (nicht immer JPopupMenu) und nach nur drei Komponenten

ich es nicht bekommen (nicht JPopupMenu bekommen), was dieses Verhalten verursacht. Ich habe viel im Internet gesucht und JPopupMenu Dokumente gelesen, aber nichts darüber gefunden.

Es folgt der Code:
(es ist ein Teil des sehr großen Code so habe ich hier nur den Code, der das Szenario zeigt)

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Component; 
import java.awt.EventQueue; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 

import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JPopupMenu; 
import javax.swing.JLabel; 
import javax.swing.JMenuItem; 
import javax.swing.JButton; 
import javax.swing.JTextField; 
import java.awt.event.ActionListener; 
import java.awt.event.ActionEvent; 

public class TestProject extends JFrame { 

    JPanel panel; 
    private JPanel contentPane; 
    private JTextField textField; 

    /** 
    * Launch the application. 
    */ 
    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       try { 
        TestProject frame = new TestProject(); 
        frame.setVisible(true); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 
    } 

    /** 
    * Create the frame. 
    */ 
    public TestProject() { 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setBounds(100, 100, 450, 300); 
     contentPane = new JPanel(); 
     contentPane.setLayout(new BorderLayout(0, 0)); 
     setContentPane(contentPane); 

     panel = new JPanel(); 
     contentPane.add(panel, BorderLayout.CENTER); 

     JLabel lblNewLabel = new JLabel("New label"); 
     panel.add(lblNewLabel); 

     JButton btnNewButton = new JButton("New button"); 
     btnNewButton.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent e) { 
       testMethod(); 
      } 
     }); 
     panel.add(btnNewButton); 

     textField = new JTextField(); 
     panel.add(textField); 
     textField.setColumns(10); 

     // Creating upper level container 
     JPopupMenu editMenu = new JPopupMenu("Edit"); 

     JMenuItem item1 = new JMenuItem("Item 1"); 
     item1.setBackground(Color.WHITE); 

     JMenuItem item2 = new JMenuItem("Item 2"); 
     item2.setBackground(Color.WHITE); 
     item2.setBackground(Color.WHITE); 
     // Setting Copy action listener 
     item2.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent e) { 
       testMethod(); 
      } 
     }); 

     // Adding the menu items on the popup menu 
     editMenu.add(item1); 
     editMenu.add(item2); 

     panel.addMouseListener(new MouseAdapter() { 
       public void mouseClicked(MouseEvent e) { 
        // Added check to open menu only on left click 
        if (e.getButton() == MouseEvent.BUTTON3) 
         editMenu.show(panel, e.getX(), e.getY()); 
       }    
      }); 

     // Adding popup menu to the logAreaPanel 
     panel.add(editMenu); 

    } 

    void testMethod() 
    { 
     // Here getting number of components of panel 
     // When coming through JButton click event, it shows 4 components on panel and after get all 4 components 
     int items = panel.getComponentCount(); 
     Component c; 

     // Getting all the trees one by one and storing their data into StringBuilder 
     for(int loopCounter = 0; loopCounter < items; loopCounter++) 
     { 
      // here getting different component types 
      // When coming through JMenuItem click event, it shows 3 components on panel(not getting JPopupMenu) and after only 3 components(not getting JPopupMenu) 
      c = panel.getComponent(loopCounter); 
     } 
    } 
} 

Jede Hilfe würde geschätzt. :-)

+0

Sobald Sie Ihr Popup-Menü angezeigt haben, erhalten Sie nur 3 Komponenten mit der Schaltfläche oder dem Popup-Menü. Das Problem scheint zu sein, dass sobald Sie das Popup-Menü anzeigen, es nicht mehr mit dem Jpanel enthalten ist. – matt

+0

Hallo @matt danke für die Antwort. Sieht auch gleich aus, aber ich möchte etwas Konkretes, ob ich etwas falsch mache oder es nur so ist. – Aman

+1

Sie müssen das Popup nicht zu Ihrem Panel hinzufügen, [tutorial] (https://docs.oracle.com/javase/tutorial/uiswing/components/menu.html#popup) Sie können einfach einen Maus-Listener hinzufügen und führe das Popup aus. Es scheint, den Maushörer für Sie automatisch so zu behandeln, wie Sie es tun, also weiß ich nicht, ob es falsch ist oder nicht. Wenn Sie das Tutorial lesen, sehen Sie, dass das Popup ein eigenes Fenster hat, weshalb es bei der Anzeige aus der anderen Komponente entfernt wird. – matt

Antwort

2

Sie müssen das Popup nicht zur Komponente hinzufügen. Der bevorzugte Weg ist, einfach

panel.setComponentPopupMenu(editMenu); 

Gemäß den tutorial zu verwenden, Sie einen Mouselistener verwenden könnten.

//panel.add(editMenu); 
panel.addMouseListener(new MouseAdapter(){ 
    public void mousePressed(MouseEvent e) { 
     maybeShowPopup(e); 
    } 

    public void mouseReleased(MouseEvent e) { 
     maybeShowPopup(e); 
    } 

    private void maybeShowPopup(MouseEvent e) { 
     if (e.isPopupTrigger()) { 
      editMenu.show(e.getComponent(), e.getX(), e.getY()); 
     } 
    } 
}); 

Auf diese Weise wird die Anzahl der Komponenten immer drei betragen, da sie nie zum Panel hinzugefügt wird.

+1

Oder, verwenden Sie vorzugsweise 'panel.setComponentPopupMenu (editMenu);' und lassen Sie das System damit umgehen – MadProgrammer

Verwandte Themen