【问题标题】:Default Cell Editor Class Query?默认单元格编辑器类查询?
【发布时间】:2011-09-18 19:18:57
【问题描述】:

这就是我的JTable 从序列化数据中重建的方式:

table = new JTable(){
    public boolean isCellEditable(int arg0, int arg1) {
        return true;
    }
};
table.addMouseListener(this);
table.addFocusListener(this);
int width = HCAConstants.hcaGuiFuzzyTableWidth;
int tableRowHeight = HCAConstants.hcaGuiFuzzyTableRowHeight;
table.putClientProperty("cancelEditOnFocusLost", Boolean.TRUE);
table.putClientProperty("terminateEditOnFocusLost", Boolean.TRUE);
table.setModel(new MBFTableModel(data[currentH.Int][currentF.Int]));
TableColumn col = table.getColumnModel().getColumn(0);
col.setPreferredWidth(width);}
table.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT)
    .put(KeyStroke.getKeyStroke(KeyEvent.VK_TAB, 0), "none");
table.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT)
    .put(KeyStroke.getKeyStroke(KeyEvent.VK_TAB, InputEvent.SHIFT_DOWN_MASK), "none");
table.setCellSelectionEnabled(true);
KeyStroke tab = KeyStroke.getKeyStroke(KeyEvent.VK_TAB, 0);
InputMap map = table.getInputMap(JTable.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
map.put(tab, "selectNextRowCell");
table.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT)
    .put(KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), "none");
table.setEnabled(true);
table.setDefaultRenderer(FuzzyDat.class,new FuzzyDatRender());
table.setDefaultEditor(FuzzyDat.class, new FuzzyDatEditor(currentF,(LoadToTable)this)); 
table.setDefaultRenderer(MinMax.class, new MinMaxRender());
table.setDefaultEditor(MinMax.class, new MinMaxEditor());
table.setRowSelectionAllowed(true);
table.setColumnSelectionAllowed(true);
table.setRowHeight(tableRowHeight);

我的场景是这样的:每当我第一次点击单元格的滑块时,它没有响应;在第二次点击时,组件响应,然后滑块响应第一次点击。

如何使滑块仅与第一次点击互动,而不是最初点击两次。

DefaultCellEditor 具有三个默认构造函数:JCheckBoxJComboBoxJTextField;但我需要为JSlider 覆盖这个构造函数。我怎样才能做到这一点?这是必要的吗?有人建议我使用setClickCountToStart(1)

【问题讨论】:

    标签: java swing jtable tablecelleditor


    【解决方案1】:

    也许SliderColumnSpinnerColumn 之一可能会有所帮助:

    滑块列:

    import java.awt.*;
    import java.util.EventObject;
    import javax.swing.*;
    import javax.swing.border.*;
    import javax.swing.table.*;
    
    public class SliderColumn extends AbstractCellEditor
        implements TableCellEditor, TableCellRenderer {
    
        private JSlider editSlider, renderSlider;
        private Border originalBorder;
    
        public SliderColumn(JTable table, int column) {
            editSlider = new JSlider();
            renderSlider = new JSlider();
            originalBorder = editSlider.getBorder();
            editSlider.setBorder(new LineBorder(Color.BLUE));
            table.getColumnModel().getColumn(column).setCellEditor(this);
            Dimension d = renderSlider.getPreferredSize();
            table.setRowHeight(d.height);
        }
    
        @Override
        public Object getCellEditorValue() {
            return editSlider.getValue();
        }
    
        @Override
        public Component getTableCellEditorComponent(JTable table, Object value,
            boolean isSelected, int row, int column) {
            if (value != null) {
                editSlider.setValue((Integer) value);
            }
            return editSlider;
        }
    
        @Override
        public Component getTableCellRendererComponent(JTable table, Object value,
            boolean isSelected, boolean hasFocus, int row, int column) {
            if (hasFocus) {
                renderSlider.setBorder(new LineBorder(Color.BLUE));
            } else {
                renderSlider.setBorder(originalBorder);
            }
            if (value == null) {
                renderSlider.setValue(0);
            } else {
                int intValue = ((Integer) value).intValue();
                renderSlider.setValue(intValue);
            }
            return renderSlider;
        }
    
        @Override
        public boolean isCellEditable(EventObject evt) {
            return true;
        }
    
        public static void main(String[] args) {
            javax.swing.SwingUtilities.invokeLater(new Runnable() {
    
                @Override
                public void run() {
                    JFrame frame = new JFrame("SpinnerColumn");
                    JPanel panel = new JPanel(new GridLayout(1, 1));
                    JTable table = new JTable(5, 1);
                    SliderColumn spinnerColumn = new SliderColumn(table, 0);
                    table.setDefaultRenderer(Object.class, spinnerColumn);
                    panel.add(table);
                    frame.setContentPane(panel);
                    frame.pack();
                    frame.setVisible(true);
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                }
            });
        }
    }
    

    SpinnerColumn:

    import java.awt.*;
    import java.util.EventObject;
    import javax.swing.*;
    import javax.swing.border.*;
    import javax.swing.table.*;
    
    public class SpinnerColumn extends AbstractCellEditor implements TableCellEditor, TableCellRenderer {
    
        private static final long serialVersionUID = 1L;
        private JSpinner editSpinner, renderSpinner;
        private JTable table;
        private String[] list;
        private Border originalBorder;
    
        public SpinnerColumn(JTable table, int column) {
            editSpinner = new JSpinner();
            renderSpinner = new JSpinner();
            originalBorder = editSpinner.getBorder();
            editSpinner.setBorder(new LineBorder(Color.BLUE));
            this.table = table;
            table.getColumnModel().getColumn(column).setCellEditor(this);
        }
    
        public SpinnerColumn(String[] list, JTable table, int column) {
            editSpinner = new JSpinner();
            editSpinner.setModel(new SpinnerListModel(list));
            renderSpinner = new JSpinner();
            originalBorder = editSpinner.getBorder();
            editSpinner.setBorder(new LineBorder(Color.BLUE));
            this.list = list;
            this.table = table;
            table.getColumnModel().getColumn(column).setCellEditor(this);
        }
    
        @Override
        public Object getCellEditorValue() {
            return editSpinner.getValue();
        }
    
        @Override
        public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected,
                int row, int column) {
            if (list != null) {
                editSpinner.setValue(list[0]);
            } else {
                editSpinner.setValue(0);
            }
            if (value != null) {
                editSpinner.setValue(value);
            }
            return editSpinner;
        }
    
        @Override
        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,
                boolean hasFocus, int row, int column) {
            if (hasFocus) {
                renderSpinner.setBorder(new LineBorder(Color.BLUE));
            } else {
                renderSpinner.setBorder(originalBorder);
            }
            // *** here's where we set the spinner's value
            if (value == null) {
                renderSpinner.setValue(0);
            } else {
                int intValue = ((Integer) value).intValue();
                renderSpinner.setValue(intValue);
            }
            return renderSpinner;
        }
    
        @Override
        public boolean isCellEditable(EventObject evt) {
            return true;
        }
    
        public static void main(String[] args) {
            javax.swing.SwingUtilities.invokeLater(new Runnable() {
    
                @Override
                public void run() {
                    JFrame frame = new JFrame("SpinnerColumn");
                    JPanel panel = new JPanel(new GridLayout(1, 1));
                    JTable table = new JTable(5, 1);
                    SpinnerColumn spinnerColumn = new SpinnerColumn(table, 0);
                    table.setDefaultRenderer(Object.class, spinnerColumn);
                    panel.add(table);
                    frame.setContentPane(panel);
                    frame.pack();
                    frame.setVisible(true);
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                }
            });
        }
    }
    

    【讨论】:

    • 我冒昧地添加了一个JSlider 变体。
    【解决方案2】:

    尚不清楚FuzzyDatRenderMinMaxRender 是否派生自JSlider。目前尚不清楚FuzzyDatEditorMinMaxEditor 是否具有类似于或派生自DefaultCellEditor 中的clickCountToStart 属性。如果没有显示您描述的问题的sscce,我不知道如何回答这个问题。

    附录:编辑问题后,我猜测扩展AbstractCellEditor 会比DefaultCellEditor 更好,以避免默认的clickCountToStart 值。

    【讨论】:

    • 源自什么?哪个渲染器?哪个编辑?请澄清您的问题。
    猜你喜欢
    • 2014-07-02
    • 2022-09-30
    • 1970-01-01
    • 2019-12-08
    • 1970-01-01
    • 2018-09-30
    • 2014-11-08
    • 1970-01-01
    • 2014-01-01
    相关资源
    最近更新 更多