【问题标题】:How would I go about changing the boolean string to a JCheckBox in JTable?我将如何将布尔字符串更改为 JTable 中的 JCheckBox?
【发布时间】:2011-08-24 23:26:46
【问题描述】:

好的。我已经实现了一个自定义的 JTable 模型,其中包括整个

@Override
public Class<?> getColumnClass(final int column) {

在我的里面

if (column == 0)
    return Boolean.class;

当我跑步时,我转到JTable,而不是选中的JCheckbox,它说的是真的。当我点击它时,它会变成JCheckBox,直到我取消点击,然后说真或假。

我做错了什么!!???

【问题讨论】:

  • 不知道你做错了什么,因为你没有发布你的 SSCCE。 3 行代码对我们没有帮助。

标签: java swing jtable boolean jcheckbox


【解决方案1】:

真的不知道,你可以对比一下你的代码

注意 Column.Class 的两个定义都是有效的,您可以尝试取消注释被阻止的代码

import java.awt.*;
import javax.swing.*;
import javax.swing.table.*;

public class TablePrepareRenderer extends JFrame {

    private static final long serialVersionUID = 1L;
    private JTable table;

    public TablePrepareRenderer() {
        Object[] columnNames = {"Type", "Company", "Shares", "Price", "Boolean"};
        Object[][] data = {
            {"Buy", "IBM", new Integer(1000), new Double(80.50), false},
            {"Sell", "MicroSoft", new Integer(2000), new Double(6.25), true},
            {"Sell", "Apple", new Integer(3000), new Double(7.35), true},
            {"Buy", "Nortel", new Integer(4000), new Double(20.00), false}
        };
        DefaultTableModel model = new DefaultTableModel(data, columnNames);
        table = new JTable(model) {

            private static final long serialVersionUID = 1L;

            /*@Override
            public Class getColumnClass(int column) {
            return getValueAt(0, column).getClass();
            }*/
            @Override
            public Class getColumnClass(int column) {
                switch (column) {
                    case 0:
                        return String.class;
                    case 1:
                        return String.class;
                    case 2:
                        return Integer.class;
                    case 3:
                        return Double.class;
                    default:
                        return Boolean.class;
                }
            }

            @Override
            public Component prepareRenderer(TableCellRenderer renderer, int row, int column) {
                Component c = super.prepareRenderer(renderer, row, column);
                int firstRow = 0;
                int lastRow = table.getRowCount() - 1;
                if (row == lastRow) {
                    ((JComponent) c).setBackground(Color.red);
                } else if (row == firstRow) {
                    ((JComponent) c).setBackground(Color.blue);
                } else {
                    ((JComponent) c).setBackground(table.getBackground());
                }
                return c;
            }
        };
        table.setPreferredScrollableViewportSize(table.getPreferredSize());
        JScrollPane scrollPane = new JScrollPane(table);
        getContentPane().add(scrollPane);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                TablePrepareRenderer frame = new TablePrepareRenderer();
                frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }
}

【讨论】:

  • 是的,我不确定为什么它不像复选框。
  • 哦,好吧,我会继续尝试的,LOLZ。
  • 哇。我想到了。我所有的代码都是正确的,除了我的 JLabel.CENTER 东西使文本居中。我将它应用到复选框,所以它转换成一个字符串...
【解决方案2】:

我在检查这个(有缺陷的)example 时遇到了类似的问题。无论getColumnClass() 返回的结果如何,方法调用getDefaultRenderer(Boolean.class) 返回一个JTable.BooleanEditor,对于未结合的DefaultTableModel,它是java.lang.Object。要查看效果,请将复选框列拖到新位置,然后单击复选框标题。视图中的新列 0 现在将在 truefalse 之间交替。

【讨论】:

    【解决方案3】:
    table = new JTable(model) {
    
    private static final long serialVersionUID = 1L;
    
    /*@Override
    public Class getColumnClass(int column) {
    return getValueAt(0, column).getClass();
    }*/
    @Override
    public Class getColumnClass(int column) {
        switch (column) {
            case 0:
                return String.class;
            case 1:
                return String.class;
            case 2:
                return Integer.class;
            case 3:
                return Double.class;
            default:
                return Boolean.class;
        }
    }
    

    我使用 MKorbel 给出的答案解决了这个问题。

    【讨论】:

    • 为什么String.class有2种情况?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-17
    • 2020-06-21
    • 1970-01-01
    • 1970-01-01
    • 2022-07-20
    • 2011-02-17
    相关资源
    最近更新 更多