简体   繁体   中英

Table doesn't work properly in JAVA

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM