2013-07-08 92 views
0

我試圖做一個方法,將從一個類中存在的數組中獲取數據項,然後使用for循環將該信息放入一個JTable中。這是我想出來的:如何使用for循環創建表數組?

public void createLoginsTable() 
{ 
    String[] loginTableTitles = { "Username", "Password" }; //Creating arrays for my Table 
    String[][] loginTableLogins = new String[100][1]; 

    for(int i=0;list.nextLogin>i;i++) 
    { 
     loginTableLogins[i][0] = list.listOfLogins[i].username; 

     loginTableLogins[i][1] = list.listOfLogins[i].password; 
    } 

    loginsScrollPane = new JScrollPane(loginsTable = new JTable(loginTableLogins, loginTableTitles)); 

    loginsScrollPane.setBounds(400, 300, 200, 400); 
    testPanel.add(loginsScrollPane); 
} 

我爲表的列標題正常的數組,然後我試圖使用這些for循環放於用戶名和密碼存在於常規數組出現在另一個類中。我對java很陌生,所以我認爲loginTableLogins[i][0]意味着它會把細節放到第一列和'i'行。但是,這是一個按鈕的動作,每次按下按鈕,我都會彈出書中的每一個錯誤。一些建議會真的有幫助。

+1

什麼是'list'?我沒有看到它在代碼中被聲明。 – fvrghl

回答

3

有幾件事情需要注意:

  • 在論壇上更好,更簡潔的幫助,請你想獲得幫助的錯誤也
  • 包括您爲您的列表的初始化和人口代碼。
  • 你用new String[100][1];初始化你的數組。這與1D陣列相同,因爲第二維爲1(即1列),請改爲使用new String[100][2];
  • 分離各線

loginsScrollPane = new JScrollPane(loginsTable = new JTable(loginTableLogins, loginTableTitles));

loginsTable = new JTable(loginTableLogins, loginTableTitles) 
loginsScrollPane = new JScrollPane(loginsTable); 

更容易調試。

+0

幫助已得到很大的讚賞我已設法做出一些調整與您的幫助,謝謝:) – Billodie3000

3

彈出一些東西。

  1. 您似乎已經有一個對象來表示您要顯示的數據。而不必在表格模型之間來回轉換,您應該創建一個能夠管理/保持原始對象的表格模型。

  2. String[][] loginTableLogins = new String[100][1];由於兩個原因被宣佈爲錯誤。首先,如果您的行數多於或少於100行,會發生什麼情況?其次,你只宣佈了一個列,顯然這不是你想要的。您已經包含在對象列表中元素的個數,所以你應該能夠創建已經包含正確的行數

個人的數組,我會避免DefaultTableModel,由當你重寫和實現所有你需要的功能時,如果你已經開始使用AbstractTableModel,你已經完成了相同的工作量。

例如...

enter image description here

import java.awt.BorderLayout; 
import java.awt.Component; 
import java.awt.EventQueue; 
import java.util.ArrayList; 
import java.util.Arrays; 
import java.util.List; 
import javax.swing.JFrame; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 
import javax.swing.table.AbstractTableModel; 
import javax.swing.table.DefaultTableCellRenderer; 

public class SimpleTable { 

    public static void main(String[] args) { 
     new SimpleTable(); 
    } 

    public SimpleTable() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
       } 

       LoginTableModel model = new LoginTableModel(); 
       model.add(new Login("Elma Thud", "Shh, I'm hunting rabbits".toCharArray())); 

       JTable table = new JTable(model); 
       table.getColumnModel().getColumn(1).setCellRenderer(new PasswordCellRenderer()); 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setLayout(new BorderLayout()); 
       frame.add(new JScrollPane(table)); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class PasswordCellRenderer extends DefaultTableCellRenderer { 

     @Override 
     public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { 
      if (value instanceof char[]) { 
       char[] pass = (char[]) value; 
       StringBuilder sb = new StringBuilder(pass.length); 
       while (sb.length() < pass.length) { 
        sb.append("*");          
       } 
       value = sb.toString(); 
      } 
      super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); 
      return this; 
     } 

    } 

    public class Login { 

     private String userName; 
     private char[] password; 

     public Login(String userName, char[] password) { 
      this.userName = userName; 
      this.password = password; 
     } 

     public String getUserName() { 
      return userName; 
     } 

     public char[] getPassword() { 
      return password; 
     } 

    } 

    public class LoginTableModel extends AbstractTableModel { 

     private List<Login> logins; 

     public LoginTableModel() { 
      logins = new ArrayList<>(25); 
     } 

     public void add(Login... login) { 
      int startAt = getRowCount(); 
      logins.addAll(Arrays.asList(login)); 
      int endAt = getRowCount(); 

      fireTableRowsInserted(startAt, endAt - 1); 
     } 

     @Override 
     public int getRowCount() { 
      return logins.size(); 
     } 

     @Override 
     public String getColumnName(int column) { 
      return column == 0 ? "Username" : "Password"; 
     } 

     @Override 
     public int getColumnCount() { 
      return 2; 
     } 

     @Override 
     public Object getValueAt(int rowIndex, int columnIndex) { 
      Login login = logins.get(rowIndex); 
      Object value = null; 
      switch (columnIndex) { 
       case 0: 
        value = login.getUserName(); 
        break; 
       case 1: 
        value = login.getPassword(); 
        break; 
      } 
      return value; 
     } 

    } 
} 

退房How to use tables更多細節