2016-12-13 6 views
3

Я реализую функцию Undo/Redo в своем JTable, но у меня есть проблема с поведением JTable по умолчанию, который начинает редактирование ячейки при любом нажатии клавиши.Как предотвратить запуск JTable-камеры при некоторых нажатиях клавиш?

Проблема заключается в том, что он также начинает редактирование на CTRL +Z и CTRL +Y.

Как предотвратить редактирование ячейки при нажатии этих двух клавиш?

ПРИМЕЧАНИЕ. У меня есть несколько панелей с несколькими таблицами внутри одной панели, и я попытался переопределить isCellEditable(), но не смог.

+0

Что происходит с CTRL + Z и CTRL + Y? – XtremeBaumer

+0

Выбранная ячейка начинает редактирование и добавляет к ней нажатый символ. –

+1

Пожалуйста, отредактируйте ваш вопрос и добавьте вышеуказанное разъяснение. Другие пользователи могут не читать комментарий. [-От обзора] (http://stackoverflow.com/review/first-posts/14579036) – xenteros

ответ

3

В этом примере предотвращает ячейка редактируется на CTRL +Z и CTRL +У. Это делает так:

  1. Переопределение CellEditor.isCellEditable
  2. Проверка, является ли объект события, передаваемый является экземпляром KeyEvent
  3. Если это так, и нажата клавиша является CTRL + Z или 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

Это уже в моем проекте и полностью работает. :) –