在不同类中的jpanel之间切换



我偶然发现了这个复杂的问题,花了4个多小时调试和谷歌搜索,但无济于事。

基本上我这里有1个JFrame, 2个jpanel。我将JFrame的setContentPane设置为JPanel的1,当我运行应用程序时,JFrame将出现,其中包含JPanel。

现在这个JPanel里面有一个JButton,当我点击它时,我想让它切换到另一个JPanel。正如您从代码中看到的,当我单击JButton(添加产品)时,我希望OnlineShopAdPane切换到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);
    }
}

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

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

当我点击它时,我想让它切换到另一个JPanel。

这正是CardLayout所做的。请参阅Swing教程中关于如何使用卡片布局的工作示例和解释。

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

我认为与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();
    }

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

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

没有指向嵌套JPanel的框架。而是创建一个新的OnlineShopMainFrame

最新更新