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

Java 如何强制BoxLayout和JScrollPane限制内容大小?,java,swing,jscrollpane,boxlayout,Java,Swing,Jscrollpane,Boxlayout,在JScrollPane中的BoxLayout中使用JTextField时遇到了一个问题 所需的结果是一个JTextField,它会在自身内滚动,正如您将一个比屏幕宽度长的URL粘贴到web浏览器的地址栏中时所看到的那样。当您尝试将插入符号移过文本字段的边界时,整个字符串将向左或向右移动 但是,当放入JScrollPane时,文本字段无法执行此操作,而是扩展以适应整个字符串 在案文之前: 在案文之后: 文本框会增加其宽度,从而显示滚动条,而不是我前面描述的“内部滚动”行为(文本框大小保持不变

在JScrollPane中的BoxLayout中使用JTextField时遇到了一个问题

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

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

在案文之前:

在案文之后:

文本框会增加其宽度,从而显示滚动条,而不是我前面描述的“内部滚动”行为(文本框大小保持不变,但只显示部分文本)

甚至在将滚动条策略设置为
JScrollPane时,也会发生此行为。水平滚动条从不

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

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

上述示例的代码段:

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

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

textField.setPreferredSize(new Dimension(textField.getMinimumSize().width, textField.getPreferredSize().height));
文本字段将执行“内部滚动”行为,如果窗口缩小到其最小大小以下(如下面原始问题的最终陈述所述),也会导致滚动条出现

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


JTextField
不会换行。在这种情况下,不要使用允许文本字段增长的布局管理器,可能类似于
GridBagLayout
。你可能还想看看@MadProgrammer,我不是说包装。我说的是当你输入的内容超过了一个文本字段的大小限制时。当您键入更多内容时,插入符号前面的文本似乎会在字段中向左移动。呻吟我讨厌GridBag。我对
BoxLayout