java swing Jpanel 怎么添加一个Jdialog弹出框
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java swing Jpanel 怎么添加一个Jdialog弹出框相关的知识,希望对你有一定的参考价值。
通过: 弹出框, 顾名思义就是刚开始看不见, 触发某个事件后弹出的一个框
所以 我们要让JPanel响应指定的事件然后弹出 . 比如常见的事件, 鼠标点击JPanel后弹出
弹出框. 一般有两种方法实现
方法一:JOptionPane 创建1个简单的弹出框.(代码量少, 效果简单)
方法二Dialog/JDialog 创建1个弹出框.(代码量长,可以实现复杂的效果)
效果图
参考代码
import java.awt.*;import java.awt.event.*;
import javax.swing.*;
public class Demo extends JFrame
JPanel jp;
static final String title = "Message";
static final String content = "Eggs aren't supposed to be green.";
public Demo()
jp = new JPanel();
jp.setBackground(Color.PINK);
jp.addMouseListener(new MouseAdapter()
@Override
public void mouseClicked(MouseEvent e)
//方法1
JOptionPane.showMessageDialog(null, content, title, JOptionPane.INFORMATION_MESSAGE);
//方法2
new MyDailog(title, content).setVisible(true);// 创建1个对话框,并且设置为可见
);
add(jp);
setTitle("测试Demo");// 标题
setSize(280, 280);// 窗口大小
setLocationRelativeTo(null);// 窗口居中
setDefaultCloseOperation(EXIT_ON_CLOSE);// 窗口点击关闭时,退出程序
setVisible(true);// 窗口可见
public static void main(String[] args)
new Demo();
// 对话框类
class MyDailog extends JDialog implements ActionListener
String title;
String content;
public MyDailog(String title, String content)
this.title = title;
this.content = content;
ImageIcon icon = new ImageIcon("tp.png");// 创建1个图标实例
JLabel jlImg = new JLabel(icon);// 1个图片标签,显示图片
JLabel jl = new JLabel(content);// 1个文字标签,显示文本
jl.setForeground(Color.BLUE);// 设置文字的颜色为蓝色
JButton jb = new JButton("确定");// 创建1个按钮
jb.addActionListener(this);// 给按钮添加响应事件
add(jlImg);// 向对话框加入图片标签
add(jl);// 向对话框加入文字标签
add(jb);// 向对话框添加按钮
setLayout(new FlowLayout());// 对话框流式布局
setIconImage(icon.getImage());// 窗口左上角的小图标
setTitle(title);// 设置标题
setModal(true);// 设置为模态窗口
setSize(275, 135);// 设置对话框大小
setLocationRelativeTo(null);// 对话框局域屏幕中央
setResizable(false);// 对话框不可缩放
setDefaultCloseOperation(DISPOSE_ON_CLOSE);// 当对话框窗口的关闭按钮[X]被点击时,销毁对话框
// 当确定按钮被点击时会执行下面的方法
@Override
public void actionPerformed(ActionEvent e)
if (e.getActionCommand().equals("确定")) // 判断是不是确定按钮被点击
this.setVisible(false);// 对话框不可见
this.dispose();// 对话框销毁
参考技术A JOptionPane.showMessageDialog(this, "恭喜胜利通关");
如何从另一个子 JPanel(Java Swing)中的输入触发一个子 JPanel 中的操作?
【中文标题】如何从另一个子 JPanel(Java Swing)中的输入触发一个子 JPanel 中的操作?【英文标题】:How to trigger action in one child JPanel from input in another child JPanel (Java Swing)? 【发布时间】:2017-07-24 14:59:54 【问题描述】:我正在尝试在 Java Swing 中实现 GUI(我是 Swing 新手)。我有一个包含 2 个面板的父面板。一个左面板和一个右面板。左侧面板有一个 JComboBox 下拉菜单。右侧面板是带有 7 张卡片的 CardLayout。我想根据左侧面板中 JComboBox 中的选择更改右侧面板中显示的卡片。所有 3 个面板都是独立的类:LeftPanel.java、RightPanel.java 和 ParentPanel.java。我很难找到一个地方来放置这个动作的动作监听器。 LeftPanel 看不到 RightPanel 的 CardLayout,ParentPanel 也无法访问子 RightPanel 的 CardLayout。我看到了一些关于访问另一个 JPanel 的 CardLayout 的帖子,但到目前为止,没有一种方法对我有用。我的设计有缺陷吗?或者有可能实现这一目标吗?
编辑 感谢您迄今为止的建议。下面给出的是我的 MCVE。请注意,每个类都在其自己的 (.java) 文件中。我这样做不是为了方便维护而将所有内容都放在 Frame 类中。我以前在一堂课里有所有东西,它工作得很好,但它变成了一个包含 2000 多行代码和 20 多个面板的长文件。
//包含Main方法的类MainFrame:
包 tempgui; 公共类 MainFrame 扩展 JFrame
JFrame Frame1;
public static void main(String[] args)
new MainFrame();
public MainFrame()
Frame1 = new JFrame();
Frame1.setDefaultCloseOperation(EXIT_ON_CLOSE);
Frame1.getContentPane().add(new ParentPanel(), BorderLayout.CENTER);
Frame1.setSize(800, 600);
Frame1.setLocationRelativeTo(null);
Frame1.pack();
Frame1.setVisible(true);
//类父面板: 公共类 ParentPanel 扩展 JPanel
private JPanel ParentPanel;
private LeftPanel LP;
private RightPanel RP;
public ParentPanel()
ParentPanel = new JPanel();
LP = new LeftPanel();
RP = new RightPanel();
ParentPanel.setLayout(new GridLayout(1,2));
ParentPanel.add(LP);
ParentPanel.add(RP);
add(ParentPanel);
//类LeftPanel: 公共类 LeftPanel 扩展 JPanel
private JPanel LeftPanel;
private JComboBox J1;
public LeftPanel()
LeftPanel = new JPanel();
String[] Arr = "RP1","RP2";
J1 = new JComboBox(Arr);
LeftPanel.add(J1);
add(LeftPanel);
//类右面板: 公共类 RightPanel 扩展 JPanel
private JPanel RightPanel;
private RP1Panel RP1;
private RP2Panel RP2;
private CardLayout C1;
public RightPanel()
RightPanel = new JPanel();
RP1 = new RP1Panel();
RP2 = new RP2Panel();
C1 = new CardLayout();
RightPanel.setLayout(C1);
RightPanel.add(RP1, "RP1");
RightPanel.add(RP2, "RP2");
C1.show(RightPanel, "RP1");
add(RightPanel);
//类RP1Panel: 公共类 RP1Panel 扩展 JPanel
private JPanel RP1;
private JLabel JRP1;
public RP1Panel()
RP1 = new JPanel();
JRP1 = new JLabel("RP1 Panel");
RP1.add(JRP1);
add(RP1);
//类RP2Panel: 公共类 RP2Panel 扩展 JPanel
private JPanel RP2;
private JLabel JRP2;
public RP2Panel()
RP2 = new JPanel();
JRP2 = new JLabel("RP2 Panel");
RP2.add(JRP2);
add(RP2);
【问题讨论】:
"Or is it possible to achieve this?"
-- 是的,非常肯定。 "Is there a flaw in my design?"
-- 没有相关代码,最好是有效的minimal reproducible example,无法说出您的问题出在哪里。同样,考虑创建和发布一个 MCVE,一个小程序,小到可以作为代码格式的文本发布在您的问题中,一个可以编译和运行的程序,它可以向我们展示您的问题。它不是你的整个程序,它没有它的所有功能,但它再次为我们运行,它向我们展示了问题。
“所有 3 个面板都是单独的类” 解决这个难题的第一步可能是“不要不必要地扩展组件类”。您能在这里解释一下扩展面板的情况吗?
【参考方案1】:
我会尝试为我的类提供允许其他类从中提取“state”信息的方法,例如组合框的状态,并允许其他类改变它们,例如允许要添加到组合框中的侦听器。例如:
// Class LeftPanel:
class LeftPanel extends JPanel
private JPanel leftPanel;
private JComboBox<String> comboBox; //!!
// !!
public LeftPanel(String[] comboTexts)
leftPanel = new JPanel();
comboBox = new JComboBox<>(comboTexts); // !!
leftPanel.add(comboBox);
add(leftPanel);
// !!
public String getComboSelection()
return comboBox.getSelectedItem().toString();
// !!
public void comboAddActionListener(ActionListener listener)
comboBox.addActionListener(listener);
然后其他类可以监听组合框的变化,并在需要时提取选择。右侧面板同样具有允许更改其显示的“卡片”JPanel 的方法。比如:
// Class RightPanel:
class RightPanel extends JPanel
private JPanel rightPanel;
private RP1Panel rightPanel1;
private RP2Panel rightPanel2;
private CardLayout cardLayout;
public RightPanel()
rightPanel = new JPanel();
rightPanel1 = new RP1Panel();
rightPanel2 = new RP2Panel();
cardLayout = new CardLayout();
rightPanel.setLayout(cardLayout);
rightPanel.add(rightPanel1, RP1Panel.NAME); //!!
rightPanel.add(rightPanel2, RP2Panel.NAME); // !!
cardLayout.show(rightPanel, RP1Panel.NAME); // !!
add(rightPanel);
// !!
public void showCard(String name)
cardLayout.show(rightPanel, name);
它们可以主要捆绑在一起:
// Class ParentPanel:
class ParentPanel extends JPanel
private JPanel ParentPanel;
private LeftPanel leftPanel;
private RightPanel rightPanel;
public ParentPanel()
ParentPanel = new JPanel();
leftPanel = new LeftPanel(new String[] RP1Panel.NAME, RP2Panel.NAME);
rightPanel = new RightPanel();
ParentPanel.setLayout(new GridLayout(1, 2));
ParentPanel.add(leftPanel);
ParentPanel.add(rightPanel);
add(ParentPanel);
// !!
leftPanel.comboAddActionListener(e ->
String selection = leftPanel.getComboSelection();
rightPanel.showCard(selection);
);
整个 MCVE 可能如下所示:
import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.GridLayout;
import java.awt.event.ActionListener;
import javax.swing.*;
public class FooGui
public static void main(String[] args)
new MainFrame();
class MainFrame extends JFrame
JFrame Frame1;
public MainFrame()
Frame1 = new JFrame();
Frame1.setDefaultCloseOperation(EXIT_ON_CLOSE);
Frame1.getContentPane().add(new ParentPanel(), BorderLayout.CENTER);
Frame1.setSize(800, 600);
Frame1.setLocationRelativeTo(null);
Frame1.pack();
Frame1.setVisible(true);
// Class ParentPanel:
class ParentPanel extends JPanel
private JPanel ParentPanel;
private LeftPanel leftPanel;
private RightPanel rightPanel;
public ParentPanel()
ParentPanel = new JPanel();
leftPanel = new LeftPanel(new String[] RP1Panel.NAME, RP2Panel.NAME);
rightPanel = new RightPanel();
ParentPanel.setLayout(new GridLayout(1, 2));
ParentPanel.add(leftPanel);
ParentPanel.add(rightPanel);
add(ParentPanel);
// !!
leftPanel.comboAddActionListener(e ->
String selection = leftPanel.getComboSelection();
rightPanel.showCard(selection);
);
// Class LeftPanel:
class LeftPanel extends JPanel
private JPanel leftPanel;
private JComboBox<String> comboBox; //!!
// !!
public LeftPanel(String[] comboTexts)
leftPanel = new JPanel();
comboBox = new JComboBox<>(comboTexts); // !!
leftPanel.add(comboBox);
add(leftPanel);
// !!
public String getComboSelection()
return comboBox.getSelectedItem().toString();
// !!
public void comboAddActionListener(ActionListener listener)
comboBox.addActionListener(listener);
// Class RightPanel:
class RightPanel extends JPanel
private JPanel rightPanel;
private RP1Panel rightPanel1;
private RP2Panel rightPanel2;
private CardLayout cardLayout;
public RightPanel()
rightPanel = new JPanel();
rightPanel1 = new RP1Panel();
rightPanel2 = new RP2Panel();
cardLayout = new CardLayout();
rightPanel.setLayout(cardLayout);
rightPanel.add(rightPanel1, RP1Panel.NAME); //!!
rightPanel.add(rightPanel2, RP2Panel.NAME); // !!
cardLayout.show(rightPanel, RP1Panel.NAME); // !!
add(rightPanel);
// !!
public void showCard(String name)
cardLayout.show(rightPanel, name);
// Class RP1Panel:
class RP1Panel extends JPanel
// !!
public static final String NAME = "right panel 1";
private JPanel RP1;
private JLabel JRP1;
public RP1Panel()
setName(NAME);
RP1 = new JPanel();
JRP1 = new JLabel("RP1 Panel");
RP1.add(JRP1);
add(RP1);
// Class RP2Panel:
class RP2Panel extends JPanel
// !!
public static final String NAME = "right panel 2";
private JPanel RP2;
private JLabel JRP2;
public RP2Panel()
setName(NAME);
RP2 = new JPanel();
JRP2 = new JLabel("RP2 Panel");
RP2.add(JRP2);
add(RP2);
【讨论】:
非常感谢!这非常适合我的情况。我想我可以使用类似的方法在一个 JPanel 上实现 Back、Next 按钮来控制在另一个 JPanel 上的 Cards 之间来回翻转。类似于创建向导对话框。以上是关于java swing Jpanel 怎么添加一个Jdialog弹出框的主要内容,如果未能解决你的问题,请参考以下文章
java swing JPanel添加在JScrollPane上,有垂直的滚动条,可是滚动条拉到底,只显示了JPanel的一部分。
java swing编程问题:一个jframe中添加一个jpanel后,为jpanel添加一个滚动条,当jpanel中内容过多时滑动