Java JButton:在不触发动作的情况下模拟JButton按键
我的用例是,我有一些JButton可以向ActionListener触发动作。我还使用按键向AcionListener发出一些相同的操作命令。当击键快捷方式触发一个操作时,该操作也是由其中一个按钮执行的,我希望该按钮看起来像是被按下的,但不是触发事件 因此,我研究了AbstractButtonAPI,并尝试了一些方法,如setSelected,但没有达到预期效果。最后,我查看了doCLick方法,看看是否可以使用删除动作触发部分,但这也不起作用Java JButton:在不触发动作的情况下模拟JButton按键,java,swing,jbutton,Java,Swing,Jbutton,我的用例是,我有一些JButton可以向ActionListener触发动作。我还使用按键向AcionListener发出一些相同的操作命令。当击键快捷方式触发一个操作时,该操作也是由其中一个按钮执行的,我希望该按钮看起来像是被按下的,但不是触发事件 因此,我研究了AbstractButtonAPI,并尝试了一些方法,如setSelected,但没有达到预期效果。最后,我查看了doCLick方法,看看是否可以使用删除动作触发部分,但这也不起作用 367 public void do
367 public void doClick(int pressTime) {
368 Dimension size = getSize();
369 model.setArmed(true);
370 model.setPressed(true);
371 paintImmediately(new Rectangle(0,0, size.width, size.height));
372 try {
373 Thread.currentThread().sleep(pressTime);
374 } catch(InterruptedException ie) {
375 }
376 model.setPressed(false);
377 model.setArmed(false);
378 }
我曾想过把所有的听众都赶走。运行doClick,然后再次添加它们,但我认为应该提供更优雅的东西
SSCE将是
public class Test {
public static void main(String[] args) throws InterruptedException{
JFrame jf = new JFrame();
jf.setLocationRelativeTo(null);
JButton jb = new JButton("Test Button");
jb.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("I don't want this to fire");
}
});
jf.getContentPane().add(jb);
jf.pack();
jf.setVisible(true);
Thread.sleep(1000);
clickWithoutFiringAction(jb);
}
public static void clickWithoutFiringAction(JButton button){
Dimension size = button.getSize();
ButtonModel model = button.getModel();
//I tried changing these combinations but I could not get the desired effect
model.setArmed(true);
model.setPressed(true);
button.paintImmediately(new Rectangle(0,0, size.width, size.height));
try {
Thread.sleep(68);
} catch(InterruptedException ie) {
}
model.setPressed(false);
model.setArmed(false);
}
}
JButton使用DefaultButtonModel,该模型使用fireActionPerformedActionEvent e函数设置PressedBoolean函数来生成操作执行事件。您需要扩展此模型,并为setPressedBooleanB函数提供自定义实现,以避免触发操作事件。有关更多详细信息,请参阅此模型类的源代码
class CustomModel extends DefaultButtonModel
{
@Override
public void setPressed(boolean b){
if((isPressed() == b) || !isEnabled()) {
return;
}
if (b) {
stateMask |= PRESSED;
} else {
stateMask &= ~PRESSED;
}
fireStateChanged();
}
}
现在,您可以设置模型:jButton.setmodelnewcustommodel JButton使用DefaultButtonModel,该模型使用fireActionPerformedActionEvent e函数设置PressedBoolean函数来生成操作执行事件。您需要扩展此模型,并为setPressedBooleanB函数提供自定义实现,以避免触发操作事件。有关更多详细信息,请参阅此模型类的源代码
class CustomModel extends DefaultButtonModel
{
@Override
public void setPressed(boolean b){
if((isPressed() == b) || !isEnabled()) {
return;
}
if (b) {
stateMask |= PRESSED;
} else {
stateMask &= ~PRESSED;
}
fireStateChanged();
}
}
现在,您可以设置模型:jButton.setmodelnewcustommodel 嘿,我没有仔细阅读,就像Sage写的那样,您必须提供setPressed的自定义实现 你的例子很好用。由于model.setPressedtrue;和model.setPressedfalse;很短,只有680亿先令。增加线程睡眠的价值;几秒钟,你就会看到效果
model.setArmed(true);
model.setPressed(true);
button.paintImmediately(new Rectangle(0,0, size.width, size.height));
try {
Thread.sleep(68); // to short delay.
} catch(InterruptedException ie) {
}
model.setPressed(false);
model.setArmed(false);
呵呵,我并没有仔细阅读,就像Sage写的那个样,你们必须提供setPressed的自定义实现 你的例子很好用。由于model.setPressedtrue;和model.setPressedfalse;很短,只有680亿先令。增加线程睡眠的价值;几秒钟,你就会看到效果
model.setArmed(true);
model.setPressed(true);
button.paintImmediately(new Rectangle(0,0, size.width, size.height));
try {
Thread.sleep(68); // to short delay.
} catch(InterruptedException ie) {
}
model.setPressed(false);
model.setArmed(false);
如果希望通过左键单击JButton来使用操作侦听器,并且希望在不左键单击JButton的情况下执行该操作,则需要编写一个单独的公共方法来执行该操作 就像使用clickWithoutFiringAction方法一样 现在,您的操作侦听器所要做的就是执行单独的公共方法
final JButton jb = new JButton("Test Button");
jb.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
clickWithoutFiringAction(jb);
}
});
如果希望通过左键单击JButton来使用操作侦听器,并且希望在不左键单击JButton的情况下执行该操作,则需要编写一个单独的公共方法来执行该操作 就像使用clickWithoutFiringAction方法一样 现在,您的操作侦听器所要做的就是执行单独的公共方法
final JButton jb = new JButton("Test Button");
jb.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
clickWithoutFiringAction(jb);
}
});
那个么点击按钮你们想要什么样的活动?我不想要任何活动。只是让gui看起来像被按下了一样。删除jb.addActionListenernew ActionListener{};删除actionListener不是一个选项。虽然正如我所说的,我已经使用doClick删除了所有的文件,然后再次添加它们。我觉得一定有更好的方法。意思是你想让它看起来像被按下了一样,但按下了键盘的键?那么你想在点击按钮时进行什么样的活动?我不想要任何活动。只是让gui看起来像被按下了一样。删除jb.addActionListenernew ActionListener{};删除actionListener不是一个选项。虽然正如我所说的,我已经使用doClick删除了所有的文件,然后再次添加它们。我觉得一定有更好的方法。就是说你想让它看起来像被按下了一样,但按下了键盘?