Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JList-使用垂直滚动条,而不是垂直环绕方向的水平滚动条?_Java_Swing_User Interface_Jscrollpane_Jlist - Fatal编程技术网

Java JList-使用垂直滚动条,而不是垂直环绕方向的水平滚动条?

Java JList-使用垂直滚动条,而不是垂直环绕方向的水平滚动条?,java,swing,user-interface,jscrollpane,jlist,Java,Swing,User Interface,Jscrollpane,Jlist,我试图将JList放在JScrollPane中,并按字母顺序在垂直列中列出条目,如下所示: A D G B E H C F 但是,当JList空间不足,无法显示更多条目时,我希望JScrollPane仅在垂直方向上滚动 当我使用VERTICAL\u WRAP时,这一功能就起作用了。然而,似乎当我使用垂直包装时,我得到了一个水平滚动条,当我使用水平包装时,我得到了我想要的滚动条,但项目的排列顺序是我不喜欢的。我能吃我的蛋糕吗?下面是一个简单的例子,说明我正在尝试做什么 这是我能得到的最接近的

我试图将
JList
放在
JScrollPane
中,并按字母顺序在垂直列中列出条目,如下所示:

A D G
B E H
C F 
但是,当
JList
空间不足,无法显示更多条目时,我希望
JScrollPane
仅在垂直方向上滚动

当我使用
VERTICAL\u WRAP
时,这一功能就起作用了。然而,似乎当我使用垂直包装时,我得到了一个水平滚动条,当我使用
水平包装时,我得到了我想要的滚动条,但项目的排列顺序是我不喜欢的。我能吃我的蛋糕吗?下面是一个简单的例子,说明我正在尝试做什么

这是我能得到的最接近的,但我希望能够在保持垂直字母顺序的同时垂直滚动

public class ScrollListExample {
    static List<String> stringList = new ArrayList<String>();
    static {
        for (int i = 0; i < 500; i++) {
            stringList.add("test" + i);
        }
    }

    public static void main(final String[] args) {
        final JFrame frame = new JFrame();
        final Container contentPane = frame.getContentPane();
        final JList list = new JList(stringList.toArray());
        list.setLayoutOrientation(JList.VERTICAL_WRAP);
        list.setVisibleRowCount(0);
        final JScrollPane scrollPane = new JScrollPane(list);
        contentPane.add(scrollPane);
        frame.setPreferredSize(new Dimension(800, 400));
        frame.pack();
        frame.setVisible(true);
    }
}
public类滚动列表示例{
静态列表stringList=新建ArrayList();
静止的{
对于(int i=0;i<500;i++){
字符串列表。添加(“测试”+i);
}
}
公共静态void main(最终字符串[]args){
最终JFrame=新JFrame();
最终容器contentPane=frame.getContentPane();
最终JList列表=新JList(stringList.toArray());
list.setLayoutOrientation(JList.VERTICAL\u WRAP);
list.setVisibleRowCount(0);
最终JScrollPane滚动窗格=新JScrollPane(列表);
添加(滚动窗格);
frame.setPreferredSize(新尺寸(800400));
frame.pack();
frame.setVisible(true);
}
}
我想到的一个解决方案是:
如果单元大小已知,我可以创建一个组件侦听器,并侦听调整大小事件。触发该事件时,我可以计算所需的行数,以防止水平滚动。这看起来像是一个黑客,我不确定它如何与可变大小的文本组件一起工作。

这就是你想要的吗?(可能需要更改首选尺寸…)

public类滚动列表示例{
静态列表stringList=新建ArrayList();
静止的{
对于(int i=0;i<500;i++){
字符串列表。添加(“测试”+i);
}
}
公共静态void main(最终字符串[]args){
最终JFrame=新JFrame();
最终容器contentPane=frame.getContentPane();
最终JList列表=新JList(stringList.toArray());
最终JScrollPane滚动窗格=新JScrollPane(列表);
scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL\u SCROLLBAR\u ALWAYS);
scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HorizontalScrollBar\uNever);
添加(滚动窗格);
frame.setPreferredSize(新尺寸(200200));
frame.pack();
frame.setVisible(true);
}
}

我认为您的解决方案很好,根本不是一个黑客。不管怎样,任何内置功能都必须做基本相同的事情

下面是对您的示例的一个修改,可以满足您的需要

public class ScrollListExample {
    static List<String> stringList = new ArrayList<String>();
    static {
        for (int i = 0; i < 500; i++) {
            stringList.add("test" + i);
        }
    }

    public static void main(final String[] args) {
        final JFrame frame = new JFrame();
        final Container contentPane = frame.getContentPane();
        final JList list = new JList(stringList.toArray());
        list.setLayoutOrientation(JList.VERTICAL_WRAP);
        final JScrollPane scrollPane = new JScrollPane(list);
        contentPane.add(scrollPane);
        frame.setPreferredSize(new Dimension(800, 400));
        frame.pack();

        list.addComponentListener(new ComponentAdapter() {
            @Override
            public void componentResized(ComponentEvent e) {
                fixRowCountForVisibleColumns(list);
            }
        });

        fixRowCountForVisibleColumns(list);
        frame.setVisible(true);
    }

    private static void fixRowCountForVisibleColumns(JList list) {
        int nCols = computeVisibleColumnCount(list);
        int nItems = list.getModel().getSize();

        // Compute the number of rows that will result in the desired number of
        // columns
        int nRows = nItems / nCols;
        if (nItems % nCols > 0) nRows++;
        list.setVisibleRowCount(nRows);
    }

    private static int computeVisibleColumnCount(JList list) {
        // It's assumed here that all cells have the same width. This method
        // could be modified if this assumption is false. If there was cell
        // padding, it would have to be accounted for here as well.
        int cellWidth = list.getCellBounds(0, 0).width;
        int width = list.getVisibleRect().width;
        return width / cellWidth;
    }
}
public类滚动列表示例{
静态列表stringList=新建ArrayList();
静止的{
对于(int i=0;i<500;i++){
字符串列表。添加(“测试”+i);
}
}
公共静态void main(最终字符串[]args){
最终JFrame=新JFrame();
最终容器contentPane=frame.getContentPane();
最终JList列表=新JList(stringList.toArray());
list.setLayoutOrientation(JList.VERTICAL\u WRAP);
最终JScrollPane滚动窗格=新JScrollPane(列表);
添加(滚动窗格);
frame.setPreferredSize(新尺寸(800400));
frame.pack();
addComponentListener(新的ComponentAdapter(){
@凌驾
公共无效组件已恢复(组件事件e){
fixRowCountForVisibleColumns(列表);
}
});
fixRowCountForVisibleColumns(列表);
frame.setVisible(true);
}
VisibleColumns的私有静态void FixRowCount(JList列表){
int nCols=可计算可视列数(列表);
int nItems=list.getModel().getSize();
//计算将产生所需数量的行数
//纵队
int nRows=nItems/nCols;
如果(nItems%nCols>0)nRows++;
list.setVisibleRowCount(nRows);
}
私有静态int computeVisibleColumnCount(JList列表){
//这里假设所有单元格都具有相同的宽度
//如果此假设不成立,则可以修改。如果存在单元格
//填充,也必须在这里进行说明。
intCellWidth=list.getCellBounds(0,0).width;
int width=list.getVisibleRect().width;
返回宽度/单元格宽度;
}
}

Brilliant code@Kevin K。。。我建议进行一个小的修改,以避免算术异常(除以零)


使用
VERTICAL\u WRAP
时,之所以会出现水平滚动条,是因为`VERICAL\u WRAP=>表示“报纸样式”布局,单元格先垂直,然后水平流动,如果单元格将垂直流动,并且由于您的尺寸,输出将从底部包装,因此它将开始水平填充。因此,水平滚动条。这是有道理的,但我调整内部组件大小的大多数尝试并没有如我所预期的那样成功。我如何强制它显示垂直滚动条,而不是水平滚动条?是否需要调整某个特定组件的大小?@Lockyer:您需要的确切输出是什么,因为您可以使用您提到的
HORIZONTAL\u WRAP
获得
垂直滚动条。您需要的顺序是什么。我希望列表中的元素按字母顺序垂直向下移动,以便更易于扫描视觉上。就像浏览器在windows中选择“列表”视图时所做的那样
public class ScrollListExample {
    static List<String> stringList = new ArrayList<String>();
    static {
        for (int i = 0; i < 500; i++) {
            stringList.add("test" + i);
        }
    }

    public static void main(final String[] args) {
        final JFrame frame = new JFrame();
        final Container contentPane = frame.getContentPane();
        final JList list = new JList(stringList.toArray());
        list.setLayoutOrientation(JList.VERTICAL_WRAP);
        final JScrollPane scrollPane = new JScrollPane(list);
        contentPane.add(scrollPane);
        frame.setPreferredSize(new Dimension(800, 400));
        frame.pack();

        list.addComponentListener(new ComponentAdapter() {
            @Override
            public void componentResized(ComponentEvent e) {
                fixRowCountForVisibleColumns(list);
            }
        });

        fixRowCountForVisibleColumns(list);
        frame.setVisible(true);
    }

    private static void fixRowCountForVisibleColumns(JList list) {
        int nCols = computeVisibleColumnCount(list);
        int nItems = list.getModel().getSize();

        // Compute the number of rows that will result in the desired number of
        // columns
        int nRows = nItems / nCols;
        if (nItems % nCols > 0) nRows++;
        list.setVisibleRowCount(nRows);
    }

    private static int computeVisibleColumnCount(JList list) {
        // It's assumed here that all cells have the same width. This method
        // could be modified if this assumption is false. If there was cell
        // padding, it would have to be accounted for here as well.
        int cellWidth = list.getCellBounds(0, 0).width;
        int width = list.getVisibleRect().width;
        return width / cellWidth;
    }
}
private int computeVisibleColumnCount(JList list) 
    {
        int cellWidth = list.getCellBounds(0, 0).width;
        int width = list.getVisibleRect().width;
        return width == 0 ? 1 : width / cellWidth;
    }