首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DefaultListModel in JList in JScrollPane,看不到JList

DefaultListModel in JList in JScrollPane,看不到JList
EN

Stack Overflow用户
提问于 2016-05-04 14:56:29
回答 2查看 1.1K关注 0票数 0

我正在尝试在一个JList中使用一个DefaultListModel来处理一个通用的JScrollPane。然而,我看不到JList。

这是一堂课:

FieldScrollList:

代码语言:javascript
复制
    public class FieldScrollList<T> extends JScrollPane {

        private DefaultListModel<T> listModel;


        public int length () {
            return listModel.size();
        }

        public FieldScrollList () {

            setBorder(new TitledBorder(this.getClass().getSimpleName()));
            setBackground(Color.PINK);

            listModel = new DefaultListModel<>();
            JList<T> jList = new JList<>(listModel);
            add(jList);


            jList.setBorder(new TitledBorder(jList.getClass().getSimpleName()));


        }

        public void clear () {
            listModel.clear();
        }

        public void push(T t) {
            listModel.add(length(),t);
        }

        public <C extends Collection<T>> void pushAll(C coll) {
            coll.forEach(this::push);
        }

        public void pushAll(T[] coll) {
            for (T t : coll) {
                push(t);
            }
        }
    }

这是使用它的类。在本例中,我是一个FieldScrollList,它应该显示列表项: hi和hello。

代码语言:javascript
复制
public class test {


    public static void main(String[] args) {
        new Thread(() -> {
            //---------------------------------- Content initialization ------------------

            JFrame frame = new JFrame("Test");
            JPanel panel = new JPanel();
            FieldScrollList<String> list = new FieldScrollList<String>();

            //---------------------------------- Strings initialization ------------------


            ArrayList<String> strings = new ArrayList<>();
            strings.add("Hello");
            strings.add("Hi");
            strings.forEach(list::push);

            //---------------------------------- JPanel configuration --------------------

            panel.setLayout(new GridLayout(1,1));
            panel.add(list);

            //---------------------------------- JFrame configuration --------------------

            frame.add(panel);
            frame.setPreferredSize(new Dimension(550,600));
            frame.pack();
            frame.setLocationRelativeTo(null);
            frame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
            frame.setVisible(true);
        }).start();

    }
}

其结果是:

边框和设置背景的目标是显示内容的位置和区域(视觉)。

我不明白为什么不显示这些字段

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-05-04 15:08:13

不要扩展JScrollPane。您不会向滚动窗格添加任何功能。所有这些方法都与ListModel相关,与JScrollPane无关。

代码语言:javascript
复制
add(jList);

不要向滚动窗格添加组件。JScrollPane是一个包含JScrollBarsJViewport的复合组件。需要将JList添加到视图端口。

不要将JList添加到面板中。您需要将JScrollPane添加到面板中

这通常是用基本代码完成的,如下所示:

代码语言:javascript
复制
JScrollPane scrollPane = new JScrollPane( list );
panel.add( scrollPane );
票数 4
EN

Stack Overflow用户

发布于 2016-05-04 15:10:11

您是在EDT上创建和操作Swing对象的。您的Runnable应该由SwingUtilities.invokeLater在静态void中调用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37031376

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档