Java JButton:在不触发动作的情况下模拟JButton按键

Java JButton:在不触发动作的情况下模拟JButton按键,java,swing,jbutton,Java,Swing,Jbutton,我的用例是,我有一些JButton可以向ActionListener触发动作。我还使用按键向AcionListener发出一些相同的操作命令。当击键快捷方式触发一个操作时,该操作也是由其中一个按钮执行的,我希望该按钮看起来像是被按下的,但不是触发事件 因此,我研究了AbstractButtonAPI,并尝试了一些方法,如setSelected,但没有达到预期效果。最后,我查看了doCLick方法,看看是否可以使用删除动作触发部分,但这也不起作用 367 public void do

我的用例是,我有一些JButton可以向ActionListener触发动作。我还使用按键向AcionListener发出一些相同的操作命令。当击键快捷方式触发一个操作时,该操作也是由其中一个按钮执行的,我希望该按钮看起来像是被按下的,但不是触发事件

因此,我研究了AbstractButtonAPI,并尝试了一些方法,如setSelected,但没有达到预期效果。最后,我查看了doCLick方法,看看是否可以使用删除动作触发部分,但这也不起作用

 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删除了所有的文件,然后再次添加它们。我觉得一定有更好的方法。就是说你想让它看起来像被按下了一样,但按下了键盘?