JTableprepareEditor 的工作原理 [英] JTable how prepareEditor works

查看:35
本文介绍了JTableprepareEditor 的工作原理的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我不明白 prepareEditor 是如何工作的,我无法使用来自 prepareEditor 的 Action 为 prepareRenderer 设置可见性规则,正如我在附加图像中捕获的那样

I don't understand how prepareEditor works, I'm not able set visibility rules for prepareRenderer with Action from prepareEditor, as I captured in attached Image

1.st 行的规则按我的预期工作,如果未选择 JCheckBox(也使用 JTable 选择荧光笔),则其他 TableCells 不可见,但是如果我在 1.st TableColumn 中选择 JCheckBox,则我不能只显示 Rule + Mail TableColumn,只显示 TableRow 中的所有组件,我该如何存档

rules for 1.st row works as I expected, other TableCells are un-visible if JCheckBox isn't selected (with JTable selection hightlighter too), but if I select JCheckBox in 1.st TableColumn, then I can't shows only Rule + Mail TableColumn, only to shows all Components in the TableRow, how can I archieve that

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

public class TableWithCheckBoxOrBlank {

    private Object[] columns = new Object[]{
        "Select", "Name", "Rule", "Mail", "Include", "Phone"};
    private Object[][] data = {
        {false, "Bill", false, "Blabla@bla", false, "00 000 000"},
        {false, "Edd", false, "Blabla@bla", false, "00 000 000"},
        {false, "Paul", false, "Blabla@bla", false, "00 000 000"},
        {false, "ZOO", false, "Blabla@bla", false, "00 000 000"}};

    public void makeUI() {
        DefaultTableModel model = new DefaultTableModel(data, columns) {

            private static final long serialVersionUID = 1L;

            @Override
            public boolean isCellEditable(int row, int column) {
                return column != 1;
            }

            @Override
            public Class getColumnClass(int columnIndex) {
                switch (columnIndex) {
                    case 0:
                        return Boolean.class;
                    case 1:
                        return String.class;
                    case 2:
                        return Boolean.class;
                    case 3:
                        return String.class;
                    case 4:
                        return Boolean.class;
                    case 5:
                        return String.class;
                }
                return null;
            }
        };
        final JTable table = new JTable(model) {

            private static final long serialVersionUID = 1L;

            @Override
            public Component prepareRenderer(TableCellRenderer renderer, int row, int column) {
                Component c = super.prepareRenderer(renderer, row, column);
                if (column == 0 || column == 1 || (Boolean) getValueAt(row, 0)) {
                    return c;
                }
                return Box.createRigidArea(c.getPreferredSize());
            }

            @Override
            public Component prepareEditor(TableCellEditor editor, int row, int column) {
                Component c = super.prepareEditor(editor, row, column);
                if (column == 0 || column == 1 || (Boolean) getValueAt(row, 0)) {
                    return c;
                }
                return Box.createRigidArea(c.getPreferredSize());
            }
        };
        model.addTableModelListener(new TableModelListener() {

            @Override
            public void tableChanged(TableModelEvent e) {
                if (e.getColumn() == 0) {
                    if ((Boolean) table.getValueAt(table.getSelectedRow(), 0)) {
                        table.setValueAt(Boolean.FALSE, table.getSelectedRow(), 2);
                    }
                    table.repaint();
                }
            }
        });
        JScrollPane scroll = new JScrollPane(table);
        table.setPreferredScrollableViewportSize(table.getPreferredSize());
        JFrame frame = new JFrame("Table With Check Box Or Blank");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocation(150, 150);
        frame.add(scroll);
        frame.pack();
        frame.setVisible(true);
    }

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

            @Override
            public void run() {
                new TableWithCheckBoxOrBlank().makeUI();
            }
        });
    }
}

+++

编辑真的不包括电池,我只见树木不见森林:-(

EDIT really no baterry included, I can't see the forest for the trees :-(

感谢@camickr 在两眼之间踢球,到处都有很多大错误/问题......

thanks to @camickr for kick between eyes, there were lots of big mistakes/problems everywhere...

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

public class TableWithCheckBoxOrBlank {

    private Object[] columns = new Object[]{
        "Select", "Name", "Rule", "Mail", "Include", "Phone"};
    private Object[][] data = {
        {false, "Bill", false, "Blabla@bla", false, "00 000 000"},
        {false, "Edd", false, "Blabla@bla", false, "00 000 000"},
        {false, "Paul", false, "Blabla@bla", false, "00 000 000"},
        {false, "ZOO", false, "Blabla@bla", false, "00 000 000"}};

    public void makeUI() {
        DefaultTableModel model = new DefaultTableModel(data, columns) {

            private static final long serialVersionUID = 1L;

            @Override
            public boolean isCellEditable(int row, int column) {
                if (column == 0 || column == 2 || column == 4) {
                    return true;
                }
                if (column == 1 || column == 3 || column == 5) {
                    return false;
                }
                return (Boolean) getValueAt(row, 0);
            }

            @Override
            public Class getColumnClass(int columnIndex) {
                switch (columnIndex) {
                    case 0:
                        return Boolean.class;
                    case 1:
                        return String.class;
                    case 2:
                        return Boolean.class;
                    case 3:
                        return String.class;
                    case 4:
                        return Boolean.class;
                    case 5:
                        return String.class;
                }
                return null;
            }
        };
        final JTable table = new JTable(model) {

            private static final long serialVersionUID = 1L;

            @Override
            public Component prepareRenderer(TableCellRenderer renderer, int row, int column) {
                Component c = super.prepareRenderer(renderer, row, column);
                if ((column == 4 || column == 5) && (Boolean) getValueAt(row, 2)) {
                    return c;
                } else if ((column == 2 || column == 3) && (Boolean) getValueAt(row, 0)) {
                    return c;
                } else if (column == 0 || column == 1) {
                    return c;
                }
                return Box.createRigidArea(c.getPreferredSize());
            }

            @Override
            public Component prepareEditor(TableCellEditor editor, int row, int column) {
                Component c = super.prepareEditor(editor, row, column);
                if ((column == 4 || column == 5) && (Boolean) getValueAt(row, 2)) {
                    return c;
                } else if ((column == 2 || column == 3) && (Boolean) getValueAt(row, 0)) {
                    return c;
                } else if (column == 0 || column == 1) {
                    return c;
                }
                return Box.createRigidArea(c.getPreferredSize());
            }
        };
        model.addTableModelListener(new TableModelListener() {

            @Override
            public void tableChanged(TableModelEvent e) {
                if (e.getColumn() == 0) {
                    if ((Boolean) table.getValueAt(table.getSelectedRow(), 0)) {
                        table.setValueAt(Boolean.FALSE, table.getSelectedRow(), 2);
                    }
                    table.repaint();
                } else if (e.getColumn() == 2) {
                    if ((Boolean) table.getValueAt(table.getSelectedRow(), 2)) {
                        table.setValueAt(Boolean.FALSE, table.getSelectedRow(), 4);
                    }
                    table.repaint();
                }
            }
        });
        JScrollPane scroll = new JScrollPane(table);
        table.setPreferredScrollableViewportSize(table.getPreferredSize());
        JFrame frame = new JFrame("Table With Check Box Or Blank");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocation(150, 150);
        frame.add(scroll);
        frame.pack();
        frame.setVisible(true);
    }

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

            @Override
            public void run() {
                new TableWithCheckBoxOrBlank().makeUI();
            }
        });
    }
}

推荐答案

我认为 prepareRenderer(...) 代码应该是:

I think the prepareRenderer(...) code should be:

        public Component prepareRenderer(TableCellRenderer renderer, int row, int column) {
            Component c = super.prepareRenderer(renderer, row, column);

            if ((column == 2 || column == 3) && (Boolean)getValueAt(row, 0)) {
                return c;
            }

        //    if (column == 0 || column == 1 || (Boolean) getValueAt(row, 0)) {
            if (column == 0 || column == 1) {
                return c;
            }

            return Box.createRigidArea(c.getPreferredSize());
        }

那么你应该去掉 prepareEditor(...) 代码.相反,您应该在 isCellEditable(...) 方法中有更多的逻辑.类似的东西:

Then you should get rid of the prepareEditor(...) code. Instead you should have more logic in the isCellEditable(...) method. Something like:

        public boolean isCellEditable(int row, int column) {

            if (column == 0) return true;

            if (column == 1 || column == 4 || column == 5) return false;

            return (Boolean)getValueAt(row, 0);
        }

这篇关于JTableprepareEditor 的工作原理的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆