2015-04-02 15 views
0

在SO和@kleopatra的幫助下,我得到了下面的代碼,將Ctrl-Shift-U分配給JButton。 (我用CAPS,我不應該清楚地告訴我什麼是必須匹配。)需要一個類來方便鍵綁定

import java.awt.Dimension; 
import java.awt.event.ActionEvent; 
import static java.awt.event.InputEvent.CTRL_DOWN_MASK; 
import static java.awt.event.InputEvent.SHIFT_DOWN_MASK; 
import static java.awt.event.KeyEvent.VK_U; 
import javax.swing.*; 
import static javax.swing.KeyStroke.getKeyStroke; 

public class FirstTry { 
    private static JButton MYACTIONBUTTON; 
    private static JFrame frame; 
    private static JPanel panel; 

    public FirstTry(){ 
    Action MYACTION = new AbstractAction(){ 
     @Override 
     public void actionPerformed(ActionEvent e){ 
      JOptionPane.showMessageDialog(null,"do this"); 
     }}; 

    MYACTIONBUTTON = new JButton(MYACTION); 
    MYACTIONBUTTON.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW) 
          .put(getKeyStroke(VK_U, CTRL_DOWN_MASK | SHIFT_DOWN_MASK), 
             "MAKE_THESE_MATCH"); 
    MYACTIONBUTTON.getActionMap().put("MAKE_THESE_MATCH", MYACTION); 

    frame = new JFrame(); 
    panel = new JPanel(); 
    panel.add(MYACTIONBUTTON); 
    frame.add(panel); 
    frame.setVisible(true); 
    frame.pack(); 
} 

public static void main(String[] args) { 
    new FirstTry(); 
} 

這是很多經歷下一次,我想做出類似的鍵綁定,所以我想它應該是可能的推斷邏輯以形成abstract class將怕疼使分配擊鍵(例如,Ctrl-X)到動作(例如,「CTRL-X被按下」,如圖所示)經由聲明如:

button = new KeyBoundButton("WHATEVER", VK_X, CTRL_DOWN_MASK) 
{ 
    @Override 
    public void actionPerformed(ActionEvent e) 
    { 
    JOptionPane.showMessageDialog(null,"Ctrl-X was pressed!"); 
    } 
}; 

我已經所有這一切(半天)都在這方面工作,並且我無處可去。我有3個類:主,UI和KeyBoundButton。我承認我頭腦不清。

public class NewMain { 

    static UI ui; 

    public static void main(String[] args) 
    { 
    java.awt.EventQueue.invokeLater(new Runnable() 
    { 
     @Override 
     public void run() 
     { 
     ui = new UI(); 
     } 
    }); 
    } 
} 

UI:

import java.awt.event.ActionEvent; 
import static java.awt.event.InputEvent.CTRL_DOWN_MASK; 
import static java.awt.event.KeyEvent.VK_X; 
import javax.swing.JFrame; 
import javax.swing.JOptionPane; 
import javax.swing.JPanel; 
import static javax.swing.WindowConstants.DISPOSE_ON_CLOSE; 

public class UI { 

    static JFrame frame; 
    static JPanel panel; 
    static KeyBoundButton button; 

    UI(){ 
    frame = new JFrame(); 
    panel = new JPanel(); 

    button = new KeyBoundButton("WHATEVER", VK_X, CTRL_DOWN_MASK) 
    { 
     @Override 
     public void actionPerformed(ActionEvent e) 
     { 
     JOptionPane.showMessageDialog(null,"Ctrl-X was pressed!"); 
     } 
    }; 

    panel.add(button); 
    frame.add(panel); 
    frame.setVisible(true); 
    frame.setDefaultCloseOperation(DISPOSE_ON_CLOSE); 
    frame.pack(); 
    } 
} 

KeyBoundButton:

import java.awt.event.ActionEvent; 
import javax.swing.*; 
import static javax.swing.KeyStroke.getKeyStroke; 

public abstract class KeyBoundButton extends JButton{ 

    public abstract void actionPerformed(ActionEvent e); 

    public KeyBoundButton(String actionMapKey, int key, int mask) 
    { 
    Action myAction = new AbstractAction() 
    { 
     @Override 
     public void actionPerformed(ActionEvent e) 
     { // to be overridden 
     } 
    };  

    new JButton(myAction); 

    getInputMap(WHEN_IN_FOCUSED_WINDOW) 
        .put(getKeyStroke(key, mask),actionMapKey); 
    getActionMap().put(      actionMapKey, myAction); 
    } 
} 

我是在所有的接近使得該類能夠輕鬆按鍵綁定如上(及以下)所示?或者是因爲沒有足夠的關鍵綁定知識以及其他方面的想法,

button = new KeyBoundButton("WHATEVER", VK_X, CTRL_DOWN_MASK) 
{ 
    @Override 
    public void actionPerformed(ActionEvent e) 
    { 
    JOptionPane.showMessageDialog(null,"Ctrl-X was pressed!"); 
    } 
}; 

回答

1

你不需要在側的KeyBoundButtonnew JButton(myAction);,而是使用setAction(myAction)

第二個按鈕的創作有沒有關係什麼的,其實,你叫new JButton(myAction)後立即對象有資格垃圾收集

我寫了一個實用程序類,雖然後面做了類似的事情,但意味着我不需要爲每個我想要使用的類創建「自定義」類,所以我可以簡單地將它傳遞給Component,名稱,KeyStroke a nd Action(和可選的重點級別),這已經使生活更簡單

+0

@ MadProgrammer - 不使用'new JButton(myAction)'非常有意義,現在你提到它,但僅僅用'setAction(myAction)'替換它還不夠 - 仍然沒有響應'Ctrl -X'。所以我發佈了DID工作的下一個「答案」,因爲我不認爲我可以讓它看起來在這個盒子裏。感謝您的快速幫助。 – DSlomer64 2015-04-04 16:34:42

0

@MadProgrammer讓我開始;這是什麼工作。原始代碼的更改標記爲///////////////。 (我不知道爲什麼原線public abstract void actionPerformed(ActionEvent e)沒有工作....看起來不錯。[?])

import java.awt.event.ActionEvent; 
import javax.swing.*; 
import static javax.swing.KeyStroke.getKeyStroke; 

public abstract class KeyBoundButton extends JButton{ 

    public abstract void doThis(ActionEvent e); ////////////////////// 

    public KeyBoundButton(String actionMapKey, int key, int mask) 
    { 
    Action myAction = new AbstractAction() 
    { 

     @Override 
     public void actionPerformed(ActionEvent e) 
     { 
     doThis(e); /////////////////////////// 
     } 
    };  

    setAction(myAction); ////////////////////////////// 

    getInputMap(WHEN_IN_FOCUSED_WINDOW) 
        .put(getKeyStroke(key, mask),actionMapKey); 
    getActionMap().put(      actionMapKey, myAction); 
    } 
} 

我的原意是(如瘋狂也表明),使這項工作的任何組件在合理範圍內;就此而言。我可能會回來尋求更多幫助。

相關問題