2016-12-13 33 views
3

我正在執行撤消/重做功能到我的JTable中,但我有一個JTable的默認行爲的問題,它開始在任何按鍵上編輯單元格。如何防止JTable單元在某些擊鍵上開始編輯?

的問題是,它也開始在CTRL +ž CTRL +Ÿ編輯

如何在按下這兩個鍵時防止單元格編輯?

注意:我有一個面板內有多個表的多個面板,我試過重寫isCellEditable()但失敗。

+0

在CTRL + Z和CTRL + Y上會發生什麼? – XtremeBaumer

+0

選定的單元格開始編輯並將按下的字符添加到它。 –

+1

請[編輯]你的問題,並添加上面的說明。其他用戶可能不會閱讀評論。 [-From Review](http://stackoverflow.com/review/first-posts/14579036) – xenteros

回答

3

此示例阻止上CTRL + ŽCTRL + ý正在編輯的細胞。它通過這樣做:

  1. 重寫CellEditor.isCellEditable
  2. 檢查傳遞的事件對象是否是KeyEvent
  3. 如果是這樣的實例,並按下的鍵是CTRL + žCTRL + Y,它返回false

import java.awt.BorderLayout; 
import java.awt.Dimension; 
import java.awt.event.KeyEvent; 
import java.util.EventObject; 

import javax.swing.DefaultCellEditor; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.JTextField; 
import javax.swing.SwingUtilities; 
import javax.swing.table.TableCellEditor; 

public class JTableWithCtrlZ { 
    private JTableWithCtrlZ() {} 

    @SuppressWarnings("serial") 
    private static JTable createTable() { 
     return new JTable(10, 10) { 
      @Override 
      public TableCellEditor getDefaultEditor(Class<?> columnClass) { 
       return new DefaultCellEditor(new JTextField()) { 
        @Override 
        public boolean isCellEditable(EventObject anEvent) { 
         if(anEvent instanceof KeyEvent) { 
          KeyEvent ke = (KeyEvent) anEvent; 
          if((ke.getKeyCode() == KeyEvent.VK_Z || ke.getKeyCode() == KeyEvent.VK_Y) && 
           (ke.getModifiersEx() & KeyEvent.CTRL_DOWN_MASK) == KeyEvent.CTRL_DOWN_MASK) 
           return false; 
         } 

         return super.isCellEditable(anEvent); 
        } 
       }; 
      } 
     }; 
    } 

    public static JFrame createFrame() { 
     JPanel p = new JPanel(); 
     p.setLayout(new BorderLayout()); 
     p.add(new JScrollPane(createTable()), BorderLayout.CENTER); 
     p.setPreferredSize(new Dimension(250, 150)); 

     JFrame f = new JFrame(); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.setContentPane(p); 
     f.pack(); 
     return f; 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       createFrame().setVisible(true); 
      } 
     }); 
    } 
} 
+0

這是我一直在尋找。非常感謝! –

+0

@MilosMisic當然歡迎您。我只回答你阻止編輯的部分。捕捉關鍵事件以撤銷/重做是另一回事。 –

+0

它已經在我的項目中並且完全正常工作。 :) –

相關問題