Java 需要保持某些列可编辑和不可编辑,并且只允许双击单元格即可编辑单元格

Java 需要保持某些列可编辑和不可编辑,并且只允许双击单元格即可编辑单元格,java,swing,jtable,tablecelleditor,defaulttablemodel,Java,Swing,Jtable,Tablecelleditor,Defaulttablemodel,在我的JTable实现中。我必须保持某些列可编辑,而某些列不可编辑,因此我必须覆盖isCellEditable- @Override public boolean isCellEditable(int row, int col) { if (col == uneditableColumn) { return false; } return bEdit; } 现在我的要求是只允许双击单元格进行编辑,也就是说,如果用户双击单元格,则只有它进入可编辑模式。为此

在我的
JTable
实现中。我必须保持某些列可编辑,而某些列不可编辑,因此我必须覆盖
isCellEditable
-

@Override
public boolean isCellEditable(int row, int col) {
    if (col == uneditableColumn) {
        return false;
    }
    return bEdit;
}
现在我的要求是只允许双击单元格进行编辑,也就是说,如果用户双击单元格,则只有它进入可编辑模式。为此,我必须制作您自己的
CellEditor
并覆盖

public boolean isCellEditable( EventObject e )
有人能建议是否可以使用-

public boolean isCellEditable(int row, int col) 

请帮助-

好吧,我不会在
JTable
中重写
isCellEditable(…)
,而是提供一个自定义表模型

JTable#isCellEditable(…)
上的JavaDoc:

列是在表视图的显示顺序中指定的,而不是在表模型的列顺序中指定的。这是一个重要的区别,因为当用户重新排列表中的列时,视图中给定索引处的列将发生更改。同时,用户的操作不会影响模型的列顺序


此外,单元格可能看起来对表是可编辑的,但编辑器本身在双击之前可能不会提供输入字段。如果您希望一次只编辑一个单元格,那么您也可以将该信息存储在模型中,并让编辑器检查。

好吧,我不会在
JTable
中覆盖
isCellEditable(…)
,而是提供一个自定义表模型

is to allow edit the cell only on Double click i.e. if user double clicks 
on cell then only it comes into editable mode.
JTable#isCellEditable(…)
上的JavaDoc:

列是在表视图的显示顺序中指定的,而不是在表模型的列顺序中指定的。这是一个重要的区别,因为当用户重新排列表中的列时,视图中给定索引处的列将发生更改。同时,用户的操作不会影响模型的列顺序

此外,单元格可能看起来对表是可编辑的,但编辑器本身在双击之前可能不会提供输入字段。如果您希望一次只编辑一个单元格,那么您也可以将该信息存储在模型中,并让编辑器进行检查

is to allow edit the cell only on Double click i.e. if user double clicks 
on cell then only it comes into editable mode.
你看

对于CellEditor或方法,重写isCellEditable(AbstractTableModel)

对于DefaultTableModel,它可能是

import javax.swing.*;
import javax.swing.UIManager.LookAndFeelInfo;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.table.*;

public class EditorRendererClickCountToStart {

    public EditorRendererClickCountToStart() {
        TableModel model = new DefaultTableModel(new Object[][]{
                    {"A", "Item 0"}, {"B", "Item 1"}, {"C", "Item 2"},
                    {"D", "Item 3"}, {"E", "Item 4"}}, new String[]{"TextField", "Combo"});
        JTable table = new JTable(model);
        table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        DefaultCellEditor editor = new DefaultCellEditor(new JComboBox(new Object[]{
                    "Item 0", "Item 1", "Item 2", "Item 3", "Item 4"}));
        editor.setClickCountToStart(2);
        table.getColumnModel().getColumn(1).setCellEditor(editor);
        table.setPreferredScrollableViewportSize(table.getPreferredSize());
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(new JScrollPane(table));
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        try {
            for (LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
                System.out.println(info.getName());
                if ("Nimbus".equals(info.getName())) {
                    UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (UnsupportedLookAndFeelException e) {// handle exception
        } catch (ClassNotFoundException e) {// handle exception
        } catch (InstantiationException e) {// handle exception
        } catch (IllegalAccessException e) {// handle exception
        }
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                new EditorRendererClickCountToStart();
            }
        });
    }
}
你看

对于CellEditor或方法,重写isCellEditable(AbstractTableModel)

对于DefaultTableModel,它可能是

import javax.swing.*;
import javax.swing.UIManager.LookAndFeelInfo;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.table.*;

public class EditorRendererClickCountToStart {

    public EditorRendererClickCountToStart() {
        TableModel model = new DefaultTableModel(new Object[][]{
                    {"A", "Item 0"}, {"B", "Item 1"}, {"C", "Item 2"},
                    {"D", "Item 3"}, {"E", "Item 4"}}, new String[]{"TextField", "Combo"});
        JTable table = new JTable(model);
        table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        DefaultCellEditor editor = new DefaultCellEditor(new JComboBox(new Object[]{
                    "Item 0", "Item 1", "Item 2", "Item 3", "Item 4"}));
        editor.setClickCountToStart(2);
        table.getColumnModel().getColumn(1).setCellEditor(editor);
        table.setPreferredScrollableViewportSize(table.getPreferredSize());
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(new JScrollPane(table));
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        try {
            for (LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
                System.out.println(info.getName());
                if ("Nimbus".equals(info.getName())) {
                    UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (UnsupportedLookAndFeelException e) {// handle exception
        } catch (ClassNotFoundException e) {// handle exception
        } catch (InstantiationException e) {// handle exception
        } catch (IllegalAccessException e) {// handle exception
        }
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                new EditorRendererClickCountToStart();
            }
        });
    }
}

@克丽奥帕特拉谢谢,这就是问题,在这个世界上什么才是真正健康的,嗯,。。。我是1号买的。地方是笑的,那么长时间什么都没有,只有一堆烂泥和上二。那个地方是Nutella???或者……,也许,很难决定:-)@mKorbel谢谢。编辑仅限于鼠标点击,抱歉——正如我所要求的,但如果用户开始使用键盘键入文本,则表的单元格允许他这样做。我们是否可以限制他也使用键盘进行编辑,除非他不双击单元格。@Ashish Pancholi,F2键是关于开始编辑的(将有关该操作的信息放入工具提示中),可能是这样:-),我认为这是不必要的,从单元格中删除MouseListener,然后最好是更改编辑器。设置ClickCountToStart(int);对于10°、20°、50°,呵呵,但我知道一些用户可能会强制执行此限制,@mKorbel我不理解您的评论,但我接受您的回答,因为您已经解决了我的问题。我实际上需要-如果用户开始按键,然后表格搜索匹配的文本为他,如果用户双击单元格,然后表格允许他编辑文本。-可能吗?请帮忙。Thanks@AshishPancholi请在任何事情发生之前,您是否有可能使用SSCCE编辑您的问题,或者开始一个新问题,因为可能存在业务或逻辑问题,因为您最后的评论不是关于用户友好的方式,可能我对您有错,带有粘贴图像的代码是最好的方式…@kleopatra谢谢,这就是这个世界上什么才是真正健康的问题,嗯,。。。我是1号买的。地方是笑的,那么长时间什么都没有,只有一堆烂泥和上二。那个地方是Nutella???或者……,也许,很难决定:-)@mKorbel谢谢。编辑仅限于鼠标点击,抱歉——正如我所要求的,但如果用户开始使用键盘键入文本,则表的单元格允许他这样做。我们是否可以限制他也使用键盘进行编辑,除非他不双击单元格。@Ashish Pancholi,F2键是关于开始编辑的(将有关该操作的信息放入工具提示中),可能是这样:-),我认为这是不必要的,从单元格中删除MouseListener,然后最好是更改编辑器。设置ClickCountToStart(int);对于10°、20°、50°,呵呵,但我知道一些用户可能会强制执行此限制,@mKorbel我不理解您的评论,但我接受您的回答,因为您已经解决了我的问题。我实际上需要-如果用户开始按键,然后表格搜索匹配的文本为他,如果用户双击单元格,然后表格允许他编辑文本。-可能吗?请帮忙。Thanks@AshishPancholi请在任何事情发生之前,您是否有可能使用SSCCE编辑您的问题,或者开始一个新问题,因为可能存在业务或逻辑问题,因为您最后的评论不是关于用户友好的方式,可能我对您有错,带有粘贴图像的代码是最好的方式。。。。