添加新行时 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
中删除 botaoRevista
和 botaoLivro
,在将它们添加到 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);
}
}
}
举个例子...
这是我系统的屏幕,其中列出了包含名称、可用性、代码的 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
中删除 botaoRevista
和 botaoLivro
,在将它们添加到 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);
}
}
}
举个例子...