快速Jbutton单击结果不执行任何操作

时间:2011-05-24 07:24:37

标签: java swing jbutton actionlistener

嘿伙计们,我在编写代码时遇到了问题。

我有一个包含两个按钮的JFrame。每个按钮都有一个动作。我遇到的问题是JButton被称为"btnDone",它应该回到之前的屏幕。如果我继续反复按下按钮,最终"btnDone"将停止执行它应该执行的逻辑。我的代码如下:

对于框架:

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) {
                    Actual.backToMainScreen();

                }
            }
            catch (Exception ex)
            {

            }
        }

    }

}

这是btnDone按钮在点击时调用的方法:

public static void backToMainScreen()
{

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

这是显示JFrame

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

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

}

请注意,“frame”对象是静态的,我的所有方法都是静态的,它们存在于名为Actual的静态类中。

简而言之,我只想确保无论用户点击按钮多少次,无论点击速度有多快,框架都应该正常运行。 有什么建议? (我尝试同步我的方法没有运气..)

2 个答案:

答案 0 :(得分:1)

我通常更愿意使用Action来做你想做的事情。

所以你的代码可能如下所示:

btnDone = new JButton(new CloseFrameAction());

...

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

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

注意setEnabled(false)行 - 这应禁用该按钮并阻止用户再次单击它。显然我不知道你的确切要求是什么,但这是我将采取的一般方法。

答案 1 :(得分:0)

问题在于使用每次单击按钮实例化的静态面板。删除“静态”终于解决了我的问题!谢谢大家的帮助。