这是我系统的屏幕,它列出了包含名称,可用性,代码的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");
}
}
}
答案 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
之前,将panelTable
和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);
}
}
}
并简单地更改模型
像...一样的东西。
static
作为一个例子......