我对定位组件以及文本字段和文本区域(Java Swing)的一些问题有一些疑问。非常感谢任何帮助。
现在我正在尝试将两个文本字段放在一起,每个文本字段上面都有一个不同的标签,用于描述该文本字段的作用。为实现这一点,我将它们放在GridLayout(2, 2)
中。
这是最好的方法吗?这是我知道直接在另一个组件上标签的唯一方法。有没有更好的办法?如果一个按钮上方只有一个标签怎么办?通过GridLayout(2, 1)
定位这个是明智的吗?我有视力障碍,所以我不认为定位按钮只是它们的像素位置是一个选项,除非有一种简单的方法将组件的相对像素数放置到另一个组件。
这引出了我的下一个问题。
拥有与上面相同的UI但是在其下居中的另一个组件(按钮)的最佳方法是什么。本质上,UI应该由两个命名文本字段组成,其下有一个计算按钮。我这样做的方法是将上面的组件放在一个面板中,然后将其加上计算按钮添加到带有GridLayout(2, 1)
的周围面板。问题是按钮变得和它上面的面板一样大(我假设)。如何调整此项并仍然在文本字段/标签面板下完美对齐按钮?与文本区域上方的标签类似。标签应该很小,但文本区域的空间要大。
(文字字段): 再次参考上面的UI,如果用户在第一个文本字段中键入了许多字符,那么字母是否会覆盖右侧的文本字段?如果是这样,我该如何防止这种情况?
如果我将文字附加到文本区域并且已经填满,它是否会自动允许用户滚动?如果不是什么是使文本区域可滚动的简单方法?
现在我没有设置文本区域的大小。它是否随着我添加文字而增长?它是否具有字符数的默认大小?
答案 0 :(得分:9)
有许多布局管理器可能能够为您提供所需的功能。
因为,GridBagLayout
将是我的选择(我有偏见,因为我过去12年一直在使用这个版面管理器;)
public class TestLayout17 {
public static void main(String[] args) {
new TestLayout17();
}
public TestLayout17() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
}
JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
frame.add(new TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class TestPane extends JPanel {
public TestPane() {
setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = 0;
gbc.insets = new Insets(2, 2, 2, 2);
add(new JLabel("Label 1"), gbc);
gbc.gridx++;
add(new JLabel("Label 2"), gbc);
gbc.gridx = 0;
gbc.gridy++;
gbc.fill = GridBagConstraints.HORIZONTAL;
add(new JTextField(10), gbc);
gbc.gridx++;
add(new JTextField(10), gbc);
gbc.gridx = 0;
gbc.gridy++;
gbc.fill = GridBagConstraints.NONE;
gbc.gridwidth = 2;
add(new JButton("Click"), gbc);
}
}
}
我同意Eng.Fouad关于使用复合容器从长远来看让你的生活更轻松的建议
在阅读时,您可能会发现Laying Out Components Within a Container的价值。
答案 1 :(得分:8)
现在我正试图让两个文本字段彼此相邻 每个上面的不同标签描述了该文本字段的作用。至 实现这一点我已将它们放在GridLayout(2,2)中。这是 最好的办法?这是我知道直接贴上标签的唯一方法 另一个组件。有没有更好的办法?如果有的话怎么样? 一个按钮上方的一个标签。通过这个定位是明智的吗? GridLayout(2,1)?
我自己,我总是通过BorderLayout
的嵌套面板来做。例如:
JFrame frame = new JFrame("The Title");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel panOuter = new JPanel(new BorderLayout());
JPanel panLeft = new JPanel(new BorderLayout());
panLeft.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
JPanel panRight = new JPanel(new BorderLayout());
panRight.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
panOuter.add(panLeft, BorderLayout.WEST);
panOuter.add(panRight, BorderLayout.EAST);
JLabel lblLeft = new JLabel("Label 1", JLabel.CENTER);
JLabel lblRight = new JLabel("Label 2", JLabel.CENTER);
JTextField txtLeft = new JTextField(10);
JTextField txtLright = new JTextField(10);
panLeft.add(lblLeft, BorderLayout.NORTH);
panLeft.add(txtLeft, BorderLayout.CENTER);
panRight.add(lblRight, BorderLayout.NORTH);
panRight.add(txtLright, BorderLayout.CENTER);
frame.setContentPane(panOuter);
frame.pack();
frame.setVisible(true);
请注意,您可以通过设置空边框来操纵组件之间的间隙。此外,您可以使用BorderLayout.LINE_START
和BorderLayout.LINE_END
代替使用BorderLayout.WEST
和BorderLayout.EAST
,这将增加对RTL语言的支持(例如阿拉伯语)。
这引出了我的下一个问题。什么是最好的方式 与上面相同的UI,但在其下居中的另一个组件(按钮)。 本质上,UI应该由两个命名文本字段组成 计算下的按钮。我这样做的方法是把上面的内容 面板中的组件,并将该计算按钮添加到a 带有GridLayout(2,1)的周围面板。问题是, 按钮变得和它上面的面板一样大(我假设)。我怎么能够 调整这个,仍然按下按钮完全对齐 文本区/标签小组?
我会像之前那样通过嵌套面板来实现,但现在底部面板有一个FlowLayout
布局管理器,以便为按钮获得良好的尺寸:
JFrame frame = new JFrame("The Title");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel panOuter = new JPanel(new BorderLayout());
JPanel panLeft = new JPanel(new BorderLayout());
panLeft.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
JPanel panRight = new JPanel(new BorderLayout());
panRight.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
JPanel panBottom = new JPanel(); // default is FlowLayout
panBottom.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
panOuter.add(panLeft, BorderLayout.WEST);
panOuter.add(panRight, BorderLayout.EAST);
panOuter.add(panBottom, BorderLayout.SOUTH);
JLabel lblLeft = new JLabel("Label 1", JLabel.CENTER);
JLabel lblRight = new JLabel("Label 2", JLabel.CENTER);
JTextField txtLeft = new JTextField(10);
JTextField txtLright = new JTextField(10);
JButton btnBottom = new JButton("Press it!");
panLeft.add(lblLeft, BorderLayout.NORTH);
panLeft.add(txtLeft, BorderLayout.CENTER);
panRight.add(lblRight, BorderLayout.NORTH);
panRight.add(txtLright, BorderLayout.CENTER);
panBottom.add(btnBottom);
frame.setContentPane(panOuter);
frame.pack();
frame.setVisible(true);
与文本区域上方的标签类似。标签应该很小但是 为。下的文本区域留出更大的空间。
我建议您使用TitledBorder
:
JFrame frame = new JFrame("The Title");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel panOuter = new JPanel(new BorderLayout());
JPanel panLeft = new JPanel(new BorderLayout());
panLeft.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
JPanel panRight = new JPanel(new BorderLayout());
panRight.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
JPanel panBottom = new JPanel(); // default is FlowLayout
panBottom.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
JPanel panInput = new JPanel(new BorderLayout());
panInput.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
JPanel panConsole = new JPanel(new BorderLayout());
Border outsideBorder = BorderFactory.createEmptyBorder(5, 5, 5, 5);
Border insideBorder = BorderFactory.createTitledBorder("The Console");
Border theBorder = BorderFactory.createCompoundBorder(outsideBorder, insideBorder);
panConsole.setBorder(theBorder);
panInput.add(panLeft, BorderLayout.WEST);
panInput.add(panRight, BorderLayout.EAST);
panInput.add(panBottom, BorderLayout.SOUTH);
panOuter.add(panInput, BorderLayout.NORTH);
panOuter.add(panConsole, BorderLayout.CENTER);
JLabel lblLeft = new JLabel("Label 1", JLabel.CENTER);
JLabel lblRight = new JLabel("Label 2", JLabel.CENTER);
JTextField txtLeft = new JTextField(10);
JTextField txtLright = new JTextField(10);
JButton btnBottom = new JButton("Press it!");
JTextArea txtConsole = new JTextArea(5, 10);
panLeft.add(lblLeft, BorderLayout.NORTH);
panLeft.add(txtLeft, BorderLayout.CENTER);
panRight.add(lblRight, BorderLayout.NORTH);
panRight.add(txtLright, BorderLayout.CENTER);
panBottom.add(btnBottom);
panConsole.add(txtConsole, BorderLayout.CENTER);
frame.setContentPane(panOuter);
frame.pack();
frame.setVisible(true);
第三个(文本字段):再次参考上面的UI,如果用户输入 很多字符进入第一个文本字段,字母会翻过来 右边的文字字段?如果是这样,我怎么能阻止这个?
尝试上面的代码,看看它是如何起作用的:)
第四:如果我将文字附加到文本区域并且已经满了,那么 它会自动允许用户滚动?如果不是一个简单的方法 使文本区域可滚动?
您需要使用名为JScrollPane
的内容:
JFrame frame = new JFrame("The Title");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel panOuter = new JPanel(new BorderLayout());
JPanel panLeft = new JPanel(new BorderLayout());
panLeft.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
JPanel panRight = new JPanel(new BorderLayout());
panRight.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
JPanel panBottom = new JPanel(); // default is FlowLayout
panBottom.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
JPanel panInput = new JPanel(new BorderLayout());
panInput.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
JPanel panConsole = new JPanel(new BorderLayout());
Border outsideBorder = BorderFactory.createEmptyBorder(5, 5, 5, 5);
Border insideBorder = BorderFactory.createTitledBorder("The Console");
Border theBorder = BorderFactory.createCompoundBorder(outsideBorder, insideBorder);
panConsole.setBorder(theBorder);
panInput.add(panLeft, BorderLayout.WEST);
panInput.add(panRight, BorderLayout.EAST);
panInput.add(panBottom, BorderLayout.SOUTH);
panOuter.add(panInput, BorderLayout.NORTH);
panOuter.add(panConsole, BorderLayout.CENTER);
JLabel lblLeft = new JLabel("Label 1", JLabel.CENTER);
JLabel lblRight = new JLabel("Label 2", JLabel.CENTER);
JTextField txtLeft = new JTextField(10);
JTextField txtLright = new JTextField(10);
JButton btnBottom = new JButton("Press it!");
JTextArea txtConsole = new JTextArea(5, 10);
JScrollPane srcPane = new JScrollPane(txtConsole,
JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
panLeft.add(lblLeft, BorderLayout.NORTH);
panLeft.add(txtLeft, BorderLayout.CENTER);
panRight.add(lblRight, BorderLayout.NORTH);
panRight.add(txtLright, BorderLayout.CENTER);
panBottom.add(btnBottom);
panConsole.add(srcPane, BorderLayout.CENTER);
frame.setContentPane(panOuter);
frame.pack();
frame.setVisible(true);
我希望我回答你所有问题:)