Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用卡布局在JPanel中的两个JPanel之间交换_Java_Swing_Layout Manager_Cardlayout - Fatal编程技术网

Java 使用卡布局在JPanel中的两个JPanel之间交换

Java 使用卡布局在JPanel中的两个JPanel之间交换,java,swing,layout-manager,cardlayout,Java,Swing,Layout Manager,Cardlayout,我试图让两个JPanel通过这些特定面板上的按钮进行交换,我不希望两个面板上都有常规按钮,就像两个面板上重复使用的普通卡布局一样。 我尝试在主面板上有一个名为“添加”的按钮引导到下一页,在下一页上有一个名为“返回”的按钮引导到主面板。然而,由于某些原因,它不起作用。我不希望JFrame上有两个JPanel,因为我稍后会将JPanel添加到选项卡式窗格中。 以下是我已经得到的: 控制器: import java.awt.CardLayout; import javax.swing.*; impor

我试图让两个JPanel通过这些特定面板上的按钮进行交换,我不希望两个面板上都有常规按钮,就像两个面板上重复使用的普通卡布局一样。 我尝试在主面板上有一个名为“添加”的按钮引导到下一页,在下一页上有一个名为“返回”的按钮引导到主面板。然而,由于某些原因,它不起作用。我不希望JFrame上有两个JPanel,因为我稍后会将JPanel添加到选项卡式窗格中。 以下是我已经得到的:

控制器:

import java.awt.CardLayout;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class Controller extends JPanel {

    private static Controller instance = new Controller();

    JPanel cards;
    Main mainPanel;
    NextPage nextPage;

    public Controller() {
        setLayout(new BorderLayout());
        setSize(810, 510);
        cards = new JPanel(new CardLayout());

        mainPanel = new Main();
        nextPage = new NextPage();
        cards.add(mainPanel, "Main");
        cards.add(nextPage, "Next");
        add(cards);
        setVisible(true);
    }

    private static void createAndShowGUI() {
        JFrame frame = new JFrame("MainPanel");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        Controller con = new Controller();
        frame.getContentPane().add(con);
        frame.setSize(800, 600);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI();
            }
        });
    }


    public void changeCard(String card) {
        CardLayout cl = (CardLayout) (cards.getLayout());
        cl.show(cards, card);
    }

    public static Controller getInstance() {
        return instance;
    }
}
主要内容:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import java.util.*;

public class Main extends JPanel implements ActionListener {

    private JButton search, add, delete;
    private JTextField textField;

    public Main() {

        search = new JButton("Search");
        add = new JButton("Add");
        delete = new JButton("Delete");
        textField = new JTextField(20);
        add.addActionListener(this);
        delete.addActionListener(this);
        setLayout(new BorderLayout());
        JPanel top = new JPanel();
        top.add(search);
        add(top, BorderLayout.NORTH);
        JPanel bottom = new JPanel();
        bottom.add(add);
        bottom.add(delete);
        add(bottom, BorderLayout.SOUTH);
        setVisible(true);
        setSize(400, 500);
    }

    public void actionPerformed(ActionEvent e) {
        if (e.getSource() == add) {
            Controller.getInstance().changeCard("Next");
        } else if (e.getSource() == delete) {
           System.out.println("do something");
        }
    }

}
下一页:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import java.util.*;

public class NextPage extends JPanel implements ActionListener {

    private JButton back;
    private JTextField textField;

    public NextPage() {
        back = new JButton("Back");
        textField = new JTextField(20);
        back.addActionListener(this);
        setLayout(new BorderLayout());
        add(back);
        setVisible(true);
        setSize(400, 500);
    }

    public void actionPerformed(ActionEvent e) {
        if (e.getSource() == back) {
            Controller.getInstance().changeCard("Next");
        }

    }
}

按如下方式更改
控制器

private static Controller instance;

...

private static void createAndShowGUI() {
    JFrame frame = new JFrame("MainPanel");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    instance = new Controller();
    frame.getContentPane().add(instance);
    frame.setSize(800, 600);
    frame.setVisible(true);
}

实际上,您在
Controller
的实例上创建并显示了所有内容,但使用了另一个实例来管理事件。对
控制器
构造函数的多次调用应该已经敲响了警钟,因为您只需要一个
控制器

像这样更改
控制器

private static Controller instance;

...

private static void createAndShowGUI() {
    JFrame frame = new JFrame("MainPanel");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    instance = new Controller();
    frame.getContentPane().add(instance);
    frame.setSize(800, 600);
    frame.setVisible(true);
}

实际上,您在
Controller
的实例上创建并显示了所有内容,但使用了另一个实例来管理事件。对
控制器
构造函数的多次调用应该已经敲响了警钟,因为您只需要一个
控制器

像这样更改
控制器

private static Controller instance;

...

private static void createAndShowGUI() {
    JFrame frame = new JFrame("MainPanel");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    instance = new Controller();
    frame.getContentPane().add(instance);
    frame.setSize(800, 600);
    frame.setVisible(true);
}

实际上,您在
Controller
的实例上创建并显示了所有内容,但使用了另一个实例来管理事件。对
控制器
构造函数的多次调用应该已经敲响了警钟,因为您只需要一个
控制器

像这样更改
控制器

private static Controller instance;

...

private static void createAndShowGUI() {
    JFrame frame = new JFrame("MainPanel");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    instance = new Controller();
    frame.getContentPane().add(instance);
    frame.setSize(800, 600);
    frame.setVisible(true);
}

实际上,您在
Controller
的实例上创建并显示了所有内容,但使用了另一个实例来管理事件。对
控制器
构造函数的多次调用应该已经敲响了警钟,因为您只需要一个
控制器

为了使类遵循
单例
模式,同一类的构造函数(
控制器
在本例中)应该是
私有的
,这样就不能无意中从外部创建实例。为了使类遵循
单例
模式,同一类的构造函数(
Controller
,在本例中)应该是
private
,这样就不能无意中从外部创建实例。为了使类遵循
单例
模式,同一类的构造函数(
Controller
,在本例中)应该是
private
,为了使类遵循
单例
模式,同一类(
Controller
在本例中)的构造函数应该是
private
,这样就不能从外部无意地创建实例。