Java Swing |扩展AbstractTableModel并将其与JTable一起使用|几个问题
我遵循Oracle的模型来实现AbstractTableModel 我这样做是因为我的表必须包含3列,第一列必须是JCheckBox 这是我的密码:Java Swing |扩展AbstractTableModel并将其与JTable一起使用|几个问题,java,swing,jtable,abstracttablemodel,Java,Swing,Jtable,Abstracttablemodel,我遵循Oracle的模型来实现AbstractTableModel 我这样做是因为我的表必须包含3列,第一列必须是JCheckBox 这是我的密码: public class FestplattenreinigerGraphicalUserInterfaceHomePagePanelTableModel extends AbstractTableModel { private String[] columnNames = {"Auswahl",
public class FestplattenreinigerGraphicalUserInterfaceHomePagePanelTableModel extends AbstractTableModel {
private String[] columnNames = {"Auswahl",
"Dateiname",
"Pfad"};
private Object[][] data = {
{new Boolean(true), "datei.tmp",
"/home/user/tmp"}
};
public int getColumnCount() {
return columnNames.length;
}
public int getRowCount() {
return data.length;
}
public String getColumnName(int col) {
return columnNames[col];
}
public Object getValueAt(int row, int col) {
return data[row][col];
}
public Class getColumnClass(int c) {
return getValueAt(0, c).getClass();
}
public boolean isCellEditable(int row, int col) {
if (col == 0) {
return true;
} else {
return false;
}
}
public void setValueAt(Object value, int row, int col) {
data[row][col] = value;
fireTableCellUpdated(row, col);
}
}
以下是我的问题:
新JTable(FestplattenreinigerGraphicalUserInterfaceHomePagePanelTableModel)
)如何知道列名及其值?因为我的AbstractTableModel中没有构造函数?!是因为列名和数据必须按原样命名,JTable才能访问它们吗李>
我认为很容易找到解决方案,但这个表格处理对我来说并不琐碎,所以非常感谢你 首先,我认为您需要更多地了解Java,特别是继承(我指的是您的构造函数问题) 回答你的问题:
- 假设列名不变,通过
属性定义列名private final static
- 由于您的类扩展了
,因此您可以为它定义一个构造函数,在其中传递数据。请重新定义AbstractTableModel
方法,以允许模型使用您传递的数据getValueAt
- 不要执行在
中执行的操作。通常,列中的所有元素都具有相同的类,因此在列索引上执行getColumnClass
开关以获取类
- 要在其中一列中添加
,必须使用自定义JCheckBox
TableCellRenderer
所有Swing组件都带有默认的模型实现。我建议您在尝试创建自己的组件之前先了解如何使用它们。对于一个名为DefaultTableModel的JTable,请阅读API以了解动态添加/删除模型中数据行的方法。以下是一个简单的示例:
import java.awt.*;
import java.util.*;
import javax.swing.*;
import javax.swing.table.*;
public class TableBasic extends JPanel
{
public TableBasic()
{
String[] columnNames = {"Date", "String", "Integer", "Boolean"};
Object[][] data =
{
{new Date(), "A", new Double(1), Boolean.TRUE },
{new Date(), "B", new Double(2), Boolean.FALSE},
{new Date(), "C", new Double(9), Boolean.TRUE },
{new Date(), "D", new Double(4), Boolean.FALSE}
};
JTable table = new JTable(data, columnNames)
{
// Returning the Class of each column will allow different
// renderers and editors to be used based on Class
public Class getColumnClass(int column)
{
for (int row = 0; row < getRowCount(); row++)
{
Object o = getValueAt(row, column);
if (o != null)
return o.getClass();
}
return Object.class;
}
};
table.setPreferredScrollableViewportSize(table.getPreferredSize());
JScrollPane scrollPane = new JScrollPane( table );
add( scrollPane );
}
private static void createAndShowUI()
{
JFrame frame = new JFrame("TableBasic");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add( new TableBasic() );
frame.pack();
frame.setLocationRelativeTo( null );
frame.setVisible( true );
}
public static void main(String[] args)
{
EventQueue.invokeLater(new Runnable()
{
public void run()
{
createAndShowUI();
}
});
}
}
import java.awt.*;
导入java.util.*;
导入javax.swing.*;
导入javax.swing.table.*;
公共类TableBasic扩展了JPanel
{
公共表格基础()
{
String[]columnNames={“日期”、“字符串”、“整数”、“布尔值”};
对象[][]数据=
{
{new Date(),“A”,新的双精度(1),Boolean.TRUE},
{new Date(),“B”,新的双精度(2),Boolean.FALSE},
{new Date(),“C”,新的双精度(9),Boolean.TRUE},
{new Date(),“D”,新的双精度(4),Boolean.FALSE}
};
JTable table=新的JTable(数据、列名)
{
//返回每个列的类将允许不同的
//基于类使用的渲染器和编辑器
公共类getColumnClass(int列)
{
对于(int row=0;row
我从未见过一个名称如此之长的类,你不能将“FestplattenreinigerGraphicalUserInterfaceHomePagePanelTableModel”重命名为更有意义的名称吗?)类名是个笑话,不是吗?如果您继续使用这样的名称,很快您将需要一个“Festplattenreiniger”(硬盘驱动器清理器);-)谢谢你的回答,如果我能给你减一,我会这么做的。幽默感发生了什么?(是的,我只是编出来的)您不需要为自定义渲染器编写代码来显示复选框。JTable提供了一个默认的复选框渲染器和编辑器。您所需要做的就是重写getColumnClass()方法,为列返回布尔值,然后将使用适当的渲染器。