使用 Java swing 和布局管理器对齐组件时出现问题

问题描述 投票:0回答:1

我正在尝试学习java swing。我遇到了麻烦,我认为这是由布局管理器和我使用它们的方式引起的。

在下面所附的图片中,您会看到

JList
添加到
JSchrollPane
(文本显示 XX 的那个)。该列表的高度非常小,我无法将其提高。空间充足,列表中有 10 项。我认为它可以一次显示超过 1 个项目。

下面指出了与面板和其他组件最相关的代码。

另一件事是下面的巨大按钮。我不知道为什么它占用了这么大的空间。我尝试过将它放在不同的面板中,也尝试过直接通过JFrame添加它,但我没有得到任何好的结果。我只是想让它看起来更小,并且位于框架的底部。如果按下按钮,JList 将有足够的空间更高/更大。如有任何帮助,我们将不胜感激。

下面是创建 GUI 的完整代码。可以复制并运行。谢谢

panCourseCheckboxes = new JPanel(new GridLayout(4, 1));
manageCourseTitleBorder = new TitledBorder("Manage Course");
addStudTitledBorder.setTitleColor(Color.RED);
manageCourseTitleBorder.setTitleColor(Color.RED);
panCourseCheckboxes.setBorder(manageCourseTitleBorder);
addCourseCheckBox = new JCheckBox("Attach student to course");      
labAllCourses = new JLabel("Courses");  
    
panCourseCheckboxes.add(addCourseCheckBox);
panCourseCheckboxes.add(labAllCourses);
panCourseCheckboxes.add(courseSchrollPane);

import java.awt.*;

import javax.swing.*;
import javax.swing.border.TitledBorder;
public class SwingTutorial {

    private JFrame frame;
    private JPanel panAddStud, panCourseCheckboxes;
    private JTextField tFieldAddStudFirstName, tFieldAddStudStudLastName, tFieldAddStudEmail;
    private JLabel labelAddStudFirstName, labelAddStudLastName, labelAddStudEmail, labAllCourses;
    private JButton addStudBut;
    private JCheckBox addCourseCheckBox;
    private JList<String> coursesList;
    //private JSeparator separator;
    private JScrollPane courseSchrollPane;  
    private Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
    private TitledBorder addStudTitledBorder, manageCourseTitleBorder;

    private int frameWidth = screenSize.width/3, 
            frameHeight = screenSize.height/2;
    private int textFieldWidth = 20,
            textFieldHeight = 10;           
    private int panTextFieldWidth = screenSize.width/3,
            panTextFieldHeight = screenSize.height/3;
    
    public SwingTutorial() {
        frame = new JFrame("Manage course");
        frame.setLayout(new GridLayout(4, 2));
        frame.pack();       
        frame.setSize(frameWidth, frameHeight);

        panAddStud = new JPanel(new GridLayout(3, 2));
        //panAddStud = new JPanel();
        panAddStud.setSize(panTextFieldWidth, panTextFieldHeight);
        addStudTitledBorder = new TitledBorder("Add student");          
        addStudTitledBorder.setTitleColor(Color.RED);
        panAddStud.setBorder(addStudTitledBorder);
        
        //panStudentBut = new JPanel(new GridLayout());
        
        labelAddStudFirstName = new JLabel("First name");
        labelAddStudLastName = new JLabel("Last name");
        labelAddStudEmail = new JLabel("Email");
        
        tFieldAddStudFirstName = new JTextField(); 
        tFieldAddStudFirstName.setSize(textFieldWidth, textFieldHeight);        

        tFieldAddStudStudLastName = new JTextField();
        tFieldAddStudStudLastName.setSize(textFieldWidth, textFieldHeight);

        tFieldAddStudEmail = new JTextField();
        tFieldAddStudEmail.setSize(textFieldWidth, textFieldHeight);

        addStudBut = new JButton("Add student");
        
        panCourseCheckboxes = new JPanel(new GridLayout(4, 1));
        manageCourseTitleBorder = new TitledBorder("Manage Course");
        addStudTitledBorder.setTitleColor(Color.RED);
        manageCourseTitleBorder.setTitleColor(Color.RED);
        panCourseCheckboxes.setBorder(manageCourseTitleBorder);
        addCourseCheckBox = new JCheckBox("Attach student to course");      
        labAllCourses = new JLabel("Courses");      
        
        String tempL[] = { "XX", "YY", "BB", "TT", "OO", "VV", "EE", "LL", "PP", "PP" };        
        coursesList = new JList<String>(tempL);
        courseSchrollPane = new JScrollPane(coursesList);
        courseSchrollPane.setPreferredSize(new Dimension(20, 100));
    }
    
    public void createGUI() {
        panAddStud.add(labelAddStudFirstName);
        panAddStud.add(tFieldAddStudFirstName);

        panAddStud.add(labelAddStudLastName);
        panAddStud.add(tFieldAddStudStudLastName);

        panAddStud.add(labelAddStudEmail);
        panAddStud.add(tFieldAddStudEmail);         

        frame.add(panAddStud);
        //frame.add(separator);
        
        panCourseCheckboxes.add(addCourseCheckBox);
        panCourseCheckboxes.add(labAllCourses);
        panCourseCheckboxes.add(courseSchrollPane);
        
        frame.add(panCourseCheckboxes);     

        //panStudentBut.add(addStudBut);
        
        frame.add(addStudBut);
        //frame.add(panStudentBut);

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);                       
        frame.setVisible(true);
    }
    
    
    public static void main(String[] args) {    
        SwingTutorial sw = new SwingTutorial();
        sw.createGUI();
    }

}
java swing layout-manager
1个回答
0
投票

您似乎了解并喜欢使用 GridLayout,但就像木工任务不需要使用锤子一样,有时并且经常,您会想要使用不同的布局并进行试验。

例如,考虑

  • 给整个GUI一个以页面轴为导向的BoxLayout。
  • 给学生 JPanel 一个 GridBagLayout
  • 是的,将 JList 放在 JScrollPane 中
  • 是的,在 JList 上调用
    .setVisibleRowCount(...)
  • 但不要人为地限制 JScrollPane 的大小,例如通过 setPreferredSize。
  • 添加所有组件后在 JFrame 上调用
    pack()
  • 然后才将其设置为可见。

例如:

import java.awt.BorderLayout;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;

import javax.swing.*;

public class SwingTut2 extends JPanel {
    private static final int TF_COLS = 20;
    private static final String[] COURSES = { "Math", "Science", "History", "English", "Art", "Music", "PE",
            "Computer Science", "Biology", "Chemistry" };
    private static final int COURSE_LIST_ROW_COUNT = 5;
    private JTextField studentFirstName = new JTextField(TF_COLS);
    private JTextField studentLastName = new JTextField(TF_COLS);
    private JTextField studentEmail = new JTextField(TF_COLS);
    private JList<String> coursesList = new JList<>(COURSES);
    private JButton addStudentButton = new JButton("Add Student");

    public SwingTut2() {
        JPanel studentPanel = new JPanel(new GridBagLayout());
        studentPanel.setBorder(BorderFactory.createTitledBorder("Add Student"));
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.anchor = GridBagConstraints.WEST;
        gbc.gridx = 0;
        gbc.gridy = 0;
        gbc.weightx = 1.0;
        gbc.weighty = 1.0;
        gbc.insets = new Insets(5, 5, 5, 5);
        gbc.fill = GridBagConstraints.HORIZONTAL;
        studentPanel.add(new JLabel("First Name:"), gbc);
        gbc.gridy++;
        studentPanel.add(new JLabel("Last Name:"), gbc);
        gbc.gridy++;
        studentPanel.add(new JLabel("Email:"), gbc);
        gbc.gridx = 1;
        gbc.gridy = 0;
        gbc.weightx = 2.0;
        studentPanel.add(studentFirstName, gbc);
        gbc.gridy++;
        studentPanel.add(studentLastName, gbc);
        gbc.gridy++;
        studentPanel.add(studentEmail, gbc);

        coursesList.setVisibleRowCount(COURSE_LIST_ROW_COUNT);
        JPanel coursePanel = new JPanel(new BorderLayout(5, 5));
        coursePanel.setBorder(BorderFactory.createTitledBorder("Courses"));
        coursePanel.add(new JScrollPane(coursesList), BorderLayout.CENTER);

        JPanel btnPanel = new JPanel();
        btnPanel.add(addStudentButton);

        setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS));
        setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
        add(studentPanel);
        add(coursePanel);
        add(btnPanel);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            SwingTut2 mainPanel = new SwingTut2();
            JFrame frame = new JFrame("SwingTut2");
            frame.add(mainPanel);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.add(new SwingTut2());
            frame.pack();
            frame.setLocationRelativeTo(null);
            frame.setVisible(true);
        });
    }
}

创造:

© www.soinside.com 2019 - 2024. All rights reserved.