【发布时间】:2019-06-12 02:42:43
【问题描述】:
我正在制作一个琐事游戏。当用户点击屏幕上的流派按钮来回答问题时,会弹出另一个窗口,其中包含问题和 4 个 jbuttons 作为可能的答案。我尝试对其进行编程,当点击正确的选项时,积分将被添加到用户的分数中,如果点击了不正确的选项,他们将失去生命,但它不起作用。
我制作了一个按钮处理程序,当他们点击一个流派时,它会打开一个带有 4 个选项的问题。在此之下,我放了一个 if else if 语句。如果点击正确的答案,给用户积分,否则,如果它不正确,带走一条生命。
private static class ButtonHandler implements ActionListener
{
public void actionPerformed (ActionEvent e)
{
if (e.getSource () == btnT1)
{
frame2.setVisible (true);
btnT1.setEnabled (false);
qTitle.setText ("Solar energy generates electricity from what source?");
a1.setText ("The water");
a2.setText ("The sun");
a3.setText ("Fossil fuels");
a4.setText ("The wind");
if (e.getSource () == a2)
{
score = score + 100;
frame2.setVisible (false);
}
else if (e.getSource () != a2)
{
lives = lives - 1;
frame2.setVisible (false);
}
}
我想增加分数并夺走生命,但它不起作用。你能帮我让它工作吗?感谢所有帮助,谢谢。
此外,此代码也可能有助于解决问题。这些都是面板、按钮、动作监听器等等。
private static void guiApp ()
{
ButtonHandler onClick = new ButtonHandler (); // calls on ButtonHandler class
// Creating JPanels
JPanel gameBoard = new JPanel ();
JPanel titlePanel = new JPanel ();
JPanel bottomPanel = new JPanel ();
gameBoard.setLayout (new GridLayout (4, 5, 4, 4));
titlePanel.setLayout (new BoxLayout (titlePanel, BoxLayout.PAGE_AXIS));
bottomPanel.setLayout (new BoxLayout (bottomPanel, BoxLayout.PAGE_AXIS));
JFrame frame = new JFrame ("Trivia Game");
frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
// To monitor button clicks
btnT1.addActionListener (onClick);
btnT2.addActionListener (onClick);
btnT3.addActionListener (onClick);
btnS1.addActionListener (onClick);
btnS2.addActionListener (onClick);
btnS3.addActionListener (onClick);
btnF1.addActionListener (onClick);
btnF2.addActionListener (onClick);
btnF3.addActionListener (onClick);
btnM1.addActionListener (onClick);
btnM2.addActionListener (onClick);
btnM3.addActionListener (onClick);
btnG1.addActionListener (onClick);
btnG2.addActionListener (onClick);
btnG3.addActionListener (onClick);
// Formatting widgets
Font titleFont = new Font ("Forte", Font.BOLD, 36);
title.setFont (titleFont);
title.setHorizontalAlignment (title.CENTER);
tech.setHorizontalAlignment (tech.CENTER);
sports.setHorizontalAlignment (sports.CENTER);
food.setHorizontalAlignment (food.CENTER);
movies.setHorizontalAlignment (movies.CENTER);
geo.setHorizontalAlignment (geo.CENTER);
titlePanel.add (title);
// Adds buttons to panel
gameBoard.add (tech);
gameBoard.add (sports);
gameBoard.add (food);
gameBoard.add (movies);
gameBoard.add (geo);
gameBoard.add (btnT1);
gameBoard.add (btnS1);
gameBoard.add (btnF1);
gameBoard.add (btnM1);
gameBoard.add (btnG1);
gameBoard.add (btnT2);
gameBoard.add (btnS2);
gameBoard.add (btnF2);
gameBoard.add (btnM2);
gameBoard.add (btnG2);
gameBoard.add (btnT3);
gameBoard.add (btnS3);
gameBoard.add (btnF3);
gameBoard.add (btnM3);
gameBoard.add (btnG3);
bottomPanel.add (scoreText);
bottomPanel.add (livesText);
//Get the frame's content pane
Container contentPane = frame.getContentPane ();
// add panel to frame
contentPane.add (gameBoard, BorderLayout.CENTER);
contentPane.add (titlePanel, BorderLayout.NORTH);
contentPane.add (bottomPanel, BorderLayout.SOUTH);
//size the window.
frame.setSize (550, 500);
frame.setVisible (true);
// Questions window
JPanel qPanel = new JPanel ();
qPanel.setLayout(new BoxLayout(qPanel,BoxLayout.PAGE_AXIS));
JFrame frame2 = new JFrame ("Question");
frame2.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
a1.addActionListener (onClick);
a2.addActionListener (onClick);
a3.addActionListener (onClick);
a4.addActionListener (onClick);
qPanel.add (qTitle);
qPanel.add (a1);
qPanel.add (a2);
qPanel.add (a3);
qPanel.add (a4);
Container contentPane2 = frame2.getContentPane ();
contentPane2.add (qPanel);
//size the window.
frame2.setSize (500, 200);
frame2.setVisible (false);
//Results Window
JPanel resultsPanel = new JPanel ();
JPanel rBottomPanel = new JPanel ();
resultsPanel.setLayout(new BorderLayout());
rBottomPanel.setLayout (new BoxLayout (rBottomPanel, BoxLayout.LINE_AXIS));
JFrame frame3 = new JFrame ("Results");
frame3.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
resultsPanel.add (resultsMessage, BorderLayout.NORTH);
rBottomPanel.add (reset, BorderLayout.SOUTH);
rBottomPanel.add (exit, BorderLayout.SOUTH);
Container contentPane3 = frame3.getContentPane ();
contentPane3.add (resultsPanel);
contentPane3.add (rBottomPanel, BorderLayout.SOUTH);
//size the window.
frame3.setSize (400, 300);
frame3.setVisible (false);
}
【问题讨论】:
-
1.通过巧妙地使用数组、集合和循环,可以减少很多重复代码。 2. 这样做可以使你的代码更容易调试。 3. 如果您需要我们帮助找出代码无法正常工作的原因,最好在您的问题中创建并发布一个有效的minimal reproducible example / minimal reproducible example 程序。否则我们真的无法测试这段代码。
-
当你的监听器被激活时,源是
btnT1。在用户有时间与新问题进行交互之前,它不会神奇地更改为 a1、a2 或 a3,因此按钮侦听器实际上没有多大意义。 -
这就像您在问用户是否在用户有机会做出选择之前做出了正确的选择。
标签: java swing variables jbutton actionlistener