互联网的人。
我想为我正在写的游戏设置一种启动画面。到目前为止,它为4个玩家中的每一个提供了4个按钮,这些按钮在点击时从红色变为绿色,反之亦然,如果有意义则代表他们个人的“准备”状态。我使用了JFrame和JButtons。
现在我希望该窗口关闭,如果每个按钮当前都设置为“ready”又名button.getBackground()== Color.GREEN。
由于我对Windowclosing on Event的研究没有为我带来太大的帮助,因此我非常感谢您对此/实现提示/代码片段使用哪些EventListeners的建议。
提前感谢您和问候。
答案 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();
}
});
}
}