【问题标题】:JTable not updating values as new rows are addedJTable 在添加新行时不更新值
【发布时间】:2015-06-23 08:33:25
【问题描述】:

这是我系统的屏幕,其中列出了 String[] 的 ArrayLists 中可用的 Magazines("revistas") 和 Books("livros"),其中包含 Name、Availability、Code。

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

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

底部的函数“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");
    }

}

}

【问题讨论】:

  • 为了尽快获得更好的帮助,请发布MCVE(最小完整可验证示例)或SSCCE(简短、自包含、正确示例)。
  • 你在构造函数中放了太多
  • “如何使用有效且美观的面板布局,如果有人可以提供侧面提示的话。” 你知道什么是“好看的面板”吗? “看起来像?
  • 不要使用两个表,而是使用一个表并切换模型,这将允许您取消 CardLayout
  • 您遇到的问题是,您将 botaoRevista 和 botaoLivro 添加到 panelMain,这意味着它们不再驻留在 panelTable 中。一个组件只能有一个父容器,当你将一个组件添加到一个新的父容器时,它首先会从当前容器中移除

标签: java swing jtable


【解决方案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);

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

    }

}

举个例子……

【讨论】:

    猜你喜欢
    • 2012-04-09
    • 2014-09-04
    • 2013-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-21
    • 1970-01-01
    相关资源
    最近更新 更多