gpt4 book ai didi

Java Swing : How to make JLists resize properly when GridBagLayout column is set to grow, 忽略了 JList 的项目宽度?

转载 作者:行者123 更新时间:2023-11-29 06:27:36 24 4
gpt4 key购买 nike

我得到了以下 GridBagLayout: enter image description here

JList 的第一列和最后一列设置为 grow: 1。我不希望这些 JList 始终具有相同的宽度,无论包含的项有多宽。我怎样才能做到这一点?

我已经用 list.setFixedCellWidth(100) 试过了,但是周围的 JScrollPane 不再工作了。

最佳答案

所以,你的问题是多层次的。问题是,JList 提供了两个值,用于确定 JList

的布局

第一个是getPreferredSizeJScrollPane 将使用它来确定何时需要显示滚动条。

第二个是getPreferredScrollableViewportSize。这为 JScrollPane 提供了一个提示,这将影响它的 preferredSize,它为布局管理器提供了一个关于如何布局的提示。

一种可能的解决方案是提供有关 getPreferredScrollableViewportSize 的更多信息,以便两个 JList 生成相同的值。然后,通过一些巧妙的布局约束,您可以使两个列表保持相同的大小。

因此,我们首先从 JList 进行扩展,并提供一种方法来查看它的 preferredScrollableViewportSize

public class FixedSizeList<E> extends JList<E> {

private Dimension preferredScrollableViewportSize;

public FixedSizeList(ListModel<E> dataModel, Dimension preferredScrollableViewportSize) {
super(dataModel);
this.preferredScrollableViewportSize = preferredScrollableViewportSize;
}

@Override
public Dimension getPreferredScrollableViewportSize() {
if (preferredScrollableViewportSize != null) {
return preferredScrollableViewportSize;
}
return super.getPreferredScrollableViewportSize();
}

}

现在,就我个人而言,我可能很想使用 FontMetricsJListFont 来确定如何最好地使用这些应使用值,因此您可以提供 columnrow 值(或使用 visibleRowCount 属性)。这意味着这些值是“字符”而不是像素,但这只是我。

接下来,我们需要限制布局,使两个列表不会占用 50% 的可用空间。

setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = 0;
gbc.weightx = 0.5;
gbc.weighty = 1.0;
gbc.fill = GridBagConstraints.BOTH;

JList shortList = new FixedSizeList(new ShortModel(), new Dimension(150, 300));
JList longList = new FixedSizeList(new LongModel(), new Dimension(150, 300));

add(new JScrollPane(shortList), gbc);
gbc.gridx += 2;
add(new JScrollPane(longList), gbc);

gbc.weightx = 0;
gbc.gridx = 1;

JPanel buttons = new JPanel(new GridBagLayout());
gbc = new GridBagConstraints();
gbc.fill = gbc.HORIZONTAL;
gbc.gridwidth = GridBagConstraints.REMAINDER;
for (int index = 0; index < 5; index++) {
buttons.add(new JButton(Integer.toString(index)), gbc);
}
gbc = new GridBagConstraints();
gbc.gridx = 1;
gbc.gridy = 0;
gbc.weighty = 1.0;
gbc.fill = GridBagConstraints.BOTH;
add(buttons, gbc);

“两个列表都将填充剩余可用空间”的说法很有趣。由于我们额外限制了 scrollableViewportSize,这将为两个列表提供相等的间距

Equal column widths

这是一些“繁重”的操作(恕我直言),但它胜过每次向 this 添加新元素时循环遍历两个模型的所有元素

可运行的例子...

import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.util.Random;
import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.ListModel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class Test {

public static void main(String[] args) {
new Test();
}

public Test() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
ex.printStackTrace();
}

JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}

public class TestPane extends JPanel {

public TestPane() {
setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = 0;
gbc.weightx = 1.0;
gbc.weighty = 1.0;
gbc.fill = GridBagConstraints.BOTH;

JList shortList = new FixedSizeList(new ShortModel(), new Dimension(150, 300));
JList longList = new FixedSizeList(new LongModel(), new Dimension(150, 300));

add(new JScrollPane(shortList), gbc);
gbc.gridx += 2;
add(new JScrollPane(longList), gbc);

gbc.weightx = 0;
gbc.gridx = 1;

JPanel buttons = new JPanel(new GridBagLayout());
gbc = new GridBagConstraints();
gbc.fill = gbc.HORIZONTAL;
gbc.gridwidth = GridBagConstraints.REMAINDER;
for (int index = 0; index < 5; index++) {
buttons.add(new JButton(Integer.toString(index)), gbc);
}
gbc = new GridBagConstraints();
gbc.gridx = 1;
gbc.gridy = 0;
gbc.weighty = 1.0;
gbc.fill = GridBagConstraints.BOTH;
add(buttons, gbc);
}

}

public class FixedSizeList<E> extends JList<E> {

private Dimension preferredScrollableViewportSize;

public FixedSizeList(ListModel<E> dataModel, Dimension preferredScrollableViewportSize) {
super(dataModel);
this.preferredScrollableViewportSize = preferredScrollableViewportSize;
}

@Override
public Dimension getPreferredScrollableViewportSize() {
if (preferredScrollableViewportSize != null) {
return preferredScrollableViewportSize;
}
return super.getPreferredScrollableViewportSize();
}

}

public class SizableModel extends DefaultListModel<String> {

public String makeText(int length) {
StringBuilder sb = new StringBuilder(length);
for (int index = 0; index < length; index++) {
String text = Integer.toString(index);
sb.append(text.substring(text.length() - 1));
}
return sb.toString();
}

}

public class ShortModel extends SizableModel {

public ShortModel() {
Random rnd = new Random();
for (int index = 0; index < 5; index++) {
addElement(makeText(Math.max(1, rnd.nextInt(5))));
}
}

}

public class LongModel extends SizableModel {

public LongModel() {
Random rnd = new Random();
for (int index = 0; index < 10; index++) {
addElement(makeText(Math.max(5, rnd.nextInt(15))));
}
}

}
}

关于Java Swing : How to make JLists resize properly when GridBagLayout column is set to grow, 忽略了 JList 的项目宽度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49978526/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com