Java 使用jbutton设置值,然后确认值?

Java 使用jbutton设置值,然后确认值?,java,swing,jframe,awt,jbutton,Java,Swing,Jframe,Awt,Jbutton,我正在写一个软件,可以测试用户的音乐笔记,不过我不会透露音乐的细节。由于我的程序相当大,我写了一个单独的程序作为概念证明并解决我的问题 简单的程序应该是这样工作的:在main方法中,随机选择一个数字(1或2)。该数字设置为GUI中jlabel中的文本。然后用户按下两个数字按钮中的一个。然后,用户必须按另一个jbutton以确认其选择。主要方法是比较问题和答案变量。如果数字相等,jlabel中的文字将变为“正确”。否则将变为“不正确”。然后,用户必须按第四个jbutton以获得下一个问题。然后重复

我正在写一个软件,可以测试用户的音乐笔记,不过我不会透露音乐的细节。由于我的程序相当大,我写了一个单独的程序作为概念证明并解决我的问题

简单的程序应该是这样工作的:在main方法中,随机选择一个数字(1或2)。该数字设置为GUI中jlabel中的文本。然后用户按下两个数字按钮中的一个。然后,用户必须按另一个jbutton以确认其选择。主要方法是比较问题和答案变量。如果数字相等,jlabel中的文字将变为“正确”。否则将变为“不正确”。然后,用户必须按第四个jbutton以获得下一个问题。然后重复该方法,用户应该能够做他们想要的任何练习

包含main方法的测试类

package test;
import java.util.Random;

public class Test {
    protected static int question;
    protected static int answer;
    protected static boolean next = false;
    protected static boolean sure = false;
    protected static boolean exit = false;
    protected static Random random = new Random();
    public static void main(String[] args) {
        GUI.gUI();
        while(!exit){//while
            question = random.nextInt(2) + 1;
            GUI.lblNewLabel.setText("" + question);
            while(!next){//next
                while(!sure) {//sure
                    answer = Other.other();
                }//sure
                sure = false;
                if(question == answer) {
                    GUI.lblNewLabel.setText("correct");
                }
                else {
                    GUI.lblNewLabel.setText("incorrect");
                }
            }//next
            next = false;
        }//exit
    }
}
我的GUI

package test;

import java.awt.EventQueue;
import javax.swing.*;
import javax.swing.border.*;
import java.awt.event.*;

public class GUI extends JFrame {
    private static final long serialVersionUID = 1L;
    protected static int answerGUI;

    protected static JLabel lblNewLabel = new JLabel("New label");

    private JPanel contentPane;

    /**
     * Launch the application.
     */
    public static void gUI() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    GUI frame = new GUI();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the frame.
     */
    public GUI() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 450, 300);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);
        contentPane.setLayout(null);
        BTNListener btnlistener = new BTNListener();

        lblNewLabel.setBounds(39, 25, 46, 14);
        contentPane.add(lblNewLabel);

        JButton btn1 = new JButton("No. 1");
        btn1.setBounds(39, 158, 89, 23);
        contentPane.add(btn1);
        btn1.addActionListener(btnlistener);

        JButton btn2 = new JButton("No. 2");
        btn2.setBounds(157, 157, 89, 23);
        contentPane.add(btn2);
        btn2.addActionListener(btnlistener);

        JButton btnAreYouSure = new JButton("Are you sure?");
        btnAreYouSure.setBounds(38, 197, 99, 23);
        contentPane.add(btnAreYouSure);
        btnAreYouSure.addActionListener(btnlistener);

        JButton btnNext = new JButton("Next");
        btnNext.setBounds(159, 197, 89, 23);
        contentPane.add(btnNext);
        btnNext.addActionListener(btnlistener);

        JButton btnExit = new JButton("Exit");
        btnExit.setBounds(269, 198, 89, 23);
        contentPane.add(btnExit);
        btnExit.addActionListener(btnlistener);
    }
    protected class BTNListener implements ActionListener{
        @Override
        public void actionPerformed(ActionEvent e) {
            if(e.getActionCommand() == "No. 1") {
                Other.answer = 1;
            }
            else if(e.getActionCommand() == "No. 2") {
                Other.answer = 2;
            }
            if(e.getActionCommand() == "Are you sure?") {
                Test.sure = true;
            }
            if(e.getActionCommand() == "Next") {
                Test.next = true;
            }
            if(e.getActionCommand() == "Exit") {
                Test.exit = true;
            }
        }
    }
}
我的另一节课

package test;

public class Other {
    protected static int answer;
    protected static int other() {
        return answer;
    }
}
我决定需要另一个类,以便main方法有另一个方法作为序列的一部分进行调用,尽管我认为这个方法可以在GUI中编写

我加入确认按钮的原因之一是,在第一次通过后,另一个类中的answer变量已经有了一个值,因此在第二次通过时,该值会立即传递给Test中的answer变量,用户无法更改该值


现在编写程序时,jlabel会显示问题值,并且所有按钮按下似乎都没有任何作用。我试着用do…while循环代替,在无限循环之前它只运行了一次,不允许用户回答。

发布的代码有太多问题,所以我完全重写了它。 为了实现它,我使用了一个简化的

为了方便和简单,可以将以下代码复制粘贴到一个名为MVC_Controller.java的文件中,然后运行。 请注意代码中的许多注释

import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.Label;
import java.util.Random;
import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.JToggleButton;
import javax.swing.SwingUtilities;

/*The controller process the user requests.
 * It listeners that are called when the View detects a user interaction.
 * Based on the user action, the Controller calls methods in the View and Model
 * to accomplish the requested action.
 */
class MVC_Controller{

    private MVC_Model model;
    private MVC_View view;

    MVC_Controller(MVC_View view,MVC_Model model) {
      this.model=model;
      this.view=view;
      //observe view buttons
      view.getConfirmationButton().addActionListener(e -> confirmationButtonPressed());
      view.getNextButton().addActionListener(e -> setNewQuestion());
      setNewQuestion(); //initialize view with a question
      view.setVisible();
    }
    //respond to confirmation button click
    private void confirmationButtonPressed() {
        model.setAnswer(view.getAnswer());
        if(model.isCorrectAnswer()) {
            view.setInfo("Well done !");
        }else {
            view.setInfo("Wrong answer !");
        }
    }
    //respond to next button click
    private void setNewQuestion() {
        view.clear();
        model.newQuestion();
        view.setInfo("Select button ");
        view.updateFromModel();
    }

    /*In practice you would probably want to have this in a
     * Separate Main class
     */
    public static void main(String[] args) {

        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                MVC_Model model = new MVC_Model();
                MVC_View  view  = new MVC_View(model);
                new MVC_Controller(view, model);
            }
        });
    }
}

/*Model contains the information for the view and information from the view
 * as well as the logic.
 * The model is independent of the user interface.
 */
class MVC_Model {

    private int question,answer = 0;
    private Random rnd = new Random();

    MVC_Model() {
        newQuestion();
    }

    //set question to 1 or 2.
    void newQuestion() {
        question = (rnd.nextInt(99) > 49)  ? 2 : 1 ;
        answer = 0;
    }

    int getQuestion() { return question;}
    int getAnswer()   { return answer;  }
    void setQuestion(int question) { this.question = question; }
    void setAnswer(int answer)     { this.answer = answer;     }
    boolean isCorrectAnswer()    { return question == answer;  }
}

/*View only contains the user interface part*/
class MVC_View {

    private MVC_Model model;
    private JTextField question = new JTextField(2);
    private JToggleButton button1 = new JToggleButton("1"); //on - off toggle buttons
    private JToggleButton button2 = new JToggleButton("2");
    private JButton confirm = new JButton("Confirm");
    private JButton next = new JButton("Next");
    private JLabel info = new JLabel();
    private JFrame frame;

    MVC_View(MVC_Model model){
        this.model = model;

        ButtonGroup bGroup = new ButtonGroup();   //add buttons to group so
        bGroup.add(button1);bGroup.add(button2);  //only one can be selected

        JPanel topPanel = new JPanel(); //uses FlowLayout by default. Do not use null layouts
        //add components to top panel
        topPanel.add(new Label("Question: ")); //add a label to indicate question
        topPanel.add(question); topPanel.add(button1);  topPanel.add(button2);
        topPanel.add(confirm); topPanel.add(next);

        JPanel bottomPanel = new JPanel();
        bottomPanel.setLayout(new FlowLayout(FlowLayout.LEFT, 5, 0)); //set layout manager to left align
        bottomPanel.add(new Label("Information: ")); //add a label to indicate information
        bottomPanel.add(info);
        frame = new JFrame("MVC Model Demo");
        frame.add(topPanel, BorderLayout.NORTH); //uses BorderLayout by default
        frame.add(bottomPanel, BorderLayout.SOUTH); //uses BorderLayout by default
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
    }

    void setInfo(String text)       { info.setText(text); }
    JButton getConfirmationButton() { return confirm; }
    JButton getNextButton()         { return next; }
    int getAnswer() {
        if(button1.isSelected()) {
            return 1;
        }else if (button2.isSelected()){
            return 2;
        }
        return 0; //no button is selected
    }
    //rest all gui
    void clear() {
        button1.setSelected(false);
        button2.setSelected(false);
        question.setText("");
        info.setText("");
    }

    //update view from model
    void updateFromModel() {
        question.setText(String.valueOf(model.getQuestion()));
    }

    void setVisible() { frame.setVisible(true); }
}

欢迎来到SO。“不起作用”太宽泛了。请准确描述你得到的与你期望的相比。此外,代码似乎太长,无法演示问题。请参阅:当您请求帮助时,请做出必要的努力。否则你会浪费你的时间,也会浪费我们的时间。MCVE不仅是关于M,而且是关于C。发布的代码甚至不编译。我已经删除了伪代码并还原了原始代码。非常感谢,我真的很感激。