无法在 JTable 中创建带有复选框的列
Can't create column with checkboxes in JTable
我有 JTable,我用 SQL 数据填充它,这是我的方法:
private void updateTable() {
try {
String sql = "SELECT number as Numver, name as Available, type FROM available_t ORDER BY number asc";
pst = conn.prepareStatement(sql);
rs = pst.executeQuery();
tableAvail.setModel(DbUtils.resultSetToTableModel(rs));
} catch (Exception e) {
JOptionPane.showMessageDialog(null, e);
} finally {
try {
rs.close();
pst.close();
} catch (Exception e) {
}
}
}
到目前为止一切顺利。数据显示正确。但是,我想再多放一列复选框。当我尝试在 Eclipse 中使用向导手动创建时(按钮 'model'),我无法添加新列,可能是因为 table 和列是通过方法创建的。所以,我如何添加新列,将有复选框。然后在我 select 一些复选框之后 - 当我按下 OK 按钮时,检查哪些复选框被选中并在 TYPE 列中用 YES 或 NO 在 db 中更新它。
编辑:***
这是我的代码,我只想将结果 true/false 转换为列中的复选框:
private JPanel contentPane;
private final JPanel panel = new JPanel();
private final JScrollPane scrollPane = new JScrollPane();
private final JTable table = new JTable();
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
TableExample frame = new TableExample();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* Create the frame.
*/
public TableExample() {
initGUI();
}
private void initGUI() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 450, 300);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
contentPane.setLayout(null);
panel.setBounds(31, 11, 238, 209);
contentPane.add(panel);
panel.setLayout(null);
scrollPane.setBounds(10, 11, 218, 187);
panel.add(scrollPane);
table.setModel(new DefaultTableModel(
new Object[][] {
{"1", "Test1", "20", "false"},
{"2", "Test2", "10", "false"},
{"3", "Test3", "20", "true"},
},
new String[] {
"Id", "Test", "Rate", "T/F"
}
));
scrollPane.setViewportView(table);
}
您需要将 getColumnClass(...)
方法覆盖到 return 列中数据的 class,以便 table 可以使用正确的 renderer/editor .
类似于:
JTable table = new JTable( model )
{
@Override
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;
}
};
谢谢大家。这是我创造的完美作品
public void updateTable() throws ClassNotFoundException, SQLException {
String sql = "select * from instruments_sales_t where sold = 'YES'";
conn = ConnectionToDb.connectDb();
stmt = conn.createStatement();
rs = stmt.executeQuery(sql);
DefaultTableModel model = new DefaultTableModel() {
public Class<?> getColumnClass(int column) {
switch (column) {
case 0: return String.class;
case 1: return String.class;
case 2: return String.class;
case 3: return String.class;
case 4: return String.class;
case 5: return String.class;
case 6: return String.class;
case 7: return Boolean.class;
default:return String.class;
}
}
};
tablePaidSales.setModel(model);
model.addColumn("id");
model.addColumn("Name");
model.addColumn("Size");
model.addColumn("Avail");
model.addColumn("Total");
model.addColumn("Cl");
model.addColumn("Date");
model.addColumn("");
int i = 0;
while (rs.next()) {
model.addRow(new Object[0]);
model.setValueAt(rs.getString("id"), i, 0);
model.setValueAt(rs.getString("name"), i, 1);
model.setValueAt(rs.getString("size"), i, 2);
model.setValueAt(rs.getString("want_items"), i, 3);
model.setValueAt((rs.getDouble("want_price"))*(rs.getDouble("want_items")), i, 4);
model.setValueAt(rs.getString("client"), i, 5);
model.setValueAt(rs.getString("date_of_sell"), i, 6);
model.setValueAt(false, i, 7);
i++;
}
DefaultTableCellRenderer rightRenderer = new DefaultTableCellRenderer();
rightRenderer.setHorizontalAlignment(JLabel.RIGHT);
rightRenderer.setForeground(Color.BLUE);
DefaultTableCellRenderer redRenderer = new DefaultTableCellRenderer();
redRenderer.setHorizontalAlignment(JLabel.RIGHT);
redRenderer.setForeground(Color.RED);
tablePaidSales.setShowGrid(true);
tablePaidSales.setGridColor(Color.LIGHT_GRAY);
tablePaidSales.setShowHorizontalLines(false);
tablePaidSales.getColumnModel().getColumn(0).setPreferredWidth(28);
tablePaidSales.getColumnModel().getColumn(1).setPreferredWidth(230);
tablePaidSales.getColumnModel().getColumn(2).setPreferredWidth(140);
tablePaidSales.getColumnModel().getColumn(3).setPreferredWidth(57);
tablePaidSales.getColumnModel().getColumn(4).setPreferredWidth(70);
tablePaidSales.getColumnModel().getColumn(5).setPreferredWidth(120);
tablePaidSales.getColumnModel().getColumn(6).setPreferredWidth(82);
tablePaidSales.getColumnModel().getColumn(7).setPreferredWidth(25);
tablePaidSales.getColumnModel().getColumn(3).setCellRenderer(rightRenderer);
tablePaidSales.getColumnModel().getColumn(4).setCellRenderer(redRenderer);
}
我有 JTable,我用 SQL 数据填充它,这是我的方法:
private void updateTable() {
try {
String sql = "SELECT number as Numver, name as Available, type FROM available_t ORDER BY number asc";
pst = conn.prepareStatement(sql);
rs = pst.executeQuery();
tableAvail.setModel(DbUtils.resultSetToTableModel(rs));
} catch (Exception e) {
JOptionPane.showMessageDialog(null, e);
} finally {
try {
rs.close();
pst.close();
} catch (Exception e) {
}
}
}
到目前为止一切顺利。数据显示正确。但是,我想再多放一列复选框。当我尝试在 Eclipse 中使用向导手动创建时(按钮 'model'),我无法添加新列,可能是因为 table 和列是通过方法创建的。所以,我如何添加新列,将有复选框。然后在我 select 一些复选框之后 - 当我按下 OK 按钮时,检查哪些复选框被选中并在 TYPE 列中用 YES 或 NO 在 db 中更新它。
编辑:*** 这是我的代码,我只想将结果 true/false 转换为列中的复选框:
private JPanel contentPane;
private final JPanel panel = new JPanel();
private final JScrollPane scrollPane = new JScrollPane();
private final JTable table = new JTable();
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
TableExample frame = new TableExample();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* Create the frame.
*/
public TableExample() {
initGUI();
}
private void initGUI() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 450, 300);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
contentPane.setLayout(null);
panel.setBounds(31, 11, 238, 209);
contentPane.add(panel);
panel.setLayout(null);
scrollPane.setBounds(10, 11, 218, 187);
panel.add(scrollPane);
table.setModel(new DefaultTableModel(
new Object[][] {
{"1", "Test1", "20", "false"},
{"2", "Test2", "10", "false"},
{"3", "Test3", "20", "true"},
},
new String[] {
"Id", "Test", "Rate", "T/F"
}
));
scrollPane.setViewportView(table);
}
您需要将 getColumnClass(...)
方法覆盖到 return 列中数据的 class,以便 table 可以使用正确的 renderer/editor .
类似于:
JTable table = new JTable( model )
{
@Override
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;
}
};
谢谢大家。这是我创造的完美作品
public void updateTable() throws ClassNotFoundException, SQLException {
String sql = "select * from instruments_sales_t where sold = 'YES'";
conn = ConnectionToDb.connectDb();
stmt = conn.createStatement();
rs = stmt.executeQuery(sql);
DefaultTableModel model = new DefaultTableModel() {
public Class<?> getColumnClass(int column) {
switch (column) {
case 0: return String.class;
case 1: return String.class;
case 2: return String.class;
case 3: return String.class;
case 4: return String.class;
case 5: return String.class;
case 6: return String.class;
case 7: return Boolean.class;
default:return String.class;
}
}
};
tablePaidSales.setModel(model);
model.addColumn("id");
model.addColumn("Name");
model.addColumn("Size");
model.addColumn("Avail");
model.addColumn("Total");
model.addColumn("Cl");
model.addColumn("Date");
model.addColumn("");
int i = 0;
while (rs.next()) {
model.addRow(new Object[0]);
model.setValueAt(rs.getString("id"), i, 0);
model.setValueAt(rs.getString("name"), i, 1);
model.setValueAt(rs.getString("size"), i, 2);
model.setValueAt(rs.getString("want_items"), i, 3);
model.setValueAt((rs.getDouble("want_price"))*(rs.getDouble("want_items")), i, 4);
model.setValueAt(rs.getString("client"), i, 5);
model.setValueAt(rs.getString("date_of_sell"), i, 6);
model.setValueAt(false, i, 7);
i++;
}
DefaultTableCellRenderer rightRenderer = new DefaultTableCellRenderer();
rightRenderer.setHorizontalAlignment(JLabel.RIGHT);
rightRenderer.setForeground(Color.BLUE);
DefaultTableCellRenderer redRenderer = new DefaultTableCellRenderer();
redRenderer.setHorizontalAlignment(JLabel.RIGHT);
redRenderer.setForeground(Color.RED);
tablePaidSales.setShowGrid(true);
tablePaidSales.setGridColor(Color.LIGHT_GRAY);
tablePaidSales.setShowHorizontalLines(false);
tablePaidSales.getColumnModel().getColumn(0).setPreferredWidth(28);
tablePaidSales.getColumnModel().getColumn(1).setPreferredWidth(230);
tablePaidSales.getColumnModel().getColumn(2).setPreferredWidth(140);
tablePaidSales.getColumnModel().getColumn(3).setPreferredWidth(57);
tablePaidSales.getColumnModel().getColumn(4).setPreferredWidth(70);
tablePaidSales.getColumnModel().getColumn(5).setPreferredWidth(120);
tablePaidSales.getColumnModel().getColumn(6).setPreferredWidth(82);
tablePaidSales.getColumnModel().getColumn(7).setPreferredWidth(25);
tablePaidSales.getColumnModel().getColumn(3).setCellRenderer(rightRenderer);
tablePaidSales.getColumnModel().getColumn(4).setCellRenderer(redRenderer);
}