Java - 事件关闭窗口

时间:2016-01-24 18:10:10

标签: java swing jframe jbutton

互联网的人。

我想为我正在写的游戏设置一种启动画面。到目前为止,它为4个玩家中的每一个提供了4个按钮,这些按钮在点击时从红色变为绿色,反之亦然,如果有意义则代表他们个人的“准备”状态。我使用了JFrame和JButtons。

现在我希望该窗口关闭,如果每个按钮当前都设置为“ready”又名button.getBackground()== Color.GREEN。

由于我对Windowclosing on Event的研究没有为我带来太大的帮助,因此我非常感谢您对此/实现提示/代码片段使用哪些EventListeners的建议。

提前感谢您和问候。

1 个答案:

答案 0 :(得分:1)

由于您正在等待并按下按钮,因此最合乎逻辑的侦听器将是ActionListener。

考虑制作按钮JToggleButtons,然后在你的监听器中查询每个按钮以查看它是否被选中(isSelected()),如果是,则启动你的程序。作为一个侧面,我考虑将介绍窗口设置为JDialog而不是JFrame,或者将其设置为JPanel并在必要时通过CardLayout将其交换出来。

例如:

import java.awt.Color;
import java.awt.Dialog.ModalityType;
import java.awt.Dimension;
import java.awt.Window;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;
import javax.swing.*;

public class AreWeReady extends JPanel {
    List<AbstractButton> buttons = new ArrayList<>();
    private int userCount;

    public AreWeReady(int userCount) {
        this.userCount = userCount;
        ButtonListener buttonListener = new ButtonListener();
        for (int i = 0; i < userCount; i++) {
            JButton btn = new JButton("User " + (i + 1));
            buttons.add(btn);
            btn.addActionListener(buttonListener);
            add(btn);
        }
    }

    private class ButtonListener implements ActionListener {
        @Override
        public void actionPerformed(ActionEvent e) {
            AbstractButton btn = (AbstractButton) e.getSource();
            Color c = Color.GREEN.equals(btn.getBackground()) ? null : Color.GREEN;
            btn.setBackground(c);

            for (AbstractButton button : buttons) {
                if (!Color.GREEN.equals(button.getBackground())) {
                    // if any button does not have a green background
                    return;    // leave this method
                }
            }

            // otherwise if all are green, we're here
            Window win = SwingUtilities.getWindowAncestor(btn);
            win.dispose();
            // else launch your gui
        }
    }

    private static void createAndShowGui() {
        int userCount = 4;
        AreWeReady areWeReadyPanel = new AreWeReady(userCount);

        JFrame frame = new JFrame("Main Application");
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.getContentPane().add(Box.createRigidArea(new Dimension(400, 300)));
        frame.pack();
        frame.setLocationByPlatform(true);

        JDialog dialog = new JDialog(frame, "Are We Ready?", ModalityType.APPLICATION_MODAL);
        dialog.add(areWeReadyPanel);
        dialog.pack();
        dialog.setLocationByPlatform(true);
        dialog.setVisible(true);

        // this is only reached when the modal dialog above is no longer visible
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGui();
            }
        });
    }
}