2012-04-02 60 views
1

在我执行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) 

请帮助 -

回答

3
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. 

你看看DefaultCellEditor#clickCountToStart

cellEditor的或方法重载的isCellEditable(AbstractTableModel上)

@Override 
public boolean isCellEditable(EventObject anEvent) { 
    if (anEvent instanceof MouseEvent) { 
     return ((MouseEvent) anEvent).getClickCount() >= clickCountToStart; 
    } 
    return true; 
} 

为的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(); 
      } 
     }); 
    } 
} 
+0

吸烟是不健康的,总是: - )+1为编辑,谢谢 – kleopatra 2012-04-02 10:17:11

+0

@kleopatra谢谢,这就是问题在这个世界上真正健康的是什么,呃,......我是第一次得到它的。地方是笑,那么长久没有什么只有堆和第二。地方是Nutella?或....,也许,很难决定:-) – mKorbel 2012-04-02 10:33:09

+0

@mKorbel谢谢。编辑只限于鼠标点击,对不起 - 正如我所问的那样,但如果用户开始键入使用文本的键盘,表格的单元格允许他这样做。我们是否可以限制他使用键盘进行编辑,除非他没有双击单元格。 – 2012-04-02 10:36:41

3

好了,我会不会覆盖isCellEditable(...)JTable而是提供一个自定义的表格模型。

从JavaDoc的上JTable#isCellEditable(...)

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

此外,单元格可能似乎可以编辑到表格,但编辑器本身在双击之前可能不会提供输入字段。如果您想一次只编辑一个单元格,则可以将该信息存储在模型中,并让编辑检查该信息。

相关问题