【问题标题】:How do I force BoxLayout and JScrollPane to restrict content size?如何强制 BoxLayout 和 JScrollPane 限制内容大小?
【发布时间】:2015-12-08 03:12:13
【问题描述】:

在 JScrollPane 的 BoxLayout 中使用 JTextField 时遇到问题。

所需的结果是一个在自身内部滚动的 JTextField,正如您将一个比屏幕宽度更长的 URL 粘贴到 Web 浏览器的地址栏中时看到的那样。当您尝试将插入符号移出文本字段的边界时,整个字符串会向左或向右移动。

但是,当放入 JScrollPane 时,文本字段无法执行此操作,而是扩展以适应整个字符串。

正文前:

正文之后:

文本框增加其宽度,导致出现滚动条,而不是我之前描述的“内部滚动”行为(文本框保持相同大小,但只显示部分文本)。

甚至在将滚动条策略设置为JScrollPane.HORIZONTAL_SCROLLBAR_NEVER 时也会出现此行为:

我注意到文本框正确执行“内部滚动”,直到调整窗口大小,此时文本字段调整自身大小离开屏幕。

我需要滚动窗格,因为我的应用程序中需要垂直滚动条,但 我希望将水平轴限制为窗口允许面板显示的任何大小。我该如何实现这个?

以上示例的代码段:

import java.awt.Dimension;
import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;

public class GUI {

    public static void main(String[] args) {
        JFrame frame = new JFrame();
        JPanel panel = new JPanel();
        JScrollPane scrollPane = new JScrollPane(panel);
        frame.add(scrollPane);
        JTextField textField = new JTextField();
        panel.add(textField);

        frame.setSize(500, 200);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        panel.setLayout(new BoxLayout(panel, BoxLayout.X_AXIS));
        // max width = Short.MAX_VALUE so it expands to fill the frame width
        // max height = preferred height so the text area height does not expand
        textField.setMaximumSize(new Dimension(Short.MAX_VALUE, textField.getPreferredSize().height));

        frame.setVisible(true);
    }
}

如果面板中组件的组合最小尺寸(在水平轴上)大于窗口的宽度(例如,如果我在其中添加一个按钮到文本字段的左侧)。

【问题讨论】:

  • JTextField 不会换行。在这种情况下,不要使用允许文本字段增长的布局管理器,比如GridBagLayout。您可能还想看看Should I avoid the use of set(Preferred|Maximum|Minimum)Size methods in Java Swing?
  • @MadProgrammer 我不是在谈论包装。我说的是当您输入超过设定大小的文本字段的限制时。当您键入更多内容时,插入符号前面的文本似乎会在字段内向左移动。

标签: java swing jscrollpane boxlayout


【解决方案1】:

使用不同的布局管理器,例如GridBagLayout,它通常会尊重组件的首选大小,例如

JFrame frame = new JFrame();
JPanel panel = new JPanel(new GridBagLayout());
JScrollPane scrollPane = new JScrollPane(panel);
frame.add(scrollPane);

GridBagConstraints gbc = new GridBagConstraints();
gbc.weightx = 1;
gbc.fill = gbc.HORIZONTAL;
JTextField textField = new JTextField(10);
panel.add(textField, gbc);

frame.setSize(500, 200);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

frame.setVisible(true);

【讨论】:

  • groan 我讨厌 GridBag。
  • 我对@9​​87654323@说同样的话
【解决方案2】:

一个简单的解决方案是将文本字段的首选宽度设置为其最小宽度。

textField.setPreferredSize(new Dimension(textField.getMinimumSize().width, textField.getPreferredSize().height));

文本字段将执行“内部滚动”行为,并在窗口缩小到其最小尺寸以下时显示滚动条(如下面原始问题的最终陈述中所述)

如果面板中组件的组合最小尺寸(在水平轴上)大于窗口的宽度(例如,如果我在其中添加一个按钮到文本字段的左侧)。

猜你喜欢
  • 2017-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-07
  • 2021-08-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多