2013-07-08 3 views
0

Я пытаюсь создать метод, который будет получать элементы данных из массива, присутствующие в одном классе, а затем помещать эту информацию в 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». Но это в действии lisener кнопки, и каждый раз, когда я нажимаю кнопку, я получаю каждую ошибку в книге, выскакивающей вверх. Некоторые советы действительно помогут.

+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 для более подробной информации

Смежные вопросы