JTable不会在添加新行时更新值

时间:2015-06-22 21:12:49

标签: java swing jtable

这是我系统的屏幕,它列出了包含名称,可用性,代码的String []的ArrayLists中的可用杂志(“revistas”)和Books(“livros”)。

一切正常,但表格显示为空白。

这是我的班级,我已经裁剪了变量声明。

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

如果有人可以给出一个侧面提示,我也很困惑如何使用有效且美观的Panel布局。

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");
    }

}

}

1 个答案:

答案 0 :(得分:1)

首先,你做......

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

在将botaoRevista添加到botaoLivro之前,将panelTablepanelMainJTable中移除,将其留空。组件只能驻留在单个容器中。当您尝试将组件添加到另一个容器时,首先将其从当前容器中删除。

更好的解决方案是拥有一个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); } } } 并简单地更改模型

像...一样的东西。

static

作为一个例子......