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