我一直在尝试让可滚动的 JTextArea 显示在 JList 的右侧,其中 JTextArea 占据了大部分空间,但为 JList 留下了很大一部分(JTextArea 框架的 3/4,1/4 表示 JList)。问题在于,当 JTextArea 上的 LineWrap 设置为 true 时,约束的权重似乎被忽略。
如果没有换行,JTextArea 大约占据框架的 3/4,JList 占据另外 1/4,这就是我想要的。但是,当打开换行时,JTextArea 会尝试占用尽可能多的空间,并将 JList 压缩到它包含的字符串的宽度。有趣的是,只有当您调整窗口大小时(最初看起来很好),这种情况才会发生,并且如果您在 JTextArea 中键入任何内容,它就会慢慢扩展,将 JList 向后推。至少可以说,这让我很困惑。
我制作了没有换行和调整窗口大小后换行的屏幕截图:
这里有一些示例代码向您展示了我的意思。删除换行语句,它看起来会很好,但是将它们保留在那里,您会发现在调整大小时,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/