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