我在JScrollPane中有一个Jlist,我设置了一个原型值,这样它就不必计算大列表的宽度,而只是使用这个默认宽度。
现在,问题是Jlist由于某种原因用点(...)替换元素的末尾,因此永远不会显示水平滚动条。
如何使用“换行”禁用?如果它们比Jlist的宽度宽,那么长元素不会被点替换?
我在一个小例子应用程序中重现了这个问题。如果你不明白我的意思,请运行它:
import javax.swing.*;
import java.awt.*;
public class Test
{
//window
private static final int windowWidth = 450;
private static final int windowHeight = 500;
//components
private JFrame frame;
private JList classesList;
private DefaultListModel classesListModel;
public Test()
{
load();
}
private void load()
{
//create window
frame = new JFrame("Test");
frame.setSize(windowWidth, windowHeight);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setUndecorated(true);
frame.getRootPane().setWindowDecorationStyle(JRootPane.PLAIN_DIALOG);
//classes list
classesListModel = new DefaultListModel();
classesList = new JList(classesListModel);
classesList.setPrototypeCellValue("prototype value");
classesList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
classesList.setVisibleRowCount(20);
JScrollPane scrollClasses = new JScrollPane(classesList, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
for (int i = 0; i < 200; i++)
{
classesListModel.addElement("this is a long string, does not fit in width");
}
//panel
JPanel drawingArea = new JPanel();
drawingArea.setBackground(Color.white);
drawingArea.add(scrollClasses);
frame.add(drawingArea);
//set visible
frame.setVisible(true);
}
}
即使你强制使用水平滚动条,你仍然无法滚动,因为由于点(...)包裹,元素实际上并不宽于宽度。
提前致谢。
答案 0 :(得分:3)
当添加到滚动窗格的组件的首选大小大于滚动窗格的大小时,会自动显示滚动条。
通过使用setPrototypeCellValue(...)方法,您正在影响列表计算其首选大小的方式,这意味着您有责任提供确保字符串不会被截断的正确值。
所以简单的解决方案不是不使用该方法,而是需要将滚动窗格的首选大小设置为您想要的任何内容。然后,如果需要,将出现水平滚动条。
答案 1 :(得分:2)
我对这个问题的回答是首先找到列表中最长的元素然后使用 关于那个元素的setPrototype方法
答案 2 :(得分:1)
当您致电classesList.setPrototypeCellValue("prototype value")
时,您告诉JList
classesList
将其最大宽度限制为字符串“原型值”的长度。 (See javadocs)
然后,当您使用字符串填充列表时“这是一个长字符串,不适合宽度”,难怪它不适合宽度!因为你给它的原型的宽度小于你填充列表的字符串的宽度。
JScrollPane将自动显示滚动条,您通常无需调整其行为。 JList还将自动调整其宽度,以尝试显示列表中的最大宽度项。当您通过调用setPrototypeCellValue()
告诉JList修复其宽度时会发生此问题。
如果你发表评论
classesList.setPrototypeCellValue("prototype value");
或用
替换它 classesList.setPrototypeCellValue("this is a long string, does not fit in width");
然后它将按照你的预期运作。