расположение JPanel на нужном месте

154
17 января 2019, 11:00

Не могу заставить располагаться кнопку на нужном месте, делаю Layout командой add(buttonPanel, BorderLayout.SOUTH);и add(centerPanel, BorderLayout.CENTER); не получается. Смысл в том, что я хочу одной кнопкой переключать видимость определенной JPanel, и вроде бы это получается, но вот панели не находятся в нужном месте, хотя их расположение я задаю, помогите пожалуйста найти ошибку

 enum ViewState {
    START_STATE, NEXT_STATE; }
class CenterPanel extends JPanel {
    public CenterPanel() {
        JPanel  centerPanel = new JPanel();
        centerPanel.setBackground(Color.cyan);
        centerPanel.setLayout(new GridLayout());
        add(centerPanel, BorderLayout.CENTER);
        JButton button = new JButton("ONE");
        button.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                MyWindows.changeState(ViewState.START_STATE);
            }
        });
        centerPanel.add(button);
        this.add(centerPanel);
    } }
class ButtonPanel extends JPanel {
    public ButtonPanel() {
        JPanel  buttonPanel = new JPanel();
        buttonPanel.setBackground(Color.blue);
        add(buttonPanel, BorderLayout.SOUTH);
        buttonPanel.setLayout(new GridLayout());
        JButton button = new JButton("TWO");
        button.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                MyWindows.changeState(ViewState.NEXT_STATE);
            }
        });
        buttonPanel.add(button);
        this.add(buttonPanel);
    } }
public class Main {
    public static void main(String[] args) {
        MyWindows MW = new MyWindows();
    } }
class MyWindows extends JFrame {
    private static ViewState viewState;
    private static JFrame frame;
    private static JPanel mpanel;
    private static JPanel panelUp;
    private static JPanel panelDown;
    protected MyWindows(){
        frame = new JFrame();
        mpanel = new JPanel();
        panelUp = new CenterPanel();
        panelDown = new ButtonPanel();
        changeState(ViewState.START_STATE);
        frame.setSize(400,400);
        frame.add(mpanel);
        frame.setVisible(true);
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    }
    public static void changeState(ViewState state) {
        viewState = state;
        System.out.println("change state: " + viewState);
        switch (state) {
            case START_STATE:
                mpanel.removeAll();
                mpanel.add(panelDown);
                mpanel.revalidate();
                mpanel.repaint();
                break;
            case NEXT_STATE:
                mpanel.removeAll();
                mpanel.add(panelUp);
                mpanel.revalidate();
                mpanel.repaint();
                break;
            default:
                System.out.println("UNKNOWN STATE!");
                break;
        }
    } }
Answer 1

я упустил один момент, в конструкторе я указывал нужный компоновщик, но упустил тот момент, что его надо так же установить в классе MyWindows, что бы все расставить на свои места, например класс панели CenterPanel у меня выглядит так:

class CenterPanel extends JPanel {
    public CenterPanel() {
        JPanel  centerPanel = new JPanel();
        centerPanel.setBackground(Color.white);
        centerPanel.setLayout(new GridLayout());
        add(centerPanel, BorderLayout.CENTER);
    }
} 

а строки кода, где я вызываю его в MyWindows так:

class MyWindows extends JFrame {
private static JPanel panelUp;
protected MyWindows(){
panelUp = new CenterPanel();
frame.setSize(400,400);
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frame.setLocationRelativeTo(null);
 frame.add(panelUp, BorderLayout.CENTER);
        panelUp.setLayout(new GridLayout());
frame.setVisible(true);
    }
READ ALSO
JavaFX. Взаимодействие Controller и Aplication

JavaFX. Взаимодействие Controller и Aplication

Я создаю приложениеЕсть основной функционал, но хотелось бы видеть его функциональность в виде счетчика

147
Хранилище Массивов

Хранилище Массивов

Когда создадим массив, например, типа char, где он сохраняется - в heap, stack или pool?

179
Не отображается желаемый спец-символ (css)

Не отображается желаемый спец-символ (css)

Пожалуйста подскажите, почему не отображается необходимый мне символ: По идее должна появиться стрелка http://wwwtemplatebest

194
Что такое css selector level?

Что такое css selector level?

Читаю статью про список css селекторов, объясните пожалуйста что значит css level и почему в таблице из статьи разные селекторы имеют различный...

149