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

时间:2015-12-08 03:12:14

标签: java swing jscrollpane boxlayout

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

当您将长度超过屏幕宽度的网址粘贴到网络浏览器的地址栏中时,您会看到所需的结果是自身滚动的JTextField。当您尝试将插入符号移过文本字段的边界时,整个字符串向左或向右移动。

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

在文本之前:

Before entering text

文字后:

After entering text

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

将滚动条策略设置为JScrollPane.HORIZONTAL_SCROLLBAR_NEVER时会出现此问题:

After entering text, without a scrollbar

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

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

以上示例的代码段:

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

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

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

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

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

文本字段将执行“内部滚动”行为,并且如果窗口缩小到其最小尺寸以下,则会导致滚动条出现(如下面原始问题的最终声明中所述)

  

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