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上添加背景图片

java swing JPanel添加在JScrollPane上,有垂直的滚动条,可是滚动条拉到底,只显示了JPanel的一部分。

java swing编程问题:一个jframe中添加一个jpanel后,为jpanel添加一个滚动条,当jpanel中内容过多时滑动

Java 每次把一个Swing组件放在一个JPanel中时,总是放在左边,有啥办法让其放在面板中间?

将处理 3 添加到 Jpanel

java swing JPanel 怎么实现换行Flowlayout的布局管理器