- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
JList 的第一列和最后一列设置为 grow: 1
。我不希望这些 JList 始终具有相同的宽度,无论包含的项有多宽。我怎样才能做到这一点?
我已经用 list.setFixedCellWidth(100)
试过了,但是周围的 JScrollPane 不再工作了。
最佳答案
所以,你的问题是多层次的。问题是,JList
提供了两个值,用于确定 JList
第一个是getPreferredSize
。 JScrollPane
将使用它来确定何时需要显示滚动条。
第二个是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();
}
}
现在,就我个人而言,我可能很想使用 FontMetrics
和 JList
的 Font
来确定如何最好地使用这些应使用值,因此您可以提供 column
和 row
值(或使用 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
,这将为两个列表提供相等的间距
这是一些“繁重”的操作(恕我直言),但它胜过每次向 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/
我正在尝试编写一个Android应用程序,它可以不断地在随机位置绘制圆圈。这已经在我的代码中完成了。我的下一个目标是慢慢地制作这些圆圈的动画,使它们“生长”到屏幕上。基本上将圆的半径从 0 增加到 3
有一个棘手的小问题:/我有一个绝对定位的 div,它没有宽度,因为内容是动态创建的。 在这个 div 中有另一个绝对定位的 div,同样没有宽度,因为内容是动态创建的。 在这个 div 中有两个动态创
我正在创建一个时间线,它的线上有圆圈表示不同的事件。当用户将鼠标悬停在圆圈上时,我想要一条线从圆圈中“长出”,最后是事件文本。有没有人对使用什么来使这种效果成为可能有任何建议。 Javascript?
初级程序员在这里。下面的代码似乎总是遇到一个错误,称为:“未分配正在释放的指针”,我不明白为什么。 结构包含动态数组,用于在读取文件后存储整数和字符串。此文件包含城市名称、高温和低温的列表。然后,在读
要解释正在发生的事情有点棘手。 http://easyuniv.com/staging/gonzaga/ 如果您访问我上面的站点,您可以看到当窗口水平收缩和扩展时背景图像如何移动。我希望做到这一点,无
我正在用 C++ 创建一个素数生成器,使用一个数组来存储我找到的素数,然后使用它们来检查势能。有没有办法在我的程序继续时“增加”我的阵列? 最佳答案 参见 std:vector。 http://new
我正在基于同一行上的两个列表构建导航。两个列表中的所有元素之间都应该有间距,但 25px最多。 flex-grow 的问题: 如果我使用 flex-grow,元素会变得大于它们自己的宽度 + 25px
我刚刚熟悉 Flex 框,当我将 flex-grow:1 应用于一组列时,它似乎使列高度均匀增长,但不是我的目标宽度。 如果我理解这一点,默认的 flex-direction 是“行”……所以理论上宽
我有两个使用 flex-grow 的“拆分”,如果只有一个存在则为 100%,如果两个都存在则为 50%/50%。问题是我希望此行为取决于 div.split 中内容的存在。 通过一些摆弄,我可以让它
HTML:
我有一个 ul 容器和 li 菜单项。容器是 100% 宽度,li 元素是父元素的 50% 宽度。 Parent 设置为显示 flex,flex 方向为 column。现在这些元素是 flex par
我试图让 views-cntnr 占用 views-cntnr 和 menubar div 未使用的任何空间。为此,我将 flex 显示设置为列方向。然后我将 views-cntnr 的 flex-g
我试图让 views-cntnr 占用 views-cntnr 和 menubar div 未使用的任何空间。为此,我将 flex 显示设置为列方向。然后我将 views-cntnr 的 flex-g
这个问题在这里已经有了答案: Targeting flex items on the last or specific row (10 个答案) 关闭 4 年前。 所以我有一个包含一些盒子的 fle
目前,我正在尝试列一个 list 。在适合我的“显示 flex 布局”并在所有浏览器上调整大小的左侧图像。我的“flex 增长布局”列表 1 用于图像,3 用于描述。没有图像,一切都很好,但是对于我的
我正在创建一个具有 2 列布局或 3 列布局的响应式网站。 我正在使用 flex-box,因为我想为它们设置顺序。 我希望方框能填满最大可用空间。 Flexbox 工作完美,除了图像不会按比例调整大小
我有一个像这样的简单页面 Header Content Footer Dialog CSS: main { display: flex; flex-direct
如果我有一个包含 2 个垂直 div 的固定高度 div,我希望第一个 div 是内容的高度,最多为父 div 的 80%,此时它的内容将在其余部分滚动它的。第二个 div 应该增长到父容器的其余部分
我想知道是什么定义了一个内存对象的开始地址是比对象的结束地址低还是高。例如: char buffer[10]; char* p = &buffer[0]; printf("%p\n",p); //0x
我有一段代码想在多线程中运行,但是当我增加要运行的线程数时,我并没有得到太多加速。在一个点之后,我遇到的线程越多,它就越糟糕,以至于比顺序运行更糟糕。 所以我想知道可能是什么问题,我想知道 Open
我是一名优秀的程序员,十分优秀!