2013-07-08 58 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更多细节