Кнопки в JPanel SOUTH перемещаются рядом с элементами в JPanel NORTH при расширении окна - PullRequest
0 голосов
/ 29 октября 2018

Я пишу некоторый простой код, который должен иметь строки и должен иметь метку и ввод текста в верхней строке и 4 кнопки в нижней строке. При изменении размера окна все должно оставаться на своем месте, а не перетекать в одну строку. Сейчас я упускаю что-то, что мешает моему нижнему ряду перейти к моему верхнему ряду, когда jframe становится шире.

Структура выглядит как JFRAME (ContainerPanel NORTH (NORTH: subPanelTop (метка и ввод), SOUTH: subPanelBottom (Buttons))

Когда я открываю программу и получаю JFrame с шириной 200 пикселей, все появляется в двух строках, как и должно быть, но когда я изменяю размер, чтобы быть шире, все появляется в верхнем ряду. Как заставить их оставаться двумя рядами друг над другом независимо от ширины?

Моя домашняя работа говорит, что я "должен использовать borderlayout".

Код:

myEventA.java

import javax.swing.*;
import java.awt.*;
public class myEventA extends JFrame{
    public myEventA(){
        JPanel panelTop = new JPanel();
        JPanel containerPanel = new JPanel();
        this.setTitle("MyEventA");


        JPanel subPanelTop = new JPanel();
        JLabel currentValueLbl = new JLabel("Current Value: ",SwingConstants.RIGHT);
        JTextField currentValue = new JTextField(15);
        subPanelTop.add(currentValueLbl);
        subPanelTop.add(currentValue);
        containerPanel.add(subPanelTop, BorderLayout.NORTH);


        JPanel subPanelBottom = new JPanel();
        JButton btn1 = new JButton("+");
        JButton btn2 = new JButton("-");
        JButton btn3 = new JButton("Reset");
        JButton btn4 = new JButton("Quit");
        subPanelBottom.add(btn1);
        subPanelBottom.add(btn2);
        subPanelBottom.add(btn3);
        subPanelBottom.add(btn4);
        containerPanel.add(subPanelBottom, BorderLayout.SOUTH);
        containerPanel.setPreferredSize(new Dimension(640, 480));
        this.add(containerPanel, BorderLayout.NORTH);
    }
}

TestMyEventA.java

import javax.swing.*;   // for JFrame, JPanel, JLabel, JTextField, 
import java.awt.*;      // for BorderLayout
public class TestMyEventA {
    public static void main(String[] args) {    
        myEventA test = new myEventA();
        test.setSize(200,300);

        test.setLocationRelativeTo(null);
        test.setVisible(true);
        test.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}

1 Ответ

0 голосов
/ 29 октября 2018

Я понял это. Мне пришлось вручную установить все мои JFrames и JPanels для использования BorderLayout, добавив несколько строк .setLayout (new BorderLayout ());

Теперь работает!

Код:

import javax.swing.*;
import java.awt.*;
public class myEventA extends JFrame{
    public myEventA(){
        this.setLayout(new BorderLayout());
        JPanel containerPanel = new JPanel();
        containerPanel.setLayout(new BorderLayout());
        this.setTitle("MyEventA");


        JPanel subPanelTop = new JPanel();
        JLabel currentValueLbl = new JLabel("Current Value: ",SwingConstants.RIGHT);
        JTextField currentValue = new JTextField(15);
        subPanelTop.add(currentValueLbl);
        subPanelTop.add(currentValue);
        containerPanel.add(subPanelTop, BorderLayout.NORTH);


        JPanel subPanelBottom = new JPanel();
        JButton btn1 = new JButton("+");
        JButton btn2 = new JButton("-");
        JButton btn3 = new JButton("Reset");
        JButton btn4 = new JButton("Quit");
        subPanelBottom.add(btn1);
        subPanelBottom.add(btn2);
        subPanelBottom.add(btn3);
        subPanelBottom.add(btn4);
        containerPanel.add(subPanelBottom, BorderLayout.SOUTH);
        this.add(containerPanel, BorderLayout.NORTH);
    }
}
...