开发者

Fast Jbutton clicks results in no action

开发者 https://www.devze.com 2023-03-08 09:39 出处:网络
Hey guys, I have a problem with a code that I\'ve been writing. I have a JFrame that contains two buttons. Each of these buttons has an action. The problem I\'m having is with a JButton called \"btn

Hey guys, I have a problem with a code that I've been writing.

I have a JFrame that contains two buttons. Each of these buttons has an action. The problem I'm having is with a JButton called "btnDone" that's supposed to get back to a previous screen. If I I keep pushing the button repeatedly, eventually the "btnDone" would stop doing the logic it's supposed to do. My code is as follows:

For the frame:

public class ItemLocatorPnl extends JPnl
{
    private static final long serialVersionUID = 1L;
    private Pnl pnl;
    private JButton btnDone;
    private JButton btnRefreshData;

    public void setPnl(Pnl pnl) {
        this.pnl = pnl;
    }

    public ItemLocatorPnl(Pnl pnl)
    {
        super();

        this.pnl=pnl;
        initialize();   
    }


    private void initialize()
    {
        this.setSize(300, 200);

        JPanel jContentPane = new JPanel();
        jContentPane.setLayout(new MigLayout());

        // (1) Remove window frame
        setUndecorated(true);


        // (3) Set background to white
        jContentPane.setBackground(Color.white);


        // (5) Add components to the JPnl's contentPane
        POSLoggers.initLog.writeDebug("ItemLocator: Adding icon");
        jContentPane.add(wmIconLabel, "align left");
        POSLoggers.initLog.writeDebug("ItemLocator: Adding global controls");
        jContentPane.add(createUpperPanel(), "align right, wrap");
        POSLoggers.initLog.writeDebug("ItemLocator: Adding main panel");
        jContentPane.add(pnl,"width 100%,height 100%, span 3");

        // (6) Attach the content pane to the JPnl
        this.setContentPane(jContentPane);

    }

    private JPanel createUpperPanel()
    {
        JPanel upperPanel=new JPanel();


        MigLayout mig = new MigLayout("align right", "", "");
        upperPanel.setLayout(mig);
        upperPanel.setBackground(Color.WHITE);


        // Create the Done button
        btnDone= GraphicalUtilities.getPOSButton("<html><center>Done</center></html>");
        btnDone.addActionListener(new ButtonListener());

        // Create the Refresh Data button
        btnRefreshData = GraphicalUtilities.getPOSButton("<html><center>Refresh<br>Data</center></html>");
        btnRefreshData.addActionListener(new ButtonListener()); 

        //Addiing buttons to the Panel
        upperPanel.add(btnRefreshData, "width 100:170:200, height 100!");
        upperPanel.add(btnDone, "width 100:170:200, height 100!");

        return upperPanel;

    }

    public class ButtonListener implements ActionListener {

        public void actionPerformed(ActionEvent e) {

            try {
                if (e.getSource() == btnRefreshData) {

                    Actual.refreshData();
                } else if (e.getSource() == btnDone) {
               开发者_JAVA技巧     Actual.backToMainScreen();

                }
            }
            catch (Exception ex)
            {

            }
        }

    }

}

This is the method that the btnDone button calls upon clicking:

public static void backToMainScreen()
{

    frame.setVisible(false);
    frame.dispose();
}

This is the code that displays the JFrame:

public static void displayItemLocatorFrame()
{
    pnl = new Pnl();
    frame = new Frame(pnl);

    frame.setVisible(true);
    pnl.getSearchCriteria().requestFocus();

}

Please note that the "frame" object is static, and all of my methods are static, and they exist in a static class called Actual.

So in short, I just want to make sure that no matter how many times a user clicks on the button, and no matter how fast the clicks were, the frame should act normally. Any suggestions? (I tried synchronizing my methods with no luck..)


I would generally prefer to use an Action for what you're trying to do.

So your code might look like this:

btnDone = new JButton(new CloseFrameAction());

...

private class CloseFrameAction extends AbstractAction
{
    public CloseFrameAction()
    {
         super("Done");
    }

    public void actionPerformed(ActionEvent e) 
    {
        frame.dispose();
        setEnabled(false);
    }
}

Notice the setEnabled(false) line - this should disable the button and prevent the user clicking on it again. Obviously I don't know what your exact requirements are but this is the general approach I would take.


The problem was with using a static panel that was instantiated with the click of the button each time. Removing "static" has finally fixed my problem! Thanks everyone for the help.

0

精彩评论

暂无评论...
验证码 换一张
取 消