JPanel против GroupManager - PullRequest
       29

JPanel против GroupManager

0 голосов
/ 04 мая 2020

У меня проблема со сборкой двух ContentPanes, одна из которых находится на стартовой странице, а вторая появится после нажатия кнопки. Мой тестовый код с двумя JPanels работает:

public Main() {
    initComponents(); 
}
private void initComponents() {
    this.setDefaultCloseOperation(EXIT_ON_CLOSE);
    this.setBounds(new Rectangle(1280, 720));
    this.getContentPane().add(p1);

    p1.add(b1);
    b1.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            getContentPane().add(p2);
            p2.add(l1);
            p1.setVisible(false);
        }
    });

}
JButton b1 = new JButton("click");
JLabel l1 = new JLabel("test123");
JPanel p1 = new JPanel();
JPanel p2 = new JPanel();
public static void main(String args[]) {
    new Main().setVisible(true);
}

Но главная проблема заключается в использовании GroupLayout. Я пытался свернуть JPanel на ContentPane для использования метода setVisible (), но он не работает - основной компот со вторыми компонентами отображается одновременно (та же панель контента). Код ниже:

 public void initComponents() {
    this.setDefaultCloseOperation(EXIT_ON_CLOSE);
    this.setBounds(new Rectangle(1280, 720));

    GroupLayout layout = new GroupLayout(getContentPane());
    this.getContentPane().setLayout(layout);
    panelStart = (JPanel) this.getContentPane();

    //design_code

    pack();

    buttonStart.addActionListener(new Gameplay());
}
private class Gameplay implements ActionListener{

    public Gameplay() throws HeadlessException {
        initComponents1();
    }

    public void initComponents1(){
        panelGameplay = (JPanel) getContentPane();

        javax.swing.GroupLayout layout1 = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout1);

    //design_code

    pack();
}

    @Override
    public void actionPerformed(ActionEvent e) {
        getContentPane().add(panelGameplay);
        panelStart.setVisible(false);
    }
}

Буду рад, если вы мне поможете: D

1 Ответ

0 голосов
/ 04 мая 2020

Ниже код работает нормально. Вы создаете Panels, InternalFrames или любой другой контейнер и просто добавляете его на многоуровневую панель. Я думаю, что этот подход сделает всю работу.

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

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JLabel;
import javax.swing.JLayeredPane;
import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import javax.swing.JComboBox;

public class Main extends JFrame {
private JPanel contentPane;
private JButton toPanel2Button;
private JLayeredPane layeredPane;
private JPanel panel1;
private JPanel panel2;
private JLabel label2;
private JButton toPanel1Button;

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

/**
 * Create the frame.
 */
public Main() {
    initComponents();
    createEvents();
}


private void initComponents() {
    //init frame
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setBounds(100, 100, 552, 410);
    contentPane = new JPanel();
    contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
    setContentPane(contentPane);
    contentPane.setLayout(null);


    //create a layered pane
    layeredPane = new JLayeredPane();
    layeredPane.setBounds(0, 0, 536, 371);
    contentPane.add(layeredPane);


    //create the panel as you like it
    panel1 = new JPanel();
    panel1.setBounds(0, 0, 536, 371);
    panel1.setLayout(null);


    //you can add everything you like
    toPanel2Button = new JButton("Change Panel");
    toPanel2Button.setBounds(142, 269, 216, 58);
    panel1.add(toPanel2Button);


    JLabel label1 = new JLabel("This is panel 1");
    label1.setBounds(142, 68, 216, 51);
    panel1.add(label1);


    //add it to the layered pane
    layeredPane.add(panel1);


    //create another panel
    panel2 = new JPanel();
    panel2.setBounds(0, 0, 536, 371);

    panel2.setLayout(null);


    //add the components you like
    label2 = new JLabel("This is another label");
    label2.setBounds(155, 73, 193, 42);
    panel2.add(label2);

    toPanel1Button = new JButton("GO BACK!");
    toPanel1Button.setBounds(160, 261, 89, 23);
    panel2.add(toPanel1Button);


    //add it to the layered pane

    layeredPane.add(panel2);
}


private void createEvents() {   

    toPanel2Button.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            //remove all layeres
            layeredPane.removeAll();

            //add the one you like
            layeredPane.add(panel2);

            //must revalidate to show it.. see layeredPane.add method javadoc
            layeredPane.repaint();

            //and a revalidate for good measure
            layeredPane.revalidate();
        }
    });


    toPanel1Button.addActionListener(new ActionListener() {

        //same this for another button
        public void actionPerformed(ActionEvent e) {
            layeredPane.removeAll();
            layeredPane.add(panel1);
            layeredPane.repaint();
            layeredPane.revalidate();
        }
    });
}

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...