java Как правильно спрятать JPanel

151
13 января 2019, 08:50

Хочу по нажатию Кнопки спрятать одну панель, что позволит увидеть другую У меня такой код

class MyWindow extends JFrame {
    public MyWindow (){
        setTitle("X/O");
        setBounds(300,300,400, 400);
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        ImageIcon icon = new ImageIcon("icons.png");
        setIconImage(icon.getImage());
        JPanel mainPanel = new JPanel();                  //Создаю панели
        JPanel centerPanel = new JPanel();                                           
        JPanel bottomPanel = new JPanel();
        JPanel centerPanelWindowOne = new JPanel();
        JPanel centerPanelWindowTwo = new JPanel();
        mainPanel.setBackground(Color.blue);              //Цвета основных панелей
        centerPanel.setBackground(Color.white);
        bottomPanel.setPreferredSize(new Dimension(1,40));//Расположение остальных панелей
        centerPanel.add(centerPanelWindowOne);
        centerPanel.add(centerPanelWindowTwo);
        centerPanelWindowOne.setPreferredSize(new Dimension(400,40));
        centerPanelWindowTwo.setPreferredSize(new Dimension(400,40));
        add(mainPanel, BorderLayout.CENTER);              //Указываю компановку
        add(bottomPanel, BorderLayout.SOUTH);
        add(centerPanel, BorderLayout.CENTER);
        mainPanel.setLayout(new FlowLayout());
        centerPanel.setLayout(new FlowLayout());
        bottomPanel.setLayout(new GridLayout());
        centerPanelWindowOne.setLayout(new FlowLayout());
        centerPanelWindowTwo.setLayout(new FlowLayout());
        JButton start = new JButton("Старт");
        bottomPanel.add(start);
        JButton exit = new JButton("Выход");
        bottomPanel.add(exit);
        exit.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                System.exit(0);
            }
        });
        start.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                centerPanel.setVisible(false);
            }
        });

        setVisible(true);
    }
}

Итого, после нажатия кнопки Start хочу закрыть видимости centrePanel, и увидеть mainPanel, по моей логике я сначала создаю и показываю mainPanel, а затем centrePanel, и когда кнопкой я указываю видимость false для centrePanel, то должна отображаться mainPanel, но после кнопки start, в панель centrePanel закрывается, а там ничего, как правильно реализовать?

Answer 1

Код скопирован отсюда: https://pacificsimplicity.ca/blog/simple-state-switching-java-example-using-jpanels-and-jbuttons

Кратко идея следующая:

  • Надо создать еще одну JPanel и сделать её главной, добавляешь в JFrame
  • Создаешь сколько тебе надо панелей (лучше в виде отдельных классов)
  • Когда надо сменить JPanel - просто удаляешь все с главной панели, добавляешь нужную и перерисовываешь, лучше еще сделать revalidate()

    import javax.swing.*;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    enum ViewState {
        START_STATE, NEXT_STATE;
    }
    @SuppressWarnings("serial")
    class Panel2 extends JPanel {
        public Panel2() {
            JPanel  panel2 = new JPanel();
            JButton button = new JButton("sweet");
            button.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    MyWindowTest.changeState(ViewState.START_STATE);
                }
            });
            panel2.add(button);
            this.add(panel2);
        }
    }
    @SuppressWarnings("serial")
    class Panel1 extends JPanel {
        public Panel1() {
            JPanel panel1 = new JPanel();
            JButton button = new JButton("my button");
            button.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    MyWindowTest.changeState(ViewState.NEXT_STATE);
                }
            });
            panel1.add(button);
            this.add(panel1);
        }
    }
    public class MyWindowTest {
        private static ViewState viewState;
        private static JPanel mpanel;
        private static JPanel panel1;
        private static JPanel panel2;
        private static JFrame frame;
        public MyWindowTest() {
            frame = new JFrame();
            mpanel = new JPanel();
            panel1 = new Panel1();
            panel2 = new Panel2();
            // Sets default state
            changeState(ViewState.START_STATE);
            frame.setSize(100, 100);
            frame.add(mpanel);
            frame.setVisible(true);
        }
        public static void changeState(ViewState state) {
            viewState = state;
            System.out.println("change state: " + viewState);
            switch (state) {
                case START_STATE:
                    mpanel.removeAll();
                    mpanel.add(panel1);
                    mpanel.revalidate();
                    mpanel.repaint();
                    break;
                case NEXT_STATE:
                    mpanel.removeAll();
                    mpanel.add(panel2);
                    mpanel.revalidate();
                    mpanel.repaint();
                    break;
                default:
                    System.out.println("UNKNOWN STATE!");
                    break;
            }
        }
        public static void main(String[] args) {
            @SuppressWarnings("unused")
            MyWindowTest n = new MyWindowTest();
        }
    }
    
READ ALSO
Flex и div overflow проблемы

Flex и div overflow проблемы

Почему у элемента exampleblock не появляется скроллбар? Если допустим ему задать ширину 100%, то не работаетЕсли например задать ширину для container__content,...

170
Как получить картинку с другого сайта? Js

Как получить картинку с другого сайта? Js

Есть url страницы сайта, как c данной страницы можно получить картинку с id "image"? Допустим, что url: wwwimages

172
Кнопки соц.сетей от Яндекс сбоку

Кнопки соц.сетей от Яндекс сбоку

Каким образом можно вывести кнопки сбоку в одну колонку, чтобы они плавали?

162