Action을받는 JButton 클래스를 만들었습니다. JButton 클래스에는 키 스트로크 & 마우스 리스너가 포함되어 있으므로 필요한만큼 여러 클래스에서 같은 클래스를 사용할 수 있습니다.JButton & Action & KeyBinding
내 문제는 : JButton은 키를 누를 때 포커스를 얻지는 않지만 동작을 수행합니다. 새로운 배경이나 버튼이 액션을 수행했다는 것을 사용자에게 알리는 것을 만들어야합니다.
어떤 아이디어 ?? 당신은 단순히 해당 인스턴스에 KeyBinding
의를 추가 할 수 있습니다 때
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Insets;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.Action;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.KeyStroke;
import javax.swing.SwingConstants;
import javax.swing.border.LineBorder;
import swtdesigner.SwingResourceManager;
public class IButtonSave extends JButton{
private static final long serialVersionUID = 1L;
private Action action = null;
public IButtonSave() {
super();
setFocusPainted(true);
setFocusable(true);
try {
jbInit();
} catch (Throwable e) {
e.printStackTrace();
}
}
private void jbInit() throws Exception {
setMargin(new Insets(0, 0, 0, 0));
setBorder(new LineBorder(Color.black, 1, true));
setIconTextGap(0);
setHorizontalTextPosition(SwingConstants.CENTER);
setVerticalTextPosition(SwingConstants.TOP);
setPreferredSize(new Dimension(50, 43));
setMinimumSize(new Dimension(50, 43));
setMaximumSize(new Dimension(50, 43));
addMouseListener(new ThisMouseListener());
setVerifyInputWhenFocusTarget(true);
}
public void setAction(Action a){
action = a;
KeyStroke ks = KeyStroke.getKeyStroke(KeyEvent.VK_F1,0,true);
KeyStroke ks2 = KeyStroke.getKeyStroke(KeyEvent.VK_ENTER,0);
getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(ks, "Save");
getInputMap(JComponent.WHEN_FOCUSED).put(ks2, "Save");
getActionMap().put("Save", a);
setText("Save [F1]");
setIcon(SwingResourceManager.getIcon(SwingResourceManager.class, "/images/small/save.png"));
setToolTipText("[F1]");
}
private class ThisMouseListener extends MouseAdapter {
public void mouseClicked(MouseEvent e) {
this_mouseClicked(e);
}
}
protected void this_mouseClicked(MouseEvent e) {
if(e.getClickCount() >= 1){
action.actionPerformed(null);
}
}
}
'super.setAction'을 호출하지 않는 이유는 무엇입니까? –
아니, 당신의 방식으로 그것을 호출하는 아무 문제가 없다, 버튼은 잘 작동하지만 키 F1을 누르면 작업이 완료되지만 초점은 절대로 버튼으로 이동하지 않습니다. 내가해야 할 일은 버튼을 집중시키고 동작이 수행 될 때 누르는 것입니다. – Motasem
더 나은 도움을 더 빨리 얻으려면 [SSCCE] (http://sscce.org/)를 게시하십시오 (이 예제는 옵션 창에 'IButtonSave'를 표시하기 위해 적어도 main (String [])이 필요합니다) . –