JList包装问题

问题描述 投票:3回答:1

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

只有在重新调整框架大小时才能重新包装该列表(无效,验证和重新绘制不起作用)。

    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);
java swing jlist defaultlistmodel
1个回答
4
投票

使用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属性来呈现您想要的列表。

© www.soinside.com 2019 - 2024. All rights reserved.