java - 如何将复选框监听器与动态 JTable 一起使用?

标签 java swing jtable tablecelleditor

我是 Swing 的新手,这就是为什么我问了很多;实际上,我对此进行了很多搜索,但找不到好的答案。我必须做一个动态表;它必须填写 XML 文件中的工作表名称,并且还有另一列带有复选框,如果必须验证工作表,则可以单击该复选框。

当我创建表时它是空的。在执行其他操作后,它将填充数据。

我需要知道在这种情况下如何使用复选框监听器。

这是主要代码,按钮打开执行填充。

public class CreateScenarioUI extends JFrame {

/**
 * 
 */
private static final long serialVersionUID = 1L;

private JPanel contentPane;
private JTextField textField;
String filePath = null;
String[] sheetNames = null;



/**
 * Launch the application.
 */
public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
        public void run() {
            try {
                CreateScenarioUI frame = new CreateScenarioUI();
                frame.setVisible(true);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
}

/**
 * Create the frame.
 */
public CreateScenarioUI() {


    setTitle("Scenario creation");
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setBounds(100, 100, 450, 450);
    contentPane = new JPanel();
    contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
    setContentPane(contentPane);
    contentPane.setLayout(null);

    final MainTable table = new MainTable(contentPane);

    /** Button Open */
    final JButton btnOpen = new JButton("Open");
    btnOpen.setFont(new Font("Tahoma", Font.PLAIN, 11));
    btnOpen.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent arg0) {
            performBtnOpen();
        }

        private void performBtnOpen() {
            JFileChooser choose = new JFileChooser();
            choose.addChoosableFileFilter(new ExcelFilter());
            int returnVal = choose.showOpenDialog(null);
            if (returnVal == JFileChooser.APPROVE_OPTION) {
                textField.setText(choose.getSelectedFile().getName());
            }

            FileReader fileReader = new FileReader();
            System.out.println(choose.getSelectedFile());
            filePath = choose.getSelectedFile().toString();
            sheetNames = fileReader.getSheetNames(choose.getSelectedFile());
            table.getModel().addColumn("Sheet name", sheetNames);
            Boolean[] selectorColumn = new Boolean[sheetNames.length];
            for (int i = 0; i < sheetNames.length; i++) {
                selectorColumn[i] = new Boolean(false);
            }
            table.getModel().addColumn("Selector", selectorColumn);
        }
    });

    btnOpen.setBounds(320, 50, 100, 20);
    contentPane.add(btnOpen);

}}

这是我创建MainTable的方法:

public class MainTable extends JFrame implements TableModelListener, ItemListener {

DefaultTableModel model = new DefaultTableModel();

@Override
public void tableChanged(TableModelEvent arg0) {
    // TODO Auto-generated method stub

}

public MainTable(JPanel contentPane){

    String[] setColumnIdentifiers = {};
    JTable table = new JTable(new Object[][] {}, new Object[] {
            "Sheet name", "Create" });
    JScrollPane scrollPane = new JScrollPane(table);

    /** Main Table */
    model = new DefaultTableModel(setColumnIdentifiers, 0) {
        /**
         * 
         */
        private static final long serialVersionUID = 1L;

        @Override
        public Class getColumnClass(int columnIndex) {
            if (columnIndex == 1) {
                return Boolean.class;
            } else {
                return super.getColumnClass(columnIndex);
            }
        }

        @Override
        public boolean isCellEditable(int row, int column) {
            boolean editable = true;
            if (column == 0) {
                editable = false;
                /**Object value = getValueAt(row, column);
                if (value instanceof Integer) {
                    editable = ((int)value) != 0;
                }*/
            }
            return editable;
        }
    };
    table.setModel(model);
    table.getModel().addTableModelListener(this);
    table.setFillsViewportHeight(true);
    table.setColumnSelectionAllowed(true);
    table.setBorder(new LineBorder(new Color(0, 0, 0)));
    table.setCellSelectionEnabled(true);
    table.setBounds(40, 100, 380, 190);
    scrollPane.setBounds(40, 100, 380, 190);
    scrollPane.setBorder(new LineBorder(new Color(0, 0, 0)));
    contentPane.add(scrollPane);

}

public DefaultTableModel getModel(){
    return model;
}

@Override
public void itemStateChanged(ItemEvent event) {
    //Object source = event.getItemSelectable();
    // TODO Auto-generated method stub
}   

}

任何帮助都会有用,谢谢大家!

最佳答案

default cell editor对于 Boolean.class 类型的可编辑列来说,是一个 JCheckBox编辑器需要监听复选框,并且在编辑复选框时需要监听。 编辑器结束后,检查TableModel是否有更改。如果另一个组件需要了解此类更改,它应该注册为 TableModelListener,如图 here 所示。 。相关例子可参见herehere .

关于java - 如何将复选框监听器与动态 JTable 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18194814/

相关文章:

java - 调用 setValueAt 不会发送 TableModel 事件

java - SAX 解析器 - OutOfMemoryError : Java heap space

Java JDK - 在 Eclipse 中找到,但在 CMD 中没有

java - 使用 Scala 中的原始类型实现 Java 接口(interface)

java - JFrame 布局问题,面板应该在顶部但在中间

java - 如何通过迭代具有数组值的 for 循环来填充 JTable

java - 如何在给定主键集合的情况下加载 JPA 中的所有实体?

java - 当我的程序繁忙时无法重新绘制 JPanel

java - 基于控制台的应用程序到 Java 中基于 GUI 的应用程序

java - 如何将这两个渲染器应用到同一个 JTable 上?