JList换行问题

3

当我在运行时添加元素时,似乎不能正确更新包裹。 当框架被重新验证时,它将继续在最后一行渲染新项目(甚至保留旧的换行符),但它不会继续并换行到新一行。

仅当框架被重新调整大小时才能重新包装列表(无效,验证和重绘不起作用)。

    final JFrame frame = new JFrame();
    final Vector<String> strings = new Vector<String>();
    JList list = new JList(strings);

    list.setLayoutOrientation(JList.HORIZONTAL_WRAP);
    list.setVisibleRowCount(-1);

    strings.add(" ------------------ add ------------------");
    strings.add(" ------------------ add ------------------");

    JButton button = new JButton("add");
    button.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent arg0) {
            strings.add(" ------------------ add ------------------");
            //frame.invalidate();
            //frame.validate();
            //frame.repaint();
        }
    });

    JPanel panel = new JPanel(new BorderLayout());
    panel.add(list, BorderLayout.CENTER);
    panel.add(button,BorderLayout.SOUTH);

    frame.setSize(400,400);
    frame.add(panel);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setVisible(true);
1个回答

3

使用ListModel,例如DefaultListModel。它会触发正确的事件到JList,以便在向模型添加或删除对象时更新。

public static void main(String[] args) {

    JFrame frame = new JFrame("Test");

    final DefaultListModel model = new DefaultListModel();

    model.addElement("---added---");
    model.addElement("---added---");

    frame.add(new JList(model), BorderLayout.CENTER);
    frame.add(new JButton(new AbstractAction("Add") {

        @Override
        public void actionPerformed(ActionEvent arg0) {
            model.addElement("---added again---");
        }
    }), BorderLayout.SOUTH);

    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(200, 150);
    frame.setVisible(true);
}

针对“包装问题”,只需使用 JList(ListModel) 构造函数,它将使用 JList.VERTICAL 属性,以您想要的方式呈现列表。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接