如何使 BoxLayout 正确左对齐?
How to make BoxLayout left-align properly?
我创建了一个 Box
,其中包含一个 JLabel
,以及一个包含 JTextArea
的 JScrollPane
。但是 JLabel
的左侧总是有一些 space:
完整演示代码:
import java.awt.*;
import javax.swing.*;
public class BoxAlignmentTest extends JFrame {
public static void main(String[] args) {
BoxAlignmentTest test = new BoxAlignmentTest();
test.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
test.setSize(500, 200);
test.setVisible(true);
}
public BoxAlignmentTest() throws HeadlessException {
Box box = Box.createVerticalBox();
setContentPane(box);
JLabel label = new JLabel("This label isn't fully left-aligned.");
label.setOpaque(true);
label.setBackground(Color.orange);
label.setAlignmentX(Component.LEFT_ALIGNMENT); // Set left alignment
box.add(label);
box.add(new JScrollPane(new JTextArea("This is a text area.")));
}
}
使用 setBorder(BorderFactory.createEmptyBorder(int top, int left, int bottom, int right);
参考:https://docs.oracle.com/javase/7/docs/api/javax/swing/BorderFactory.html
How to Use BoxLayout (The Java™ Tutorials > Creating a GUI With JFC/Swing > Laying Out Components Within a Container)
The X alignments affect not only the components' positions relative to each other, but also the location of the components (as a group) within their container.
因此,不仅JLabel
而且JScrollPane
都需要setAlignmentX(Component.LEFT_ALIGNMENT)
。
import java.awt.*;
import javax.swing.*;
public class BoxAlignmentTest2 extends JFrame {
public static void main(String[] args) {
EventQueue.invokeLater(() -> {
BoxAlignmentTest2 test = new BoxAlignmentTest2();
test.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
test.setSize(500, 200);
test.setVisible(true);
});
}
public BoxAlignmentTest2() throws HeadlessException {
JLabel label = new JLabel("This label isn't fully left-aligned.");
label.setOpaque(true);
label.setBackground(Color.orange);
label.setAlignmentX(Component.LEFT_ALIGNMENT); // Set left alignment
JScrollPane scroll = new JScrollPane(new JTextArea("This is a text area."));
scroll.setAlignmentX(Component.LEFT_ALIGNMENT); // <- add
Box box = Box.createVerticalBox();
box.add(label);
box.add(scroll);
add(box); // = getContentPane().add(box, BorderLayout.CENTER);
}
}
我创建了一个 Box
,其中包含一个 JLabel
,以及一个包含 JTextArea
的 JScrollPane
。但是 JLabel
的左侧总是有一些 space:
完整演示代码:
import java.awt.*;
import javax.swing.*;
public class BoxAlignmentTest extends JFrame {
public static void main(String[] args) {
BoxAlignmentTest test = new BoxAlignmentTest();
test.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
test.setSize(500, 200);
test.setVisible(true);
}
public BoxAlignmentTest() throws HeadlessException {
Box box = Box.createVerticalBox();
setContentPane(box);
JLabel label = new JLabel("This label isn't fully left-aligned.");
label.setOpaque(true);
label.setBackground(Color.orange);
label.setAlignmentX(Component.LEFT_ALIGNMENT); // Set left alignment
box.add(label);
box.add(new JScrollPane(new JTextArea("This is a text area.")));
}
}
使用 setBorder(BorderFactory.createEmptyBorder(int top, int left, int bottom, int right); 参考:https://docs.oracle.com/javase/7/docs/api/javax/swing/BorderFactory.html
How to Use BoxLayout (The Java™ Tutorials > Creating a GUI With JFC/Swing > Laying Out Components Within a Container)
The X alignments affect not only the components' positions relative to each other, but also the location of the components (as a group) within their container.
因此,不仅JLabel
而且JScrollPane
都需要setAlignmentX(Component.LEFT_ALIGNMENT)
。
import java.awt.*;
import javax.swing.*;
public class BoxAlignmentTest2 extends JFrame {
public static void main(String[] args) {
EventQueue.invokeLater(() -> {
BoxAlignmentTest2 test = new BoxAlignmentTest2();
test.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
test.setSize(500, 200);
test.setVisible(true);
});
}
public BoxAlignmentTest2() throws HeadlessException {
JLabel label = new JLabel("This label isn't fully left-aligned.");
label.setOpaque(true);
label.setBackground(Color.orange);
label.setAlignmentX(Component.LEFT_ALIGNMENT); // Set left alignment
JScrollPane scroll = new JScrollPane(new JTextArea("This is a text area."));
scroll.setAlignmentX(Component.LEFT_ALIGNMENT); // <- add
Box box = Box.createVerticalBox();
box.add(label);
box.add(scroll);
add(box); // = getContentPane().add(box, BorderLayout.CENTER);
}
}