1

test1とtest2の2つのビューがあります

test1からtest2への切り替えは正常に機能しますが、test2から切り替えるとcontentPanelが空になります。これは私のコードです。誰かが私が間違っていることを指摘できますか?

test1

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JButton;


public class test1 extends JFrame {

JPanel contentPane;

/**
 * Launch the application.
 */
public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
        public void run() {
            try {
                test1 frame = new test1();
                frame.setVisible(true);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
}

/**
 * Create the frame.
 */
public test1() {
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setBounds(100, 100, 450, 300);
    contentPane = new JPanel();
    contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
    contentPane.setLayout(new BorderLayout(0, 0));
    setContentPane(contentPane);

    JButton btnView = new JButton("View2");
    contentPane.add(btnView, BorderLayout.CENTER);
    btnView.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent arg0) {
            contentPane.removeAll();
            contentPane.invalidate();
            test2 obj=new test2();
            obj.contentPane.setVisible(true);
            contentPane.add(obj.contentPane);
            ((JPanel)contentPane).revalidate();
            contentPane.repaint();          }
    });
}

}

test2

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JButton;

public class test2 extends JFrame {

JPanel contentPane;

/**
 * Launch the application.
 */
public static void main(String[] args) {

    EventQueue.invokeLater(new Runnable() {
        public void run() {
            try {
                test2 frame = new test2();
                frame.setVisible(true);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
}

/**
 * Create the frame.
 */
public test2() {
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setBounds(100, 100, 450, 300);
    contentPane = new JPanel();
    contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
    setContentPane(contentPane);
    contentPane.setLayout(null);

    JLabel lblThisIsView = new JLabel("this is view 2!");
    lblThisIsView.setBounds(178, 107, 110, 14);
    contentPane.add(lblThisIsView);

    JButton btnView = new JButton("View 1!");
    btnView.setBounds(168, 161, 89, 23);
    contentPane.add(btnView);

    btnView.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent arg0) {
            contentPane.removeAll();
            contentPane.invalidate();
            test1 obj=new test1();
            obj.contentPane.setVisible(true);
            contentPane.add(obj.contentPane);
            ((JPanel)contentPane).revalidate();
            contentPane.repaint();
        }
    });
}
    }
4

2 に答える 2

3

これはレイアウトの基本的な問題です。でtest1.javaコンポーネントを追加しましたBorderLayout。しかし、ではありませんtest2.java

test2のレイアウトは。である必要がありますBorderLayout。その後、すべてのコンポーネントを以下の構文で追加する必要があります-

contentPane.add(lblThisIsView,BorderLayout.CENTER);

test2.java-の完成したコード

public test2() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 450, 300);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);
        contentPane.setLayout(new BorderLayout(0, 0));

        JLabel lblThisIsView = new JLabel("this is view 2!");
        lblThisIsView.setBounds(178, 107, 110, 14);
        contentPane.add(lblThisIsView,BorderLayout.CENTER);

        JButton btnView = new JButton("View 1!");
        btnView.setBounds(168, 161, 89, 23);
        contentPane.add(btnView,BorderLayout.SOUTH);

        btnView.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                contentPane.removeAll();
                contentPane.invalidate();
                test1 obj = new test1();
                obj.contentPane.setVisible(true);
                contentPane.add(obj.contentPane);
                ((JPanel) contentPane).revalidate();
                contentPane.repaint();
            }
        });
    }

トータルコードはこちらです。


コメントからわかるように、最良の方法は使用することですCardLayout-パネルを追加するには-

public CardLayoutHelper(JPanel panel, JPanel... panels) {
        this(panel);
        for (int i = 0; i < panels.length; i++) {
            JPanel jPanel = panels[i];
            panel.add(jPanel.getName(), jPanel);
        }
    }

パネルを切り替えるには-

 public void switchPanel(String name) {
            layout.show(panel, name);
            panel.revalidate();
            panel.repaint();
        }

githubCardLayoutHelperから入手できます。

于 2012-12-05T08:57:43.533 に答える
-2

私が設定した現在のフレームに:

"classname.this.setVisible(false);"

フレームの切り替えが正常に機能するようになりました。これは正しい方法ではありませんが、私のプロジェクトの提出は今日であり、ソリューションはどこにでも実装できるほど単純です。

于 2012-12-06T00:54:45.827 に答える