2015-06-22 57 views
1

這是我的系統的屏幕,它列出了包含名稱,可用性,代碼的String []的ArrayLists的可用雜誌(「revistas」)和書籍(「livros」)。當新行被添加時,JTable不更新值

一切工作正常,除了表顯示空白。

這是我的課,我裁剪了變量聲明。

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

} 

} 
+0

爲了更好地幫助越早,後期一個[MCVE](http://stackoverflow.com/help/mcve)(最小完整可驗證示例)或[SSCCE](http://www.sscce.org/)(簡短的,獨立的,正確的示例)。 –

+0

你在構造函數 – Jegg

+0

*中說得太多了,「如果有人可以給出一個側面提示,如何使用有效和美觀的面板佈局。」*你對「好看的面板」是什麼樣子有所瞭解? – MadProgrammer

回答

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

從而消除來自panelTablebotaoRevistabotaoLivro留下空白,在它們被添加到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); 
     } 

    } 

} 

舉個例子...