【发布时间】:2012-11-26 13:32:39
【问题描述】:
我创建了一个接收动作的 JButton 类,JButton 类包括击键和鼠标侦听器,因此我可以根据需要在多个帧中使用同一个类。
我的问题是: JButton 按键时没有获得焦点,但它在执行操作。 我需要制作一个新的背景或其他东西来告诉用户按钮执行了操作。
有什么想法吗??
这是我的代码:
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 键时,动作完成但焦点永远不会转到按钮。我需要做的是在执行操作时使按钮聚焦并按下。
-
为了尽快获得更好的帮助,请发布SSCCE(此示例至少需要
main(String[])才能在选项窗格中的屏幕上显示IButtonSave)。 -
IButtonSave 是我在每个新对话框或框架中调用的类,我需要将操作保存到数据库。
-
更多细节,例如,如果用户按下 F1,则按钮变为红色,但我需要在调用操作时在操作侧执行此操作。
标签: java swing focus jbutton key-bindings