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

在不同类的JPanels之间切换

慕容耘豪
2023-03-14

我偶然发现了这种并发症,花了4个多小时调试和谷歌搜索,但无济于事...

基本上我这里有1个JFrame,2个JPanel。我将JFrame设置为JPanel的第1个内容窗格,当我运行应用程序时,JFrame将显示,其中包含JPanel。

现在这个JPanel里面有1个JButton,当我点击它时,我希望它切换到另一个JPanel。正如您从代码中看到的,当我单击JButton(AddProduct)时,我希望onlineshoppadpane切换到AddProduct。我尝试使用CardLayout,但它只有NSEW格式

package OnlineShop.ui;

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

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

public class OnlineShopMainFrame extends JFrame {

    /**
     * Launch the application.
     */
    AddProduct Add;

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

    /**
     * Create the frame.
     */
    public OnlineShopMainFrame() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 450, 300);

        OnlineShopAdPane AdPanel = new OnlineShopAdPane();
        setContentPane(AdPanel);

    }


}


package OnlineShop.ui;

import javax.swing.JPanel;
import java.awt.CardLayout;
import javax.swing.JLabel;
import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.BorderLayout;

public class OnlineShopAdPane extends JPanel {

    /**
     * Create the panel.
     */

    public OnlineShopAdPane() {

        JLabel lblWhatDoYou = new JLabel("What do you want to do?");
        lblWhatDoYou.setBounds(28, 26, 160, 26);
        add(lblWhatDoYou);

        JButton btnAddProduct = new JButton("Add Product");
        btnAddProduct.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                OnlineShopMainFrame MainFrame = new OnlineShopMainFrame();
            MainFrame.removeAll();
            MainFrame.add(new AddProduct());
            MainFrame.revalidate();
            MainFrame.repaint();
            }
        });

        btnAddProduct.setBounds(46, 75, 115, 23);
        add(btnAddProduct);

    }

}


package OnlineShop.ui;

import javax.swing.JPanel;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.JTextArea;
import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

public class AddProduct extends JPanel {
    private JTextField textField;

    /**
     * Create the panel.
     */
    public AddProduct() {

        JLabel lblProductName = new JLabel("Product Name:");
        lblProductName.setBounds(35, 26, 77, 24);
        add(lblProductName);

        JLabel lblProductDescription = new JLabel("Product Description:");
        lblProductDescription.setBounds(10, 50, 106, 24);
        add(lblProductDescription);

        textField = new JTextField();
        textField.setBounds(116, 28, 141, 20);
        add(textField);
        textField.setColumns(10);

        JTextArea textArea = new JTextArea();
        textArea.setBounds(116, 66, 141, 112);
        add(textArea);

        JButton btnClose = new JButton("Close");
        btnClose.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {

            }
        });
        btnClose.setBounds(223, 244, 89, 23);
        add(btnClose);

    }

}

共有3个答案

梅修贤
2023-03-14

问题可能位于类OnlineShopAdPane中的以下行。java

OnlineShopMainFrame MainFrame = new OnlineShopMainFrame();
MainFrame.removeAll();
MainFrame.add(new AddProduct());
MainFrame.revalidate();
MainFrame.repaint();

你没有引用你的JPanel嵌套的框架.相反,你创建了一个新的OnlineShopMain Frame

咸星波
2023-03-14

我认为使用CardLayout可以解决这个问题,但另一种方法是使用一个处理程序来切换面板。

    private JComponent container; // this could be your Frame
    private JComponent loadedComponent;

public void loadContent(JComponent component, Object object ) {

        if (loadedComponent != null) {
            loadedComponent.setVisible(false);
            container.remove(loadedComponent);
            loadedComponent = null;
        }
        //TODO may check layout
        container.add(component,object);
        component.setVisible(true);
        loadedComponent = component;
        container.validate();
    }
陈刚洁
2023-03-14

我尝试使用CardLayout,但它只有NSEW格式。

那是什么意思?CardLayout只包含两个或多个面板。一次只能看到一个面板。每个面板可以使用它想要的任何布局来布局面板上的组件。

当我点击它时,我希望它切换到另一个JPanel。

这正是CardLayout所做的。有关如何使用Swing布局的教程和说明,请参见如何使用Swing布局示例。

每当我看到像remove/add/revalidate/repaint这样的代码时,它几乎总是应该被CardLayout替换

 类似资料:
  • 问题内容: 我想通过单击JPanels上的按钮在JPanels之间切换。 例如:我有一个带有JButton simknop的JPanel sim和一个带有JButton helpknop的JPanel帮助,我想通过单击按钮在这两个JPanel之间进行切换。当我单击JButton simknop时,应显示JPanel帮助;当我单击JButton帮助时,应显示JPanel sim。 您可以在下面找到不

  • 我有一个带有多个面板的JFrame类,我通过使用paintComponent(graphics g)方法绘制所有的图形,因此使用CardLayout没有任何用处。要切换帧,我只需点击一个按钮,比如回车,但问题是,当我切换面板时,paintCompenent中剩下的图形仍然存在。我还尝试使用panel.setvisible(false)使面板可见,这有点帮助,只是我要转换到的面板仍然不可见,即使在将

  • 问题内容: 我从UDP套接字获取了一个字节片(),并希望将其视为整数片(),而无需更改基础数组,反之亦然。在C(++)中,我只是在指针类型之间进行转换;我将如何在Go中执行此操作? 问题答案: 正如其他人所说,在Go中强制转换指针被认为是错误的形式。这是正确的Go方式示例以及与C数组转换等效的示例。 警告:所有代码未经测试。 在此示例中,我们使用包将每组4个字节转换为。这样更好,因为我们指定了字节

  • 所以我正在尝试制作一个basic程序来学习更多关于Java的知识,而我在切换屏幕时遇到了麻烦。我想有一个display类,我可以在其他类中调用它来处理所有的面板等等,然后创建一个类来构建每个面板。我现在尝试做的是使用startmenu类中的一个按钮使用display类中的一个方法从一个面板切换到另一个面板。 以下是类中的代码: 下面是我的display类:

  • 下面的代码生成九个单独的JPanels,其中有9个按钮。九个JPanel使用GridLayout排列到一个基本JPanel上。然后使用边框布局将这个基本JPanel放置到ContentPane上。我对JButtons和每个JPanel使用边框来明确定义它们的分离。每个JPanel中的JButtons看起来都很好,但是JPanels之间有一个间隙,这导致了双行的出现,这让我非常恼火。我尝试将每个JP

  • 我正在做一些项目,其中一些使用不同的JDK。在JDK版本之间切换不舒服。所以我想知道是否有什么简单的方法来更改它? 我发现了2种方法,应该可以解决这个问题,但它不起作用。 第一个解决方案是创建这样的bat文件: 在运行了这个蝙蝠之后,我看到了正确版本的Java。但是当我关闭这个CMD并打开一个新的并输入“java版本”时,它说我仍然有1.8.0_25。所以它不起作用。 我找到的第二个解决方案是这个