2012-10-12 27 views
4

我創建了自己的所見即所得編輯器,它由一個設計窗口和一個工具調色板窗口組成。 設計窗口是一個JFrame,工具調色板是一個將FocusableWindowState設置爲false的JDialog。 但是,通過將FocusableWindowState切換爲false,我不再能夠在我的工具選項板窗口中編輯JTable中的單元格。將其更改爲true允許我編輯單元格。在不可調焦窗口上編輯Jtable

這裏是我的代碼示例:

JFrame frame = new JFrame(); 
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
frame.setBounds(0, 0, 1024, 768); 

JDialog paletteWindow = new JDialog(frame, false); 
paletteWindow.setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE); 
paletteWindow.setResizable(false); 
paletteWindow.setFocusableWindowState(false); 
paletteWindow.setBounds(1024, 0, 320, 768); 

JTable grid = new JTable(new DefaultTableModel(new String[] {"Name", "Value"}, 5)); 
paletteWindow.getContentPane().add(new JScrollPane(grid)); 

frame.setVisible(true); 
paletteWindow.setVisible(true); 

如何仍然可以編輯即使FocusableWindowState設置爲false細胞?

+0

嗨Cobus,請張貼您的代碼與您的問題有關,所以我們可以幫助您。 –

+0

參見[*如何使用工具欄*](http://docs.oracle.com/javase/tutorial/uiswing/components/toolbar.html)。 – trashgod

+0

工具欄可以創建一個可浮動的窗口,但它仍然具有可調焦的窗口狀態,並在點擊它時抓住焦點。 – bouncer

回答

2

我已經找到了我的問題的答案,雖然它可能不符合每個人的需求。我已經使用KeyEventDispatcher將焦點框架中的關鍵事件派發到編輯單元編輯器。這裏是我的代碼示例:

JFrame frame = new JFrame(); 
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
frame.setBounds(0, 0, 1024, 768); 

JDialog paletteWindow = new JDialog(frame, false); 
paletteWindow.setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE); 
paletteWindow.setResizable(false); 
paletteWindow.setFocusableWindowState(false); 
paletteWindow.setBounds(1024, 0, 320, 768); 

JTable grid = new JTable(new DefaultTableModel(new String[] {"Name", "Value"}, 5)) { 
    private KeyEventDispatcher dispatcher; 

    @Override 
    public Component getEditorComponent() { 
     final Component c = super.getEditorComponent(); 
     if (dispatcher == null) { 
      dispatcher = new KeyEventDispatcher() { 
       public boolean dispatchKeyEvent(KeyEvent e) { 
        e.setSource(c); 
        for (KeyListener keyListener : c.getKeyListeners()) { 
         if (e.getID() == KeyEvent.KEY_PRESSED) { 
          keyListener.keyPressed(e); 
         } else if (e.getID() == KeyEvent.KEY_RELEASED) { 
          keyListener.keyReleased(e); 
         } else if (e.getID() == KeyEvent.KEY_TYPED) { 
          keyListener.keyTyped(e); 
         } 
        } 
        return false; 
       } 
      }; 
      KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(dispatcher); 
     } 
     return c; 
    } 

    @Override 
    public void removeEditor() { 
     if (dispatcher != null) { 
      KeyboardFocusManager.getCurrentKeyboardFocusManager().removeKeyEventDispatcher(dispatcher); 
      dispatcher = null; 
     } 
     super.removeEditor(); 
    } 
}; 
paletteWindow.getContentPane().add(new JScrollPane(grid)); 

frame.setVisible(true); 
paletteWindow.setVisible(true);