简体   繁体   中英

Dynamically change jButton icon

I have a program that detects when certain machines are online and creates a button with a green "online" icon to show this. I want to add the functionality to check periodically if this machine is still online, and if it's not, change the icon to the "offline" icon that I've already defined.

I know how to set the icon, however I can't figure out a way to do it once the button has already been displayed

probably you have issues with Concurency in Swing , that means that all Swing code must be done on EDT

then you have to wrap myButton.setIcon(myIcon) to the invokeLater() , for example

SwingUtilities.invokeLater(new Runnable() {

    @Override
    public void run() {
        myButton.setIcon(myIcon);
    }
});

I have a program that detects when certain machines are online and creates a button with a green "online" icon to show this.

Use a JToggleButton instead, as shown here 1 & here 2 .

I can't figure out a way to do it once the button has already been displayed.

To toggle the state and fire an action event doClick() or alternately setSelected(boolean) .

Screenshots

You should be able to do so using AbstractButton.setIcon() . It may require you to call invalidate() on the button to get the change displayed.

changeButton = new JButton(icon1);
changeButton.addActionListener(
    new ActionListener( )
    {
        private boolean flag = true;

        @Override
        public void actionPerformed( ActionEvent arg0 )
        {
            changeButton.setIcon( flag ? icon2 : icon1 );
            flag = !flag;
        }
    }
);
add(changeButton);
btn1.setIcon(new javax.swing.ImageIcon(getClass().getResource("/url.png")));

you can add an action listener on the button, then in its called function change the icon - here is an example :

public yourDialogSwing() {

        Yourbutton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                onButtonPressed();
            }
        });
}

private void onButtonPressed() {
       YourButton.setIcon(YourButton.getPressedIcon());
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM