JCheckBox
但是当我使用system.out.print时它仍然将其值显示为false。如果焦点丢失但仍然检查JCheckBox
,则返回true。
即当我选中2复选框时,结果显示的是第一个复选框。未显示第二个复选框的状态。完成编程如下所示:请运行编程并纠正我的错误。欢迎任何帮助。
public class check extends JFrame {
public check() {
setBounds(00, 40, 400, 400);
Color c = new Color(160, 200, 100);
getContentPane().setBackground(c);
Color c3 = new Color(0, 50, 50, 2);
setTitle("MARKING OF TARGET HABITATION");
setUndecorated(true);
getRootPane().setWindowDecorationStyle(JRootPane.PLAIN_DIALOG);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
String[] columnNames = {"Country", "Capital", "Population in Millions",
"Democracy"};
Object[][] data = {
{"USA", "Washington DC", 280, new Boolean(false)},
{"Canada", "Ottawa", 32, new Boolean(false)},
{"United Kingdom", "London", 60, new Boolean(false)},
{"Germany", "Berlin", 83, new Boolean(false)},
{"France", "Paris", 60, new Boolean(false)},
{"Norway", "Oslo", 4.5, new Boolean(false)},
{"India", "New Deli", 1046, new Boolean(false)}
};
final JTable table = new JTable(data, columnNames) {
public boolean isCellEditable(int rowIndex, int colIndex) {
return (colIndex == 3);//Disallow the editing of any cell
}
};
table.getColumnModel().getColumn(3).setCellEditor(new CheckBoxCellEditor());
table.getColumnModel().getColumn(3).setCellRenderer(new CWCheckBoxRenderer());
JScrollPane scrollPane = new JScrollPane(table);
JButton button = new JButton("check");
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
boolean[] rsel = new boolean[table.getRowCount()];
for (int i = 0; i < table.getRowCount(); i++) {
rsel[i] = (boolean) table.getValueAt(i, 3);
if (rsel[i]) {
System.out.println("checkbox selected at row"
+ " " + i + "is" + rsel[i]);
for (int col = 0; col <= 3; col++) {
table.getValueAt(i, col);
System.out.println("data at row" + " "
+ i + "is" + table.getValueAt(i, col));
}
}
}
}
});
JPanel buttonpanel = new JPanel();
buttonpanel.add(button);
add(scrollPane, BorderLayout.CENTER);
add(buttonpanel, BorderLayout.SOUTH);
Color c1 = new Color(160, 200, 100);
table.setBackground(c1);
buttonpanel.setBackground(c1);
setBackground(c1);
setVisible(true);
}
public static void main(String args[]) {
new check();
}
class CheckBoxCellEditor extends AbstractCellEditor implements TableCellEditor {
private static final long serialVersionUID = 1L;
protected JCheckBox checkBox;
public CheckBoxCellEditor() {
checkBox = new JCheckBox();
checkBox.setHorizontalAlignment(SwingConstants.CENTER);
// checkBox.setBackground( Color.white);
}
public Component getTableCellEditorComponent(
JTable table,
Object value,
boolean isSelected,
int row,
int column) {
checkBox.setSelected(((Boolean) value).booleanValue());
return checkBox;
}
public Object getCellEditorValue() {
return Boolean.valueOf(checkBox.isSelected());
}
}
class CWCheckBoxRenderer extends JCheckBox implements TableCellRenderer {
private static final long serialVersionUID = 1L;
Border border = new EmptyBorder(1, 2, 1, 2);
public CWCheckBoxRenderer() {
super();
setOpaque(true);
setHorizontalAlignment(SwingConstants.CENTER);
}
public Component getTableCellRendererComponent(
JTable table,
Object value,
boolean isSelected,
boolean hasFocus,
int row,
int column) {
if (value instanceof Boolean) {
setSelected(((Boolean) value).booleanValue());
//setEnabled(table.isCellEditable(row, column));
setForeground(table.getForeground());
setBackground(table.getBackground());
}
return this;
}
}
}
答案 0 :(得分:5)
可能最好覆盖模型中的getColumnClass以返回Boolean。默认渲染器/编辑器处理大小写,您可以看到/使用复选框。
答案 1 :(得分:4)
作为参考,这个sscce说明了@StanislavL的观点。请注意,Java 5中引入的autoboxing导致第三列的类型为Boolean
。在运行时,被覆盖的getColumnClass()
将为索引Boolean.class
返回CHECK_COL
。最后,应在event dispatch thread上构建Swing GUI对象。
import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
public class Check extends JFrame {
private static final int CHECK_COL = 3;
public Check() {
setTitle("MARKING OF TARGET HABITATION");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
String[] columnNames = {
"Country", "Capital", "Population in Millions", "Democracy"};
Object[][] data = {
{"USA", "Washington DC", 280, true},
{"Canada", "Ottawa", 32, false},
{"United Kingdom", "London", 60, false},
{"Germany", "Berlin", 83, false},
{"France", "Paris", 60, false},
{"Norway", "Oslo", 4.5, false},
{"India", "New Deli", 1046, false}
};
DefaultTableModel dtm = new DefaultTableModel(data, columnNames) {
@Override
public Class getColumnClass(int col) {
return getValueAt(0, col).getClass();
}
@Override
public boolean isCellEditable(int rowIndex, int colIndex) {
return (colIndex == CHECK_COL);
}
};
final JTable table = new JTable(dtm);
JScrollPane scrollPane = new JScrollPane(table);
JButton button = new JButton("check");
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
for (int row = 0; row < table.getRowCount(); row++) {
Boolean b = ((Boolean) table.getValueAt(row, CHECK_COL));
if (b.booleanValue()) {
System.out.print("row " + row + " is " + b + ": ");
for (int col = 0; col < table.getColumnCount(); col++) {
System.out.print(table.getValueAt(row, col) + " ");
}
System.out.println();
}
}
}
});
JPanel buttonpanel = new JPanel();
buttonpanel.add(button);
add(scrollPane, BorderLayout.CENTER);
add(buttonpanel, BorderLayout.SOUTH);
pack();
setLocationByPlatform(true);
setVisible(true);
}
public static void main(String args[]) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
new Check();
}
});
}
}