我正在尝试学习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();
}
}
您似乎了解并喜欢使用 GridLayout,但就像木工任务不需要使用锤子一样,有时并且经常,您会想要使用不同的布局并进行试验。
例如,考虑
.setVisibleRowCount(...)
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);
});
}
}