0

私はこの複雑な問題に遭遇し、デバッグとグーグル検索に 4 時間以上費やしましたが、役に立ちませんでした..

基本的にここにあるのは、1 つの JFrame と 2 つの JPanels です。JFrame setContentPane を JPanel の 1 に設定しました。アプリケーションを実行すると、JPanel を含む JFrame が表示されます。

この JPanel には JButton が 1 つあり、クリックすると別の 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);

    }

}
4

3 に答える 3

1

CardLayout を使用してみましたが、NSEW 形式しかありません。

どういう意味ですか?CardLayout には、単純に 2 つ以上のパネルが含まれます。一度に表示できるパネルは 1 つだけです。各パネルは、パネル上にコンポーネントをレイアウトするために必要なレイアウトを使用できます。

クリックすると、別の JPanel に切り替わります。

それはまさに CardLayout が行うことです。実際の例と説明については、Card Layout の使用方法に関する Swing チュートリアルを参照してください。

remove/add/revalidate/repaint のようなコードを見ると、ほとんどの場合 CardLayout に置き換える必要があります。

于 2013-06-14T15:11:20.120 に答える
0

あなたで解決できると思いCardLayoutますが、別の方法は、たとえば Handler を使用してパネルを切り替えることです。

    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();
    }
于 2013-06-14T13:32:03.857 に答える
0

問題はおそらくクラスの次の行にありますOnlineShopAdPane.java

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

JPanelがネストされているフレームを参照していません。代わりに、新しいOnlineShopMainFrame

于 2013-06-14T13:40:51.857 に答える