いくつかのものが飛び出します。
表示するデータを表すオブジェクトが既にあるようです。テーブル モデル間で前後に変換するのではなく、元のオブジェクトを管理/保持できるテーブル モデルを作成する必要があります。
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;
}
}
}
詳細については、テーブルの使用方法を確認してください