2013-09-28 6 views
0

Я хочу помочь кому-то. Я хочу создать JPanel, который появится, когда я нажму кнопку, он должен появиться там, где нажата кнопка, и она не должна влиять на другие компоненты. Примером этого является JDateChooser, когда вы нажимаете на эту кнопку, появляется календарь, но когда вы нажимаете на другое место, эта панель исчезает. то, что я хочу, это поместить список имен на эту панель, когда он появится. Это похоже на JPopupmenu, за исключением того, что когда вы нажимаете в другом месте, он должен исчезнуть.Как создать всплывающее окно JPanel в JFrame

+0

Ну вы должны обеспечить то, что вы до сих пор. Вам нужно будет использовать слушателей, чтобы установить видимость на false для этого jpanel. Я бы использовал JInnerFrame или что-то, что уже имело JPanel, иначе вам придется играть с многоуровневыми макетами. – porfiriopartida

+0

Почему я не думал о внутренней рамке. Спасибо за предложение –

+0

JPopupMenu должен быть способен предоставить эту функциональность – MadProgrammer

ответ

3

Я не уверен, что вы делаете, но это, кажется, работает очень хорошо для меня ...

enter image description here

import java.awt.BorderLayout; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.GridBagLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.DefaultListModel; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JList; 
import javax.swing.JPanel; 
import javax.swing.JPopupMenu; 
import javax.swing.JScrollPane; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 
import javax.swing.event.ListSelectionEvent; 
import javax.swing.event.ListSelectionListener; 

public class ButtonPopup { 

    public static void main(String[] args) { 
     new ButtonPopup(); 
    } 

    public ButtonPopup() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
        ex.printStackTrace(); 
       } 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.add(new TestPane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class TestPane extends JPanel { 

     public TestPane() { 
      setLayout(new GridBagLayout()); 

      final JPopupMenu popup = new JPopupMenu(); 
      DefaultListModel<String> model = new DefaultListModel<>(); 
      model.addElement("Item 1"); 
      model.addElement("Item 2"); 
      model.addElement("Item 3"); 
      model.addElement("Item 4"); 
      model.addElement("Item 5"); 
      JList list = new JList(model); 
      popup.setLayout(new BorderLayout()); 
      popup.add(new JScrollPane(list)); 

      final JButton button = new JButton("Pop"); 
      button.addActionListener(new ActionListener() { 
       @Override 
       public void actionPerformed(ActionEvent e) { 
        Dimension size = popup.getPreferredSize(); 
        int x = (button.getWidth() - size.width)/2; 
        int y = button.getHeight(); 
        popup.show(button, x, y); 
       } 
      }); 

      list.addListSelectionListener(new ListSelectionListener() { 
       @Override 
       public void valueChanged(ListSelectionEvent e) { 
        popup.setVisible(false); 
       } 
      }); 

      add(button); 
     } 

     @Override 
     public Dimension getPreferredSize() { 
      return new Dimension(200, 200); 
     } 

     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      Graphics2D g2d = (Graphics2D) g.create(); 
      g2d.dispose(); 
     }   
    }  
} 
Смежные вопросы