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

いくつかのものが飛び出します。

  1. 表示するデータを表すオブジェクトが既にあるようです。テーブル モデル間で前後に変換するのではなく、元のオブジェクトを管理/保持できるテーブル モデルを作成する必要があります。

  2. String[][] loginTableLogins = new String[100][1];は 2 つの理由で間違っていると宣言されています。まず、行数が 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 に答える
3

注意すべき点がいくつかあります。

  • フォーラムでより適切で簡潔なヘルプを得るには、ヘルプが必要なエラーも投稿してください
  • リストの初期化と作成のためのコードを含めます。
  • で配列を初期化しますnew String[100][1];。2 番目の次元が 1 (つまり 1 列) であるため、これは 1D 配列と同じ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 に答える