java - 如何强制 BoxLayout 和 JScrollPane 限制内容大小?

标签 java swing jscrollpane boxlayout

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

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

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

正文之前:

Before entering text

正文后:

After entering text

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

当将滚动条策略设置为 JScrollPane.HORIZONTAL_SCROLLBAR_​​NEVER 时,甚至会出现此行为:

After entering text, without a scrollbar

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

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

上述示例的代码段:

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

如果面板中组件的最小尺寸(在水平轴上)大于窗口的宽度(例如,如果我在其中添加一个按钮),最好的解决方案仍然是实现水平滚动条文本字段左侧)。

最佳答案

使用不同的布局管理器,例如 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);

关于java - 如何强制 BoxLayout 和 JScrollPane 限制内容大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34147328/

相关文章:

java - 设置 JComponent 的对齐方式

java - run方法中的代码未运行

Java 按钮做同样的事情,我该如何改变它?

java - 如何在 jframe java swing 中调整 jscrollpane 的大小?

java - eclipse 中的 JTable 不显示列名

Java - 设置jScrollBar的位置

java - 字符串数组和字符串

java - HQL - 查找属性 x 最高的实体

java - 来自 sql 的 JTable 工具提示?

Java Swing HTML 解析器的方法未按预期工作