Java 如何在JFrame中创建弹出式JPanel

Java 如何在JFrame中创建弹出式JPanel,java,popup,jpanel,Java,Popup,Jpanel,我想帮助某人。我想创建一个JPanel,当我点击一个按钮时会弹出,它必须出现在点击按钮的地方,并且不能影响其他组件。一个例子是JDateChooser,当您单击该按钮时,日历就出现在那里,但当您单击其他任何地方时,该面板就会消失。我想要的是在面板弹出时在面板中列出一个名字列表。它与JPopupmenu类似,只是当您单击其他任何位置时,它必须消失。我不确定您在做什么,但它似乎对我来说很好 import java.awt.BorderLayout; import java.awt.Dimension

我想帮助某人。我想创建一个JPanel,当我点击一个按钮时会弹出,它必须出现在点击按钮的地方,并且不能影响其他组件。一个例子是JDateChooser,当您单击该按钮时,日历就出现在那里,但当您单击其他任何地方时,该面板就会消失。我想要的是在面板弹出时在面板中列出一个名字列表。它与JPopupmenu类似,只是当您单击其他任何位置时,它必须消失。

我不确定您在做什么,但它似乎对我来说很好

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();
        }        
    }    
}

导入java.awt.BorderLayout;
导入java.awt.Dimension;
导入java.awt.EventQueue;
导入java.awt.Graphics;
导入java.awt.Graphics2D;
导入java.awt.GridBagLayout;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入javax.swing.DefaultListModel;
导入javax.swing.JButton;
导入javax.swing.JFrame;
导入javax.swing.JList;
导入javax.swing.JPanel;
导入javax.swing.jpopmenu;
导入javax.swing.JScrollPane;
导入javax.swing.UIManager;
导入javax.swing.UnsupportedLookAndFeelException;
导入javax.swing.event.ListSelectionEvent;
导入javax.swing.event.ListSelectionListener;
公共类按钮PUP{
公共静态void main(字符串[]args){
新按钮pup();
}
公共按钮pup(){
invokeLater(新的Runnable(){
@凌驾
公开募捐{
试一试{
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
}catch(ClassNotFoundException |实例化Exception | IllegalacessException |不支持ookandfeelException ex){
例如printStackTrace();
}
JFrame=新JFrame(“测试”);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(newtestpane());
frame.pack();
frame.setLocationRelativeTo(空);
frame.setVisible(true);
}
});
}
公共类TestPane扩展了JPanel{
公共测试窗格(){
setLayout(新的GridBagLayout());
最终JPopupMenu弹出窗口=新建JPopupMenu();
DefaultListModel=新的DefaultListModel();
模型附录(“第1项”);
模型附录(“第2项”);
模型附录(“第3项”);
模型附录(“第4项”);
模型附录(“第5项”);
JList列表=新的JList(型号);
setLayout(新的BorderLayout());
添加(新的JScrollPane(列表));
最终JButton按钮=新JButton(“Pop”);
addActionListener(新建ActionListener()){
@凌驾
已执行的公共无效操作(操作事件e){
维度大小=弹出窗口。getPreferredSize();
intx=(button.getWidth()-size.width)/2;
int y=button.getHeight();
弹出显示(按钮,x,y);
}
});
addListSelectionListener(新的ListSelectionListener(){
@凌驾
public void值已更改(ListSelectionEvent e){
popup.setVisible(假);
}
});
添加(按钮);
}
@凌驾
公共维度getPreferredSize(){
返回新维度(200200);
}
受保护组件(图形g){
超级组件(g);
Graphics2D g2d=(Graphics2D)g.create();
g2d.dispose();
}        
}    
}

我不确定你在做什么,但它似乎对我很好

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();
        }        
    }    
}

导入java.awt.BorderLayout;
导入java.awt.Dimension;
导入java.awt.EventQueue;
导入java.awt.Graphics;
导入java.awt.Graphics2D;
导入java.awt.GridBagLayout;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入javax.swing.DefaultListModel;
导入javax.swing.JButton;
导入javax.swing.JFrame;
导入javax.swing.JList;
导入javax.swing.JPanel;
导入javax.swing.jpopmenu;
导入javax.swing.JScrollPane;
导入javax.swing.UIManager;
导入javax.swing.UnsupportedLookAndFeelException;
导入javax.swing.event.ListSelectionEvent;
导入javax.swing.event.ListSelectionListener;
公共类按钮PUP{
公共静态void main(字符串[]args){
新按钮pup();
}
公共按钮pup(){
invokeLater(新的Runnable(){
@凌驾
公开募捐{
试一试{
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
}catch(ClassNotFoundException |实例化Exception | IllegalacessException |不支持ookandfeelException ex){
例如printStackTrace();
}
JFrame=新JFrame(“测试”);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(newtestpane());
frame.pack();
frame.setLocationRelativeTo(空);
frame.setVisible(true);
}
});
}
公共类TestPane扩展了JPanel{
公共测试窗格(){
setLayout(新的GridBagLayout());
最终JPopupMenu弹出窗口=新建JPopupMenu();
DefaultListModel=新的DefaultListModel();
模型附录(“第1项”);
模型附录(“第2项”);
模型附录(“第3项”);
模型附录(“第4项”);
模型附录(“第5项”);
JList列表=新的JList(型号);
setLayout(新的BorderLayout());
添加(新的JScrollPane(列表));
最终JButton按钮=新JButton(“Pop”);
按钮。addActionListener(新建