JScrollPane 和 GridBagLayout
JScrollPane and GridBagLayout
我想创建两个固定大小的不可编辑的文本框(每个文本框只包含一行),但我希望它们是可滚动的(仅水平),因为我知道它们包含的文本会很长.我希望它们位于我在下面定义的两个按钮下方,并且我希望每个文本框位于它们自己的行中。
问题是,一切都显示出来并且按钮按预期工作,但文本框不会滚动,尽管我可以以某种方式拖动和 select 框中不可见的其余文本。我不知道标签是否可以滚动,它们会是更好的选择吗?
代码:
public static void main(String[] args)
{
JFrame win = new JFrame("Window");
win.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
win.setSize(400, 300);
GridBagConstraints c = new GridBagConstraints();
win.setLayout( new GridBagLayout() );
JTextArea master = new JTextArea(1,1);
JTextArea vendor = new JTextArea(1,1);
master.setEditable(false);
vendor.setEditable(false);
master.setPreferredSize( new Dimension(100,20) );
vendor.setPreferredSize( new Dimension(100,20) );
master.setText(/*some really long string*/);
vendor.setText(/*some really long string*/);
JScrollPane mPane = new JScrollPane(master, JScrollPane.VERTICAL_SCROLLBAR_NEVER, JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
JScrollPane vPane = new JScrollPane(vendor, JScrollPane.VERTICAL_SCROLLBAR_NEVER, JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
mPane.getHorizontalScrollBar().isVisible();
vPane.getHorizontalScrollBar().isVisible();
JButton one = new JButton("Select");
ActionListener select = new SelectButton(master, vendor);
one.addActionListener(select);
JButton two = new JButton("Run");
c.gridx = 0;
c.gridy = 0;
win.add(one, c);
c.gridx = 1;
c.gridy = 0;
win.add(two, c);
c.gridx = 0;
c.gridy = 1;
win.add(master, c);
win.add(mPane, c);
c.gridx = 0;
c.gridy = 2;
win.add(vendor, c);
win.add(vPane, c);
win.setLocationRelativeTo(null);
win.setVisible(true);
return;
}
- 永远不要使用
setPreferredSize
!这覆盖了 JScrollPane
需要的信息,以便决定组件应该如何滚动。有关详细信息,请参阅 Should I avoid the use of set(Preferred|Maximum|Minimum)Size methods in Java Swing?。而是使用 JTextArea(int, int)
构造函数为 JScrollPane
提供提示,例如 JTextArea master = new JTextArea(1, 20);
。任何超过 20
个字符的文本都会导致 JScrollPane
显示水平滚动条...
- 不要将
JTextArea
和 JScrollPane
同时添加到容器中。添加 JTextArea
会自动将其从 JScrollPane
中删除,这不是您想要的。
- 使用
GridBagConstaints#gridwidth
控制组件可能扩展的列数以帮助修复布局...
例如...
c.gridx = 0;
c.gridy = 1;
c.gridwidth = GridBagConstraints.REMAINDER;
win.add(mPane, c);
c.gridx = 0;
c.gridy = 2;
win.add(vPane, c);
我希望这是一个非常简单的示例,否则,您应该始终确保您的 UI 是在 EDT 的上下文中创建和修改的。有关详细信息,请参阅 Initial Threads
我想创建两个固定大小的不可编辑的文本框(每个文本框只包含一行),但我希望它们是可滚动的(仅水平),因为我知道它们包含的文本会很长.我希望它们位于我在下面定义的两个按钮下方,并且我希望每个文本框位于它们自己的行中。
问题是,一切都显示出来并且按钮按预期工作,但文本框不会滚动,尽管我可以以某种方式拖动和 select 框中不可见的其余文本。我不知道标签是否可以滚动,它们会是更好的选择吗?
代码:
public static void main(String[] args)
{
JFrame win = new JFrame("Window");
win.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
win.setSize(400, 300);
GridBagConstraints c = new GridBagConstraints();
win.setLayout( new GridBagLayout() );
JTextArea master = new JTextArea(1,1);
JTextArea vendor = new JTextArea(1,1);
master.setEditable(false);
vendor.setEditable(false);
master.setPreferredSize( new Dimension(100,20) );
vendor.setPreferredSize( new Dimension(100,20) );
master.setText(/*some really long string*/);
vendor.setText(/*some really long string*/);
JScrollPane mPane = new JScrollPane(master, JScrollPane.VERTICAL_SCROLLBAR_NEVER, JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
JScrollPane vPane = new JScrollPane(vendor, JScrollPane.VERTICAL_SCROLLBAR_NEVER, JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
mPane.getHorizontalScrollBar().isVisible();
vPane.getHorizontalScrollBar().isVisible();
JButton one = new JButton("Select");
ActionListener select = new SelectButton(master, vendor);
one.addActionListener(select);
JButton two = new JButton("Run");
c.gridx = 0;
c.gridy = 0;
win.add(one, c);
c.gridx = 1;
c.gridy = 0;
win.add(two, c);
c.gridx = 0;
c.gridy = 1;
win.add(master, c);
win.add(mPane, c);
c.gridx = 0;
c.gridy = 2;
win.add(vendor, c);
win.add(vPane, c);
win.setLocationRelativeTo(null);
win.setVisible(true);
return;
}
- 永远不要使用
setPreferredSize
!这覆盖了JScrollPane
需要的信息,以便决定组件应该如何滚动。有关详细信息,请参阅 Should I avoid the use of set(Preferred|Maximum|Minimum)Size methods in Java Swing?。而是使用JTextArea(int, int)
构造函数为JScrollPane
提供提示,例如JTextArea master = new JTextArea(1, 20);
。任何超过20
个字符的文本都会导致JScrollPane
显示水平滚动条... - 不要将
JTextArea
和JScrollPane
同时添加到容器中。添加JTextArea
会自动将其从JScrollPane
中删除,这不是您想要的。 - 使用
GridBagConstaints#gridwidth
控制组件可能扩展的列数以帮助修复布局...
例如...
c.gridx = 0;
c.gridy = 1;
c.gridwidth = GridBagConstraints.REMAINDER;
win.add(mPane, c);
c.gridx = 0;
c.gridy = 2;
win.add(vPane, c);
我希望这是一个非常简单的示例,否则,您应该始终确保您的 UI 是在 EDT 的上下文中创建和修改的。有关详细信息,请参阅 Initial Threads