プログラムで同じフレーム内の複数のパネルを切り替えたいという問題があります。私が遭遇している問題は、パネルが切り替わったときにレイアウトを設定できず、切り替え後にコンテンツがピクセルごとに低下することです。これが私のコードです。
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.FlowLayout;
import javax.swing.JFrame;
public class Main {
public static boolean logged_in = false;
public static int width = 200, height = 400;
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
Dimension d = new Dimension(width, height);
First frame = new First();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(d);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
frame.setResizable(true);
frame.setLayout(new FlowLayout());
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
}
フレームを保持する 2 つのクラスを次に示します。
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
public class First extends JFrame {
JPanel contentPane;
private JButton button_1;
private JTextField text;
public First(){
contentPane = new JPanel();
setContentPane(contentPane);
button_1 = new JButton("Second frame");
button_1.setVisible(true);
text = new JTextField(20);
text.setVisible(true);
contentPane.add(button_1);
contentPane.add(text);
thehandler handler = new thehandler();
button_1.addActionListener(handler);
}
private class thehandler implements ActionListener {
public void actionPerformed(ActionEvent event) {
if (event.getSource() == button_1) {
contentPane.removeAll();
contentPane.invalidate();
Second frame = new Second();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationRelativeTo(null);
frame.setResizable(true);
frame.setLayout(new FlowLayout());
frame.contentPane.setVisible(true);
contentPane.add(frame.contentPane);
((JPanel) contentPane).revalidate();
contentPane.setSize(200, 400);
contentPane.repaint();
}
}
}
}
そして2つ目
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
public class Second extends JFrame {
JPanel contentPane;
private JButton button_1;
private JTextField text;
public Second(){
contentPane = new JPanel();
setContentPane(contentPane);
button_1 = new JButton("First frame");
button_1.setVisible(true);
text = new JTextField(20);
text.setVisible(true);
contentPane.add(button_1);
contentPane.add(text);
thehandler handler = new thehandler();
button_1.addActionListener(handler);
}
private class thehandler implements ActionListener {
public void actionPerformed(ActionEvent event) {
if (event.getSource() == button_1) {
contentPane.removeAll();
contentPane.invalidate();
First frame = new First();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationRelativeTo(null);
frame.setResizable(true);
frame.setLayout(new FlowLayout());
frame.contentPane.setVisible(true);
contentPane.add(frame.contentPane);
((JPanel) contentPane).revalidate();
contentPane.setSize(200, 400);
contentPane.repaint();
}
}
}
}
どんな助けでも大歓迎です。私はJava GUIがあまり得意ではないことに注意してください。タイ。
EDIT答えを探すのに多くの時間を費やした後、私は答えを得ました。おそらく完璧ではありませんが、将来の参考のために、または他の誰かがこのソリューションを必要とする場合に投稿します。これがコードです。
パネルを保持するメイン フレーム:
import javax.swing.JFrame;
import javax.swing.JPanel;
public class MainFrame extends JFrame {
public static JPanel main_panel;
private static FirstFrame first;
public MainFrame(){
setLayout(null);
setSize(400, 400);
setLocationRelativeTo(null);
setResizable(true);
setDefaultCloseOperation(EXIT_ON_CLOSE);
main_panel = new JPanel();
main_panel.setBounds(0, 0, 400, 400);
add(main_panel);
main_panel.invalidate();
main_panel.removeAll();
first = new FirstFrame();
main_panel.add(first);
main_panel.revalidate();
main_panel.repaint();
}
public static void main(String[] args) {
MainFrame frame = new MainFrame();
frame.setVisible(true);
}
}
最初のパネル:
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JPanel;
public class FirstFrame extends JPanel {
private JButton button;
public FirstFrame() {
JPanel panel = new JPanel();
panel.setPreferredSize(new Dimension(400, 400));
panel.setLayout(null);
button = new JButton("First");
button.setBounds(20, 20, 200, 40);
button.setVisible(true);
thehandler handler = new thehandler();
button.addActionListener(handler);
panel.add(button);
add(panel);
revalidate();
repaint();
}
private class thehandler implements ActionListener {
public void actionPerformed(ActionEvent event) {
if (event.getSource() == button) {
MainFrame.main_panel.invalidate();
MainFrame.main_panel.removeAll();
SecondFrame frame = new SecondFrame();
MainFrame.main_panel.add(frame);
MainFrame.main_panel.revalidate();
MainFrame.main_panel.repaint();
}
}
}
}
2番:
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JPanel;
public class SecondFrame extends JPanel {
private JButton button;
public SecondFrame() {
JPanel panel = new JPanel();
panel.setPreferredSize(new Dimension(400, 400));
panel.setLayout(null);
button = new JButton("Second");
button.setBounds(20, 20, 200, 40);
button.setVisible(true);
thehandler handler = new thehandler();
button.addActionListener(handler);
panel.add(button);
add(panel);
revalidate();
repaint();
}
private class thehandler implements ActionListener {
public void actionPerformed(ActionEvent event) {
if (event.getSource() == button) {
MainFrame.main_panel.invalidate();
MainFrame.main_panel.removeAll();
ThirdFrame frame = new ThirdFrame();
MainFrame.main_panel.add(frame);
MainFrame.main_panel.revalidate();
MainFrame.main_panel.repaint();
}
}
}
}
そして3番目:
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JPanel;
public class ThirdFrame extends JPanel {
private JButton button;
public ThirdFrame() {
JPanel panel = new JPanel();
panel.setPreferredSize(new Dimension(400, 400));
panel.setLayout(null);
button = new JButton("Third");
button.setBounds(20, 20, 200, 40);
button.setVisible(true);
thehandler handler = new thehandler();
button.addActionListener(handler);
panel.add(button);
add(panel);
revalidate();
repaint();
}
private class thehandler implements ActionListener {
public void actionPerformed(ActionEvent event) {
if (event.getSource() == button) {
MainFrame.main_panel.invalidate();
MainFrame.main_panel.removeAll();
FirstFrame frame = new FirstFrame();
MainFrame.main_panel.add(frame);
MainFrame.main_panel.revalidate();
MainFrame.main_panel.repaint();
}
}
}
}
ご覧のとおり、パネル 1 ->2 ->3 から 1 に切り替えることができますが、2 番目のパネルには切り替えることができません。あなたの答えは役に立ちました。さらなる提案は大歓迎です。