【问题标题】:JScrollPane and GridBagLayoutJScrollPane 和 GridBagLayout
【发布时间】:2015-03-10 03:09:44
【问题描述】:

我想创建两个固定大小的不可编辑的文本框(每个将只包含一行),但我希望它们是可滚动的(仅水平滚动),因为我知道它们将包含的文本会很长。我希望它们位于我在下面定义的两个按钮下方,并且我希望每个文本框都位于它们自己的行中。

问题是,一切都显示出来,按钮按预期工作,但文本框不会滚动,尽管我可以以某种方式拖动并选择框中不可见的其余文本。我不知道标签是否可以滚动,它们会是更好的选择吗?

代码:

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;
}

【问题讨论】:

标签: java swing user-interface layout-manager gridbaglayout


【解决方案1】:
  1. 永远不要使用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 显示水平滚动条...
  2. 不要将JTextAreaJScrollPane 同时添加到容器中。添加JTextArea 会自动将其从JScrollPane 中删除,这不是您想要的。
  3. 使用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

【讨论】:

  • 非常感谢!完全按照我的意图工作,感谢您准确阐明 JTextArea 的构造函数如何工作以及它如何与 JScrollPane 一起工作,那篇文章本身让我有点困惑哈哈。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-29
  • 2019-09-04
  • 1970-01-01
  • 2011-10-15
  • 1970-01-01
相关资源
最近更新 更多