java - 换行 JTextArea 使用 GridBagLayout 占用过多空间

标签 java swing jscrollpane gridbaglayout

我一直在尝试让可滚动的 JTextArea 显示在 JList 的右侧,其中 JTextArea 占据了大部分空间,但为 JList 留下了很大一部分(JTextArea 框架的 3/4,1/4 表示 JList)。问题在于,当 JTextArea 上的 LineWrap 设置为 true 时,约束的权重似乎被忽略。

如果没有换行,JTextArea 大约占据框架的 3/4,JList 占据另外 1/4,这就是我想要的。但是,当打开换行时,JTextArea 会尝试占用尽可能多的空间,并将 JList 压缩到它包含的字符串的宽度。有趣的是,只有当您调整窗口大小时(最初看起来很好),这种情况才会发生,并且如果您在 JTextArea 中键入任何内容,它就会慢慢扩展,将 JList 向后推。至少可以说,这让我很困惑。

我制作了没有换行和调整窗口大小后换行的屏幕截图: Example

这里有一些示例代码向您展示了我的意思。删除换行语句,它看起来会很好,但是将它们保留在那里,您会发现在调整大小时,JList 被压扁了。

import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;

import javax.swing.*

public class Main {
    public static void main(String[] args) {
        JFrame frame = new JFrame();
        JPanel panel = new JPanel(new GridBagLayout());

        JTextArea area = new JTextArea();
        DefaultListModel<String> model = new DefaultListModel<>();
        JList<String> list = new JList<String>(model);
        JScrollPane scroll = new JScrollPane(area,
                JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
                JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);

        for (int i = 0; i < 5; i++)
            model.addElement("Example" + i);

        area.setLineWrap(true);
        area.setWrapStyleWord(true);

        GridBagConstraints c = new GridBagConstraints();
        c.gridx = 0;
        c.fill = GridBagConstraints.BOTH;
        c.weighty = 1;
        c.weightx = 0.3;
        panel.add(scroll, c);

        c = new GridBagConstraints();
        c.gridx = 1;
        c.fill = GridBagConstraints.BOTH;
        c.weighty = 1;
        c.weightx = 0.1;
        panel.add(list, c);

        frame.add(panel);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(500, 300);
        frame.setVisible(true);

    }
}

最佳答案

您可以使用ipadx来定义可能的最小宽度

    c.weightx = 0.1;
    c.ipadx=desiredPixelsWidthForTheList;
    panel.add(list, c);

更新

您还可以将两者放置在 JSplitPane 中并定义所需的比例。

关于java - 换行 JTextArea 使用 GridBagLayout 占用过多空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23803297/

相关文章:

java - Firebase Android - 只需要特定表位于本地设备中

java - sortedMap 上的操作

java - "public static final long USER_ACCOUNT = 32L"是什么意思?后缀L在长变量中意味着什么?

java - 调整 JScrollPane 客户端的大小而不滚动滚动条

java - JScrollPane 不显示 JPanel

java - 如何使用 Eclipse 在 Java GUI JTextArea 中滚动?

java - Joda Time : How can I divide a Period into many Intervals?

java - 从 JTable 中的排序中排除列

java - 在桌面应用程序中存储配置设置的最佳实践是什么?

java - 添加面板到面板