有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

JTable中列内的java Jcheckbox

我想创建一个表,在该表中,每次添加新行时,也会在特定列中添加一个新复选框。我已经完成了我的研究,但我仍然找不到正确的答案,有时我发现很难理解其中的一些说明 这就是我的问题:

我在表格的列(“e”)中添加了一个复选框,但没有显示。该复选框仅在我单击时显示

package app.ui;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JLabel;
import java.awt.Font;
import java.awt.event.KeyEvent;
import java.util.List;

import javax.swing.JTable;
import javax.swing.JScrollPane;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellEditor;
import javax.swing.table.TableColumn;
import javax.swing.DefaultCellEditor;
import javax.swing.JTextField;
import javax.swing.JCheckBox;
import javax.swing.SwingConstants;

import app.dao.item.impl.ReadItemFromDB;
import app.model.Item;

public class Inventory {

private JFrame inventoryframe;
private JTable table;
private JTextField textField;
private JCheckBox checkbox;
/**
 * Launch the application.
 */
public  void InventoryWindow() {
    EventQueue.invokeLater(new Runnable() {
        public void run() {
            try {
                Inventory window = new Inventory();
                window.inventoryframe.setVisible(true);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
}

/**
 * Create the application.
 */
public Inventory() {
    initialize();

}

/**
 * Initialize the contents of the frame.
 */
private void initialize() {
    inventoryframe = new JFrame();
    inventoryframe.setExtendedState(JFrame.MAXIMIZED_BOTH);
    inventoryframe.getContentPane().setBackground(new Color(153, 204, 102));
    inventoryframe.getContentPane().setForeground(new Color(255, 255, 255));
    inventoryframe.getContentPane().setPreferredSize(new Dimension(1365, 747));
    inventoryframe.pack();
    inventoryframe.getContentPane().setLayout(null);

    JLabel lblInventory = new JLabel("Inventory Management");
    lblInventory.setBounds(56, 32, 234, 27);
    lblInventory.setFont(new Font("Tahoma", Font.PLAIN, 22));
    inventoryframe.getContentPane().add(lblInventory);

    JScrollPane scrollPane = new JScrollPane();
    scrollPane.setBounds(56, 130, 479, 249);
    inventoryframe.getContentPane().add(scrollPane);

    table = new JTable();
    table.setShowVerticalLines(false);
    table.setShowHorizontalLines(false);
    table.setShowGrid(false);
    table.setFillsViewportHeight(true);
    table.setModel(new DefaultTableModel(
            new Object[][] {
            },
            new String[] {
                    "t", "e"
            }
            ));
    scrollPane.setViewportView(table);


    checkbox = new JCheckBox("borrow");
    checkbox.setHorizontalAlignment(SwingConstants.CENTER);
    checkbox.setBounds(360, 63, 97, 23);

    TableColumn sportColumn = table.getColumnModel().getColumn(1);
    sportColumn.setCellEditor(new DefaultCellEditor(checkbox));


    doIt();
}

public void doIt(){
    DefaultTableModel dtm = (DefaultTableModel) table.getModel();
    dtm.getDataVector().removeAllElements();
    dtm.getColumnClass(0);
    ReadItemFromDB myReader = new ReadItemFromDB();
    List<Item> newItemList = myReader.showItems();
    @Override
     public Class getColumnClass() {
            return getValueAt(0, 1).getClass();
        }
    for (Item myNewItems : newItemList) {
        Object[] rowData = new Object[1];


        rowData[0] =myNewItems.getItemID();



        dtm.addRow(rowData);
    }

    table.updateUI();


}



/*public Boolean getColumnClass(){
    dtm.getValueAt(0, 1).getClass();
    return null;

}*/

}


共 (1) 个答案

  1. # 1 楼答案

    "Im sorry , please elaborate more?? Can u show an example?"

    不需要自定义渲染器或编辑器。只需@Override在表的模型中getColumnClass()使用DefaultTableModel并对该列使用Boolean类型

    下面是一个运行示例,这里是重要的部分

        DefaultTableModel model = new DefaultTableModel(data, cols) {
            @Override
            public Class getColumnClass(int column) {
                return getValueAt(0, column).getClass();
            }
        };
        JTable table = new JTable(model);
    

    这是完整的代码

    import javax.swing.JOptionPane;
    import javax.swing.JScrollPane;
    import javax.swing.JTable;
    import javax.swing.table.DefaultTableModel;
    
    public class TestTableCheck {
    
        private static JTable createTable() {
            Object[][] data = {{true, true, true}, {false, false, false}};
            String[] cols = {"Bibitty", "Boppity", "Boo"};
    
            DefaultTableModel model = new DefaultTableModel(data, cols) {
                @Override
                public Class getColumnClass(int column) {
                    return getValueAt(0, column).getClass();
                }
            };
            JTable table = new JTable(model);
    
            return table;
        }
    
        public static void main(String[] args) {
            JOptionPane.showMessageDialog(null,
                    new JScrollPane(createTable()),
                    "Table",
                    JOptionPane.PLAIN_MESSAGE);
        }
    }
    

    enter image description here


    更新

    这是你的密码。查看initialize()方法,我在其中注释了您的一些代码,并在下面添加了我的代码。我还去掉了doit()方法。此外,还应该pack()作为方法的结尾,并且setVisible()。我还添加了一个main方法,因此它是可运行的

    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.EventQueue;
    
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import java.awt.Font;
    
    import javax.swing.JTable;
    import javax.swing.JScrollPane;
    import javax.swing.table.DefaultTableModel;
    import javax.swing.table.TableColumn;
    import javax.swing.DefaultCellEditor;
    import javax.swing.JTextField;
    import javax.swing.JCheckBox;
    import javax.swing.SwingConstants;
    
    import javax.swing.SwingUtilities;
    
    public class Inventory {
    
        private JFrame inventoryframe;
        private JTable table;
        private JTextField textField;
        private JCheckBox checkbox;
    
        /**
         * Launch the application.
         */
        public void InventoryWindow() {
            EventQueue.invokeLater(new Runnable() {
                public void run() {
                    try {
                        Inventory window = new Inventory();
                        window.inventoryframe.setVisible(true);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            });
        }
    
        /**
         * Create the application.
         */
        public Inventory() {
            initialize();
    
        }
    
        /**
         * Initialize the contents of the frame.
         */
        private void initialize() {
            inventoryframe = new JFrame();
            inventoryframe.setExtendedState(JFrame.MAXIMIZED_BOTH);
            inventoryframe.getContentPane().setBackground(new Color(153, 204, 102));
            inventoryframe.getContentPane().setForeground(new Color(255, 255, 255));
            inventoryframe.getContentPane().setPreferredSize(new Dimension(1365, 747));
            inventoryframe.getContentPane().setLayout(null);
    
            JLabel lblInventory = new JLabel("Inventory Management");
            lblInventory.setBounds(56, 32, 234, 27);
            lblInventory.setFont(new Font("Tahoma", Font.PLAIN, 22));
            inventoryframe.getContentPane().add(lblInventory);
    
            JScrollPane scrollPane = new JScrollPane();
            scrollPane.setBounds(56, 130, 479, 249);
            inventoryframe.getContentPane().add(scrollPane);
    
            table = new JTable();
            table.setShowVerticalLines(false);
            table.setShowHorizontalLines(false);
            table.setShowGrid(false);
            table.setFillsViewportHeight(true);
            /* table.setModel(new DefaultTableModel(
             new Object[][]{},
             new String[]{
             "t", "e"
             }
             ));*/
            Object[][] data = {{true, true, true}, {false, false, false}};
            String[] cols = {"Bibitty", "Boppity", "Boo"};
    
            DefaultTableModel model = new DefaultTableModel(data, cols) {
                @Override
                public Class getColumnClass(int column) {
                    return getValueAt(0, column).getClass();
                }
            };
            table.setModel(model);
            scrollPane.setViewportView(table);
    
            checkbox = new JCheckBox("borrow");
            checkbox.setHorizontalAlignment(SwingConstants.CENTER);
            checkbox.setBounds(360, 63, 97, 23);
    
            TableColumn sportColumn = table.getColumnModel().getColumn(1);
            sportColumn.setCellEditor(new DefaultCellEditor(checkbox));
    
           inventoryframe.pack();
           inventoryframe.setVisible(true);
        }
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    new Inventory();
                }
            });
        }
    }
    

    更新2

    真的,这应该是一个完全不同的问题,但我今天感觉很慷慨

    使用这个测试类。运行它。当你点击按钮时,它会打开Inventory类。您可能没有在按钮的actionPerformed中实例化Inventory。确保该类文件与Inventory类文件位于同一个包中。只需运行下面的类

    import java.awt.GridBagLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.SwingUtilities;
    
    public class InventoryTest extends JFrame {
    
        public InventoryTest() {
            setLayout(new GridBagLayout());
            JButton show = new JButton("Show Inventory");
            add(show);
    
            show.addActionListener(new ActionListener(){
                @Override
                public void actionPerformed(ActionEvent e) {
                    new Inventory();
                }
            });
    
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            setSize(400, 400);
            setLocationRelativeTo(null);
            setVisible(true);
        }
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable() {
                @Override
                public void run() {
                    new InventoryTest();
    
                }
            });
        }
    }