What is a good way to Organize multiple JPanel's in a JFrame?

痞子三分冷 提交于 2019-12-10 15:55:21

问题


What I am trying to do is organize five seperate JPanel's within the frame. Here is what the output is supposed to look like: There will be one panel across the top. Two panels directly below the top panel that vertically split the space and then another two panels that split the remaining space horizontally.

I cannot figure out how to organize the panels like described above and I think it is because I just don't know the proper syntax. So any help or advise is greatly appreciated here is the code I have thus far.

import java.lang.String.*;
import java.lang.Exception.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class Display extends JFrame implements ActionListener{
// instance variables
private static final int FRAME_WIDTH = 400;
private static final int FRAME_HEIGHT = 350;

private static final int FRAME_X_ORIGIN = 150;
private static final int FRAME_Y_ORIGIN = 150;

private static final int BUTTON_WIDTH = 90;
private static final int BUTTON_HEIGHT = 30;

private JButton readFile;
private JButton exit;
private JButton stats;
private JButton blank;

private JCheckBox avgHomeworkScore;
private JCheckBox avgTestScore;
private JCheckBox sdHomeworkScore;
private JCheckBox sdTestScore;

private JRadioButton buttonOne;
private JRadioButton buttonTwo;
private JRadioButton buttonThree;
private JRadioButton buttonFour;

private JPanel header;
private JPanel statistics;
private JPanel courses;
private JPanel display;
private JPanel action;

public static void main(String[] args){
    Display frame = new Display();
    frame.setVisible(true);
}


public Display(){

    Container contentPane;


    //Set the frame properties
    setSize         (FRAME_WIDTH, FRAME_HEIGHT);
    setResizable    (false);
    setTitle        ("CSCE155A Course Offerings Viewer");
    setLocation     (FRAME_X_ORIGIN, FRAME_Y_ORIGIN);

    contentPane = getContentPane();
    contentPane.setLayout(new GridLayout());
    contentPane.setBackground( Color.white );

    //header





    //Create and Place the Buttons on the frame
    readFile = new JButton("Read File");
    readFile.setBounds(4, 285, BUTTON_WIDTH, BUTTON_HEIGHT);


    exit = new JButton("Exit");
    exit.setBounds(100, 285, BUTTON_WIDTH, BUTTON_HEIGHT);


    stats = new JButton("Stats");
    stats.setBounds(195, 285, BUTTON_WIDTH, BUTTON_HEIGHT);


    blank = new JButton("Clear");
    blank.setBounds(290, 285, BUTTON_WIDTH, BUTTON_HEIGHT);


    action = new JPanel(new FlowLayout());
    action.setBackground(Color.blue);
    action.add(readFile); 
    action.add(exit);
    action.add(stats);
    action.add(blank);
    contentPane.add(action);

    //Register this frame as an Action listener of the buttons
    readFile.addActionListener(this);
    exit.addActionListener(this);
    stats.addActionListener(this);
    blank.addActionListener(this);

    //Create and Place the checkboxes on the frame
    avgHomeworkScore = new JCheckBox();
    avgHomeworkScore.setMnemonic(KeyEvent.VK_H);
    contentPane.add(avgHomeworkScore);
    avgHomeworkScore.setSelected(true);

    avgTestScore = new JCheckBox();
    avgTestScore.setMnemonic(KeyEvent.VK_T);
    avgTestScore.setSelected(true);

    sdHomeworkScore = new JCheckBox();
    sdHomeworkScore.setMnemonic(KeyEvent.VK_S);
    sdHomeworkScore.setSelected(true);

    sdTestScore = new JCheckBox();
    sdTestScore.setMnemonic(KeyEvent.VK_D);
    sdTestScore.setSelected(true);

    statistics = new JPanel(new GridLayout(0,1));
    contentPane.add(statistics);
    statistics.add(avgHomeworkScore);
    statistics.add(avgTestScore);
    statistics.add(sdHomeworkScore);
    statistics.add(sdTestScore);

    avgHomeworkScore.addActionListener(this);
    avgTestScore.addActionListener(this);
    sdHomeworkScore.addActionListener(this);
    sdTestScore.addActionListener(this);



    //create the radio buttons
    buttonOne = new JRadioButton();
    buttonOne.setMnemonic(KeyEvent.VK_1);
    buttonOne.setSelected(true);

    buttonTwo = new JRadioButton();
    buttonTwo.setMnemonic(KeyEvent.VK_2);

    buttonThree = new JRadioButton();
    buttonThree.setMnemonic(KeyEvent.VK_3);

    buttonFour = new JRadioButton();
    buttonFour.setMnemonic(KeyEvent.VK_4);

    ButtonGroup group = new ButtonGroup();
    group.add(buttonOne);
    group.add(buttonTwo);
    group.add(buttonThree);
    group.add(buttonFour);

    buttonOne.addActionListener(this);
    buttonTwo.addActionListener(this);
    buttonThree.addActionListener(this);
    buttonFour.addActionListener(this);

    courses = new JPanel(new GridLayout(0,1));
    courses.setBackground(Color.blue);
    courses.add(buttonOne);
    courses.add(buttonTwo);
    courses.add(buttonThree);
    courses.add(buttonFour);
    contentPane.add(courses);

    //Exit program when the viewer is closed
    setDefaultCloseOperation(EXIT_ON_CLOSE);
}

回答1:


Use a layout manager. Never set the bounds, sizes and locations of your panels and other components. That's the job of the layout manager. Layout managers are explained in details in the Swing tutorial (as everything else, BTW).

You could use a BorderLayout for the main panel, and another for the bottom panel, for example.



来源:https://stackoverflow.com/questions/13571142/what-is-a-good-way-to-organize-multiple-jpanels-in-a-jframe

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!