JScrollPane没有在JList上工作

Joh*_*ith 1 java swing jscrollpane jlist

码:

list1items = new DefaultListModel();
list1items.addElement("-");
list1 = new JList(list1items);
list1.setSelectionMode (ListSelectionModel.SINGLE_SELECTION);
list1.setBounds(0,0, 100,100);
JScrollPane list1scr = new JScrollPane(list1);
list1scr.setPreferredSize(new Dimension(20, 20));
list1.setVisibleRowCount(8);
getContentPane().add (list1scr);
Run Code Online (Sandbox Code Playgroud)

并且没有滚动条出现.当项目太多,它们被隐藏时,我无法接触到它们.怎么解决这个?

Mic*_*dan 9

getContentPane().add(list1scr);
Run Code Online (Sandbox Code Playgroud)

  • @ brano88:[我应该避免在Java Swing中使用set(Preferred | Maximum | Minimum)Size方法](http://stackoverflow.com/q/7229226/230513)? (4认同)
  • +1好抓:-)但最好删除你的评论_quickly_ - 一般规则是永远不要做任何手动调整/定位组件 (3认同)
  • @ brano88每个`JComponents`都可以返回自己的`PreferredSize`,`JList`有可见行的方法,与空的`JPanel` /`JComponent`相反(`在Swing中绘画'doeas不返回任何'Dimension`,` JPanel`对于`Standard LayoutManagers`是空的,然后必须覆盖`PreferredSize` (3认同)
  • 请发布SSCCE以获得进一步的帮助. (3认同)

Nic*_*ppe 5

为了扩展 Michael Ardan 的答案,您将 JList 添加到面板而不是 JScrollPane 中。必须将 JScrollPane 添加到面板中,并且必须将 JList 添加到 ScrollPane 中才能使其正常工作。确实没有必要使用setBoundssetPreferredSize摆脱它们。当您调用该方法时,JList 会处理所有这些事情setVisibleRowCount。这是 ScrollPane 工作的示例。如果您仍然遇到问题,请将您自己的代码插入到此示例中,直到出现问题。然后告诉我们是什么破坏了它。如果没有,请接受迈克尔的回答。

import java.awt.*;
import javax.swing.*;

public class Temp extends JPanel{
    public Temp(){

        DefaultListModel list1items = new DefaultListModel();
        list1items.addElement("-");
        for(int i = 0; i < 200; i++)
            list1items.addElement("Item " + i);
        JList list1 = new JList(list1items);
        list1.setSelectionMode (ListSelectionModel.SINGLE_SELECTION);
        JScrollPane list1scr = new JScrollPane(list1);
        list1.setVisibleRowCount(8);
        add (list1scr);
    }


    public static void main(String[] args) {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setContentPane(new Temp());
        frame.pack();
        frame.setVisible(true);
    }
}
Run Code Online (Sandbox Code Playgroud)