在Swing中向模型添加元素后,JList不会更新

时间:2017-10-27 17:58:03

标签: java swing jlist

我在Swing中更新JList小部件时遇到了麻烦。

我正在创建一个模型,向其添加元素,然后将其设置为JList元素的模型。一切正常,它显示正确。

问题是我想在模型中添加元素。它没有做任何事情。

在从Observer模式更新后,我正在动态添加元素。

我做错了什么?

以下是用户界面的代码。

// all the imports

    public class View extends JPanel implements Observer{
        private vivo vivox;
        private Label label = new Label("Hola Mundo");
        private DefaultListModel modelo = new DefaultListModel();
        private JList nameList = new JList(modelo);


        public View() {
            super();
            nameList.setFont(new Font("Arial",Font.BOLD,40));
            this.setLayout(new GridLayout());
            JButton button = new JButton("New Time");
            JButton button1 = new JButton("New Time2");
            label.setFont(new Font("Serif", Font.PLAIN, 50));
            JPanel group = new JPanel( new GridLayout());
            group.add(button);
            group.add(button1);

            JPanel east = new JPanel( new BorderLayout() );
            east.add(label, BorderLayout.NORTH);
            east.add(nameList, BorderLayout.CENTER);
            east.add(group, BorderLayout.SOUTH);

            add(east, BorderLayout.EAST);
            vivox = new vivo();
            vivox.addObserver(this);
            this.setListElements();
        }

        public void setListElements() {
            this.modelo.addElement("Messi");
            this.modelo.addElement("CR7");
            this.modelo.addElement("Iniesta");
        }

        @Override
        public void update(Observable o, Object arg) {
            this.label.setText("Some changes");
            this.modelo.addElement("Maradona");
        }


    }

1 个答案:

答案 0 :(得分:0)

问题必须是布局(你没有看到实际发生的变化),或者是在这个问题上的其他地方。这是一个可以向您展示的工作示例,当向列表中添加新元素时可能不可见(由于元素大小限制或实际大小)。

public static void main(String[] args) {
    JFrame frame = new JFrame();
    frame.setLayout(new FlowLayout());
    DefaultListModel<String> model = new DefaultListModel<>();
    for (int i = 0; i < 5; i++) {
        model.addElement(String.valueOf(Math.random()));
    }
    JList list = new JList(model);
    JButton button = new JButton("Click me!");
    button.addActionListener(e -> model.addElement(String.valueOf(Math.random())));

    frame.add(list);
    frame.add(button);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(400,200);
    frame.setLocationRelativeTo(null);
    frame.setVisible(true);
} 

就这么简单。请注意,当您添加几个元素时,您将看不到更改,因为它们超出了框架,您必须调整它的大小。我认为类似的问题可能出在你的情况下,或者根本没有调用更新代码。

PS:这是Java 8示例(使用lambda - 在版本&lt; 8 environements中使用匿名ActionListener扩展类)