0

for我正在尝试创建一种方法,该方法将从一个类中存在的数组中获取数据项,然后使用循环将该信息放入 JTable 中。这就是我想出的:

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'行。但这是在按钮的动作监听器中,每次我按下按钮时,都会弹出书中的每个错误。一些建议真的很有帮助。

4

2 回答 2

3

需要注意的几点:

  • 为了在论坛上获得更好、更简洁的帮助,请同时发布您需要帮助的错误
  • 包括用于初始化和填充列表的代码。
  • 你初始化你的数组new String[100][1];。这与一维数组相同,因为第二维是 1(即 1 列),请new String[100][2];改用。
  • 分开线

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

进入

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

以便于调试。

于 2013-07-08T22:43:02.600 回答
3

有几件事情浮出水面。

  1. 您似乎已经有了一个代表您要显示的数据的对象。而不是必须在表模型之间来回转换它,您应该创建一个能够管理/保存原始对象的表模型。

  2. String[][] loginTableLogins = new String[100][1];被宣布错误有两个原因。首先,如果您的行数多于或少于 100 行会怎样?其次,您只声明了一个列,这显然不是您想要的。您已经拥有对象列表中包含的元素数量,因此您应该能够创建一个已经包含正确行数的数组

就个人而言,我会避免DefaultTableModel使用AbstractTableModel.

例如...

在此处输入图像描述

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

    }
}

查看如何使用表格了解更多详情

于 2013-07-09T00:43:54.927 回答