使用 Java Swing 在 JTable 上获取字符串值而不是复选框?
Getting String value rather than checkbox on JTable using Java Swing?
我正在 swing 中创建一个 JTable,我已经成功地创建了一个 table,它可以滚动并添加了一些随机数据。现在我想在每一行的最后一列添加一个复选框。
现在这是我目前得到的结果:
当您查看他 table 时,您会发现我没有得到复选框,而是得到了一个包含字符串值 "false" 的列,这不是我想要的。我想要一个 selectable 框,我想允许多个选择。这是来自 class 的代码:
import java.awt.BorderLayout;
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.JScrollPane;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import javax.swing.JButton;
public class BiogramTable extends JFrame {
private JPanel contentPane;
private JTable table;
private JCheckBox checkbox;
private static final long serialVersionUID = 1L;
/**
* Create the frame.
*/
public BiogramTable() {
Object[] columns = {"Name", "Age" , "Gender" , "Boolean"};
Object[][] data = {{"John", "18", "Male", false},
{"Jessica", "19", "Female", false},
{"Dave", "52", "Male", false},
{"Jake", "30", "Male", false},
{"Jeremy", "14", "Male", false},
{"Jemma", "34", "Female", false},
{"Amy", "16", "Female", false},
{"Patrick", "18", "Male", false}};
DefaultTableModel model = new DefaultTableModel(data, columns);
final JCheckBox checkBox = new JCheckBox();
table = new JTable(model) {
private static final long serialVersionUID = 1L;
//@Override
//public Class getColumnClass(int column) {
//switch (column) {
//case 0:
// return String.class;
//case 1:
//return String.class;
//case 2:
//return Integer.class;
//case 3:
//return Double.class;
//default:
//return Boolean.class;
//}
//}
};
//table.setPreferredScrollableViewportSize(table.getPreferredSize());
JScrollPane scrollPane = new JScrollPane(table);
getContentPane().add(scrollPane);
}
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
BiogramTable frame = new BiogramTable();
frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
frame.pack();
frame.setLocation(150, 150);
frame.setVisible(true);
}
});
}
}
我对此进行了大量研究,但未能找到使用 swing 的解决方案。如果您能让我知道我的方法有什么问题并让我知道正确的方法是什么,我会很棒,因为这是我第一次使用 Windows 构建器在 Java swing 中创建 JTable .我在堆栈溢出中看到了与我类似的问题,但我的问题不同,因为我得到的是字符串而不是复选框。所以我的问题是这是为什么?
您应该根据您的数据要求覆盖 getColumnClass
方法。请参考以下更改。
import java.awt.BorderLayout;
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.JScrollPane;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import javax.swing.JButton;
class BiogramTable extends JFrame {
private JPanel contentPane;
private JTable table;
private JCheckBox checkbox;
private static final long serialVersionUID = 1L;
/**
* Create the frame.
*/
public BiogramTable() {
Object[] columns = {"Name", "Age", "Gender", "Boolean"};
Object[][] data = {{"John", "18", "Male", false},
{"Jessica", "19", "Female", false},
{"Dave", "52", "Male", false},
{"Jake", "30", "Male", false},
{"Jeremy", "14", "Male", false},
{"Jemma", "34", "Female", false},
{"Amy", "16", "Female", false},
{"Patrick", "18", "Male", false}};
DefaultTableModel model = new DefaultTableModel(data, columns);
final JCheckBox checkBox = new JCheckBox();
table = new JTable(model) {
private static final long serialVersionUID = 1L;
@Override
public Class getColumnClass(int column) {
switch (column) {
case 0:
return String.class;
case 1:
return Integer.class;
case 2:
return String.class;
case 3:
return Boolean.class;
default:
return String.class;
}
}
};
//table.setPreferredScrollableViewportSize(table.getPreferredSize());
JScrollPane scrollPane = new JScrollPane(table);
getContentPane().add(scrollPane);
}
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
BiogramTable frame = new BiogramTable();
frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
frame.pack();
frame.setLocation(150, 150);
frame.setVisible(true);
}
});
}
}
我正在 swing 中创建一个 JTable,我已经成功地创建了一个 table,它可以滚动并添加了一些随机数据。现在我想在每一行的最后一列添加一个复选框。
现在这是我目前得到的结果:
当您查看他 table 时,您会发现我没有得到复选框,而是得到了一个包含字符串值 "false" 的列,这不是我想要的。我想要一个 selectable 框,我想允许多个选择。这是来自 class 的代码:
import java.awt.BorderLayout;
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.JScrollPane;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import javax.swing.JButton;
public class BiogramTable extends JFrame {
private JPanel contentPane;
private JTable table;
private JCheckBox checkbox;
private static final long serialVersionUID = 1L;
/**
* Create the frame.
*/
public BiogramTable() {
Object[] columns = {"Name", "Age" , "Gender" , "Boolean"};
Object[][] data = {{"John", "18", "Male", false},
{"Jessica", "19", "Female", false},
{"Dave", "52", "Male", false},
{"Jake", "30", "Male", false},
{"Jeremy", "14", "Male", false},
{"Jemma", "34", "Female", false},
{"Amy", "16", "Female", false},
{"Patrick", "18", "Male", false}};
DefaultTableModel model = new DefaultTableModel(data, columns);
final JCheckBox checkBox = new JCheckBox();
table = new JTable(model) {
private static final long serialVersionUID = 1L;
//@Override
//public Class getColumnClass(int column) {
//switch (column) {
//case 0:
// return String.class;
//case 1:
//return String.class;
//case 2:
//return Integer.class;
//case 3:
//return Double.class;
//default:
//return Boolean.class;
//}
//}
};
//table.setPreferredScrollableViewportSize(table.getPreferredSize());
JScrollPane scrollPane = new JScrollPane(table);
getContentPane().add(scrollPane);
}
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
BiogramTable frame = new BiogramTable();
frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
frame.pack();
frame.setLocation(150, 150);
frame.setVisible(true);
}
});
}
}
我对此进行了大量研究,但未能找到使用 swing 的解决方案。如果您能让我知道我的方法有什么问题并让我知道正确的方法是什么,我会很棒,因为这是我第一次使用 Windows 构建器在 Java swing 中创建 JTable .我在堆栈溢出中看到了与我类似的问题,但我的问题不同,因为我得到的是字符串而不是复选框。所以我的问题是这是为什么?
您应该根据您的数据要求覆盖 getColumnClass
方法。请参考以下更改。
import java.awt.BorderLayout;
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.JScrollPane;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import javax.swing.JButton;
class BiogramTable extends JFrame {
private JPanel contentPane;
private JTable table;
private JCheckBox checkbox;
private static final long serialVersionUID = 1L;
/**
* Create the frame.
*/
public BiogramTable() {
Object[] columns = {"Name", "Age", "Gender", "Boolean"};
Object[][] data = {{"John", "18", "Male", false},
{"Jessica", "19", "Female", false},
{"Dave", "52", "Male", false},
{"Jake", "30", "Male", false},
{"Jeremy", "14", "Male", false},
{"Jemma", "34", "Female", false},
{"Amy", "16", "Female", false},
{"Patrick", "18", "Male", false}};
DefaultTableModel model = new DefaultTableModel(data, columns);
final JCheckBox checkBox = new JCheckBox();
table = new JTable(model) {
private static final long serialVersionUID = 1L;
@Override
public Class getColumnClass(int column) {
switch (column) {
case 0:
return String.class;
case 1:
return Integer.class;
case 2:
return String.class;
case 3:
return Boolean.class;
default:
return String.class;
}
}
};
//table.setPreferredScrollableViewportSize(table.getPreferredSize());
JScrollPane scrollPane = new JScrollPane(table);
getContentPane().add(scrollPane);
}
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
BiogramTable frame = new BiogramTable();
frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
frame.pack();
frame.setLocation(150, 150);
frame.setVisible(true);
}
});
}
}