当前位置: 首页 > 知识库问答 >
问题:

在具有卡片布局的JPanel中两个JPanel之间的交换

东郭鸿福
2023-03-14

我试图让两个jpanels通过这些特定面板上的按钮交换,我不想让普通的按钮在两个面板上都像普通的卡片布局使用重复在两个面板上。我已经尝试有一个按钮称为‘添加’在主面板上导致下一页和按钮在下一页称为‘返回’导致主面板。然而,出于某种原因,它不起作用。我不希望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");
        }

    }
}

共有1个答案

金昌胤
2023-03-14

更改控制器,如下所示:

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的实例上创建了所有内容并显示了它,但使用了另一个实例来管理事件。对控制器构造函数的多次调用应该敲响了铃声,因为您只需要一个控制器

 类似资料:
  • 我必须为学校制作一个游戏,而且我在点击jb按钮切换jpanel时遇到了一些麻烦。我想使用CardLayout,但我对Java还不熟悉,这使得它非常困难。我的目标是将我的所有面板放在不同的类中,比如类“Panel 1”,类“Panel 2”等等(而不是在我的主(JFrame)类中创建我的JPanel,这样我的代码更容易阅读)。是否可以将CardLayout容器放入包含my JFrame的类中?还有,

  • 问题内容: 所以我有一个叫做extends 的类。它使用空布局。我如何将其用作常规组件?当我将它放在另一个窗口中然后添加到窗口中时,它消失了。仅当我直接将其添加到窗口时,它才可见。 编辑:是的,我意识到使用带有null布局的A是不好的做法。实际上是别人的代码,我正在尝试将其用于我的目的,而不必重构它。 问题答案: 仅当我直接将其添加到窗口时,它才可见。 这是因为默认情况下,窗口使用BorderLa

  • 我想知道我们是否可以有一个布局不同于其父JFrame的JPanel。例如。如果我有JFrame与边框布局,我们有一个JPanel嵌入到它,它有不同的布局。有可能吗? 我正在努力做这件事。但是这样JPanel的组件就不会显示出来了。

  • 我需要在中制作这样的表。 有什么想法如何做到这一点,以获得像下面图片上的布局吗?

  • 我为欢迎屏幕设计了一个接口,其中有一个JFrame,包括两个JPanel(JPanel1在右边,JPanel2在左边)。左边的按钮用于切换JPanel1中的面板。我想按下一个按钮,用另一个JPanel替换JPanel1内容,但我不知道怎么做。请帮忙。