初始化后如何在JFrame中添加组件?

问题描述

我有一个JFrame。首次启动时,它不会(故意)加载按钮,因为它取决于布尔值sessionExists,认情况下为false。当用户单击“添加”以启动jdialog并在该jdialog中单击“确定”时,它将把JFrame的sessionExists值设置为true。

我想要代码做什么:

单击Ok之后,我希望JFrame进行更新,并使用text“ new button”显示该按钮,因为sessionExists现在为true。

当前行为:

当前,用户单击“确定”,jdialog将退出,但父JFrame将保持不变,并且按钮不会出现。

我尝试的解决方案:

我尝试在JFrame中使用.validate和.repaint()刷新它,以便显示按钮,但似乎不起作用。

我应该如何实现预期的行为?我应该使用cardlayout吗?

我使用以下代码重现了该问题。我的实际程序依赖于文件是否存在而不是布尔变量。

JFrame

import java.awt.BorderLayout;
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;

import javax.swing.JButton;
import javax.swing.jdialog;

import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

public class MainMenu extends JFrame {

    private JPanel contentPane;
    
    MainMenu thisFrame = this;
    
    boolean sessionExists = false;

    public static void main(String[] args) {
        EventQueue.invokelater(new Runnable() {
            public void run() {
                try {
                    MainMenu frame = new MainMenu();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printstacktrace();
                }
            }
        });
    }

    public MainMenu() {
        setDefaultCloSEOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100,100,450,300);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5,5,5));
        contentPane.setLayout(new BorderLayout(0,0));
        setContentPane(contentPane);
        
        if (sessionExists == true) {
            JButton btnNewButton = new JButton("New button");
            contentPane.add(btnNewButton,BorderLayout.CENTER);
        }
        
        JButton btnNewButton_1 = new JButton("Add Button");
        btnNewButton_1.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                Add newTask = new Add(thisFrame);
                newTask.setDefaultCloSEOperation(jdialog.disPOSE_ON_CLOSE);
                newTask.setTitle("Add Task");
                newTask.setVisible(true);
            }
        });
        contentPane.add(btnNewButton_1,BorderLayout.soUTH);
    }
    
    public void refresh() {
        this.validate();
        this.repaint();
    }

}

添加jdialog

import java.awt.BorderLayout;
import java.awt.FlowLayout;

import javax.swing.JButton;
import javax.swing.jdialog;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

public class Add extends jdialog {

    private final JPanel contentPanel = new JPanel();

    public Add(MainMenu parentJFrame) {
        setBounds(100,300);
        getContentPane().setLayout(new BorderLayout());
        contentPanel.setLayout(new FlowLayout());
        contentPanel.setBorder(new EmptyBorder(5,5));
        getContentPane().add(contentPanel,BorderLayout.CENTER);
        {
            JPanel buttonPane = new JPanel();
            buttonPane.setLayout(new FlowLayout(FlowLayout.RIGHT));
            getContentPane().add(buttonPane,BorderLayout.soUTH);
            {
                JButton okButton = new JButton("OK");
                okButton.addActionListener(new ActionListener() {
                    public void actionPerformed(ActionEvent e) {
                        parentJFrame.sessionExists = true;
                        parentJFrame.refresh();
                        dispose();
                    }
                });
                okButton.setActionCommand("OK");
                buttonPane.add(okButton);
                getRootPane().setDefaultButton(okButton);
            }
            {
                JButton cancelButton = new JButton("Cancel");
                cancelButton.setActionCommand("Cancel");
                buttonPane.add(cancelButton);
            }
        }
    }

}

解决方法

在尝试添加if(session == true)时没有调用它。取而代之的是,创建诸如adding()之类的新函数,然后从Add JDialog类中调用它,它将起作用。(您会注意到您不必使用session == true,因为您可以通过这种方式调用该函数直接。但是根据您的理解,我没有更改。) 示例代码:

MainMenu:

public class MainMenu extends JFrame {

    private JPanel contentPane;
    
    MainMenu thisFrame = this;
    
    boolean sessionExists = false;

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    MainMenu frame = new MainMenu();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    public MainMenu() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100,100,450,300);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5,5,5));
        contentPane.setLayout(new BorderLayout(0,0));
        setContentPane(contentPane);
        
        
        
        JButton btnNewButton_1 = new JButton("Add Button");
        btnNewButton_1.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                Add newTask = new Add(thisFrame);
                newTask.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
                newTask.setTitle("Add Task");
                newTask.setVisible(true);
                
            }
        });
        contentPane.add(btnNewButton_1,BorderLayout.SOUTH);
    }
    
    public void adding() {
        if (sessionExists == true) {
            JButton btnNewButton = new JButton("New button");
            contentPane.add(btnNewButton,BorderLayout.CENTER);
        }
    }
    
    public void refresh() {
        this.validate();
        this.repaint();
    }

}

添加:

public class Add extends JDialog {

    private final JPanel contentPanel = new JPanel();

    public Add(MainMenu parentJFrame) {
        setBounds(100,300);
        getContentPane().setLayout(new BorderLayout());
        contentPanel.setLayout(new FlowLayout());
        contentPanel.setBorder(new EmptyBorder(5,5));
        getContentPane().add(contentPanel,BorderLayout.CENTER);
        {
            JPanel buttonPane = new JPanel();
            buttonPane.setLayout(new FlowLayout(FlowLayout.RIGHT));
            getContentPane().add(buttonPane,BorderLayout.SOUTH);
            {
                JButton okButton = new JButton("OK");
                okButton.addActionListener(new ActionListener() {
                    public void actionPerformed(ActionEvent e) {
                        parentJFrame.sessionExists = true;
                        parentJFrame.adding();
                        parentJFrame.refresh();
                        dispose();
                    }
                });
                okButton.setActionCommand("OK");
                buttonPane.add(okButton);
                getRootPane().setDefaultButton(okButton);
            }
            {
                JButton cancelButton = new JButton("Cancel");
                cancelButton.setActionCommand("Cancel");
                buttonPane.add(cancelButton);
            }
        }
    }

}