嘿伙计们,我在编写代码时遇到了问题。
我有一个包含两个按钮的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
的静态类中。
简而言之,我只想确保无论用户点击按钮多少次,无论点击速度有多快,框架都应该正常运行。 有什么建议? (我尝试同步我的方法没有运气..)
答案 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)
问题在于使用每次单击按钮实例化的静态面板。删除“静态”终于解决了我的问题!谢谢大家的帮助。