【问题标题】:DefaultListModel in JList in JScrollPane, can't see the JListJScrollPane中JList中的DefaultListModel,看不到JList
【发布时间】:2016-05-04 14:56:29
【问题描述】:

我正在尝试使用 JScrollPane 中的 DefaultListModel 处理通用 JList。但是,我看不到 JList。

这是课程:

字段滚动列表:

    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。

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();

    }
}

结果是这样的:

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

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

【问题讨论】:

  • 你真的需要扩展JScrollPane吗?
  • 我开始使用 JPanel,但我只需要能够将它用作组件。什么应该是最好的?
  • revalidate(); repaint(); 添加jList后试试这个
  • @PierreAntoineGuillaume :我只需创建一个列表实例,然后添加一个 new JScrollPane(list); 。事实上,add 方法不会在 JScrollPane 中得到预期的结果,滚动窗格适用于 视口视图docs.oracle.com/javase/tutorial/uiswing/components/…
  • “什么应该是最好的?”JScrollPane。但是没有必要仅仅为了使用一个实例而扩展该组件。很确定这是 @Berger 质疑的扩展部分。

标签: java swing jscrollpane jlist defaultlistmodel


【解决方案1】:

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

add(jList);

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

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

通常这是使用基本代码完成的,例如:

JScrollPane scrollPane = new JScrollPane( list );
panel.add( scrollPane );

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 我看到类似的东西后写了线程的东西,但我仍然不明白为什么。请问你有文件吗?
    • 您的线程代码错误。代码未在事件调度线程 (EDT) 上执行。阅读 Concurrency 上的 Swing 教程中的部分以获取更多信息。请注意,本教程还有一个关于How to Use Lists 的部分,其中有一个您可以使用的工作示例。保持 Swing 教程的链接方便所有 Swing 基础知识。
    • 长话短说 Swing 利用一个线程上的所有图形更新来合并图形管道中的更改。您的代码可能会侥幸成功,但从技术上讲,在 EDT 以外的任何地方创建 JComponents 是错误的,并且被认为是不好的做法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-03
    • 2012-11-17
    • 2012-12-06
    • 1970-01-01
    • 2013-08-08
    • 1970-01-01
    相关资源
    最近更新 更多