Hello I have created a Java program in that I want to display some data in table run time.
Using below function the data displays perfectly, but I can't click on JTable data like check box or text.
Thanks.
My code is:
public void TableDataModel()
{
String[] cols = {"<html>Task<br>Name</html>", "<html>Start<br>Time</html>", "Finished"};
DefaultTableModel model = new DefaultTableModel(data, cols)
{
@Override
public Class<?> getColumnClass(int col)
{
return col == 2 ? Boolean.class : String.class;
}
@Override
public boolean isCellEditable(int row, int column)
{
return column==2 ? true : false;
}
};
JTable table = new JTable(model)
{
@Override
public boolean isCellEditable(int row, int column) {
return column==2 ? true : false;
}
};
table.setFont(new java.awt.Font("Times New Roman", 0, 14));
table.getTableHeader().setFont(new java.awt.Font("Times New Roman", 0, 14));
table.getTableHeader().enable(false);
JCheckBox jcheckBox=new JCheckBox();
TableColumnModel columnModel = table.getColumnModel();
columnModel.getColumn(2).setCellEditor(new DefaultCellEditor(jcheckBox));
jcheckBox.addChangeListener(new ChangeListener()
{
@Override
public void stateChanged(ChangeEvent e)
{
int rowCount = model.getRowCount();
for(int i=0; i<rowCount; i++)
{
Boolean selected = (Boolean)model.getValueAt(i, 2);
if(selected != null && selected)
{
System.out.println("Removed:"+i);
model.removeRow(i);
i--;
}
}
}
});
JScrollPane jScrollpane=new JScrollPane(table);
jScrollpane.setViewportView(table);
this.add(jScrollpane);
jScrollpane.setFont(new java.awt.Font("Times New Roman", 0, 14));
jScrollpane.setBounds(10, 130, 295, 190);
}
I think its a logical issue in the change listener.
jcheckBox.addChangeListener(new ChangeListener()
{
@Override
public void stateChanged(ChangeEvent e)
{
int rowCount = model.getRowCount();
for(int i=0; i<rowCount; i++)
{
Boolean selected = (Boolean)model.getValueAt(i, 2);
if(selected != null && selected)
{
System.out.println("Removed:"+i);
model.removeRow(i);
i--;
}
}
}
});
Here first you take the rowCount and iterate through it and inside you are removing row. This changes the row count. So you need to update the rowCount variable at this point. Try adding rowCount = model.getRowCount();
after i--;
Sample
import java.awt.GridLayout;
import javax.swing.DefaultCellEditor;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableColumnModel;
public class SimpleTableDemo extends JPanel {
public SimpleTableDemo() {
super(new GridLayout(1, 0));
TableDataModel();
}
public void TableDataModel() {
String[] cols = { "<html>Task<br>Name</html>",
"<html>Start<br>Time</html>", "Finished" };
Object[][] data = {
{ "Kathy", "", new Boolean(false) },
{ "John", "", new Boolean(false) },
{ "Sue", "", new Boolean(false) },
{ "Jane", "", new Boolean(false) },
{ "Joe", "", new Boolean(false) } };
DefaultTableModel model = new DefaultTableModel(data, cols) {
@Override
public Class<?> getColumnClass(int col) {
return col == 2 ? Boolean.class : String.class;
}
@Override
public boolean isCellEditable(int row, int column) {
return column == 2 ? true : false;
}
};
JTable table = new JTable(model) {
@Override
public boolean isCellEditable(int row, int column) {
return column == 2 ? true : false;
}
};
table.setFont(new java.awt.Font("Times New Roman", 0, 14));
table.getTableHeader().setFont(
new java.awt.Font("Times New Roman", 0, 14));
table.getTableHeader().enable(false);
JCheckBox jcheckBox = new JCheckBox();
TableColumnModel columnModel = table.getColumnModel();
columnModel.getColumn(2)
.setCellEditor(new DefaultCellEditor(jcheckBox));
jcheckBox.addChangeListener(new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
int rowCount = model.getRowCount();
System.out.println("*************" + rowCount);
for (int i = 0; i < rowCount; i++) {
System.out.println(i);
Boolean selected = (Boolean) model.getValueAt(i, 2);
if (selected != null && selected) {
System.out.println("Removed:" + i);
model.removeRow(i);
i--;
rowCount = model.getRowCount();
}
}
}
});
JScrollPane jScrollpane = new JScrollPane(table);
jScrollpane.setViewportView(table);
this.add(jScrollpane);
jScrollpane.setFont(new java.awt.Font("Times New Roman", 0, 14));
jScrollpane.setBounds(10, 130, 295, 190);
}
private static void createAndShowGUI() {
JFrame frame = new JFrame("SimpleTableDemo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
SimpleTableDemo newContentPane = new SimpleTableDemo();
newContentPane.setOpaque(true); // content panes must be opaque
frame.setContentPane(newContentPane);
frame.pack();
frame.setVisible(true);
}
public static void main(String[] args) {
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
}
}
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.