添加新行时 JTable 不更新值

JTable not updating values as new rows are added

这是我系统的屏幕,其中列出了包含名称、可用性、代码的 String[] 数组列表中的可用杂志 ("revistas") 和书籍 ("livros")。

一切正常,除了 table 显示空白。

这是我的 class,我裁剪了变量声明。

底部的函数 "listar" 是用数据加载 JTable 的函数。

我也对如何使用有效且美观的面板布局感到困惑,如果有人可以给出侧面提示的话。

public class TelaListaDoc extends JPanel {

public TelaListaDoc(Biblioteca biblio) {

    this.biblioteca = biblio;
    this.inicializado = false;

    setLayout(new BorderLayout());
    cLayout = new CardLayout();

    panelMain = new JPanel();
    panelTable = new JPanel(cLayout);
    panelRevista = new JPanel();
    panelLivro = new JPanel();

    String[] nomes = {"Título", "Nº disponíveis", "Código"};
    modelLivro = new DefaultTableModel(nomes, 0);
    modelRevista = new DefaultTableModel(nomes, 0);

    tableRevista = new JTable(modelLivro);
    tableLivro = new JTable(modelRevista);

    botaoVoltar = new JButton("Voltar");
    botaoRevista = new JButton("Revistas");
    botaoLivro = new JButton("Livros");
    panelRevista.add(new JScrollPane(tableRevista));
    panelLivro.add(new JScrollPane(tableLivro));

    panelTable.add(panelRevista, "Revista");
    panelTable.add(panelLivro, "Livro");
    panelTable.setVisible(true);

    panelMain.add(botaoRevista);
    panelMain.add(botaoLivro);
    panelMain.add(panelTable);
    panelMain.add(botaoVoltar);

    panelMain.setVisible(true);
    add(panelMain);

    botaoVoltar.addActionListener(new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent ae) {
            biblioteca.chamaTelaBiblioteca();
        }
    });

    botaoLivro.addActionListener(new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent ae) {
            cLayout.show(panelTable, "Livro");

        }
    });

    botaoRevista.addActionListener(new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent ae) {
            cLayout.show(panelTable, "Revista");
        }
    });
}

public void listar(ArrayList<String[]> livros, ArrayList<String[]> revistas) {
    if (!this.inicializado) {  //If not initialized, only doing it once.

        this.livros = livros;
        this.revistas = revistas;
        for (String[] livro : this.livros) {
            modelLivro.addRow(livro);
        }
        for (String[] revista : this.revistas) {
            modelRevista.addRow(revista);
        }
        this.inicializado = true;
        modelLivro.fireTableDataChanged();
        modelRevista.fireTableDataChanged();
        panelLivro.setVisible(true);
        panelRevista.setVisible(true);

        cLayout.show(panelTable, "Revista");
    }

}

}

首先,你做...

panelRevista.add(new JScrollPane(tableRevista));
panelLivro.add(new JScrollPane(tableLivro));

panelTable.add(panelRevista, "Revista");
panelTable.add(panelLivro, "Livro");

这很好,但是你这样做...

panelMain.add(botaoRevista);
panelMain.add(botaoLivro);
panelMain.add(panelTable);
panelMain.add(botaoVoltar);

panelTable 中删除 botaoRevistabotaoLivro,在将它们添加到 panelMain 之前将其留空。一个组件只能驻留在一个容器中。当您尝试将组件添加到另一个容器时,它首先会从当前容器中删除。

更好的解决方案是使用一个 JTable 并简单地更改模型

类似...

import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;

public class TelaListaDoc extends JPanel {

    private DefaultTableModel modelLivro;
    private DefaultTableModel modelRevista;
    private JTable table;

    public TelaListaDoc(Biblioteca biblio) {

        this.biblioteca = biblio;
        this.inicializado = false;

        setLayout(new BorderLayout());

        panelMain = new JPanel();

        String[] nomes = {"Título", "Nº disponíveis", "Código"};
        modelLivro = new DefaultTableModel(nomes, 0);
        modelRevista = new DefaultTableModel(nomes, 0);

        table = new JTable(modelLivro);

        botaoVoltar = new JButton("Voltar");
        botaoRevista = new JButton("Revistas");
        botaoLivro = new JButton("Livros");

        panelMain.add(new JTable(model));
        panelMain.add(panelTable);
        panelMain.add(botaoVoltar);

        add(panelMain);

        botaoVoltar.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent ae) {
                biblioteca.chamaTelaBiblioteca();
            }
        });

        botaoLivro.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent ae) {
                table.setModel(modelLivro);
            }
        });

        botaoRevista.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent ae) {
                table.setModel(modelRevista);
            }
        });
    }

    public void listar(ArrayList<String[]> livros, ArrayList<String[]> revistas) {
        if (!this.inicializado) {  //If not initialized, only doing it once.

            this.livros = livros;
            this.revistas = revistas;
            for (String[] livro : this.livros) {
                modelLivro.addRow(livro);
            }
            for (String[] revista : this.revistas) {
                modelRevista.addRow(revista);
            }
            this.inicializado = true;

            table.setModel(modelRevista);
        }

    }

}

举个例子...