如何让Gui实际上提示对话框?

时间:2014-10-09 03:39:36

标签: java swing user-interface input user-input

所以我试图理解在Java中使用Gui并通过猜测数字游戏来实现这一点。它编译正确,但是当我运行程序时它只显示框架"祝贺你赢了!"在顶部。我的主要问题是为什么对话框根本没有弹出,我应该怎么做才能解决这个问题。在相关的说明中,当我将代码作为JOptionPane.showInputDialog(this,"Play again? Y/N")时,我得到了错误消息"非静态变量,这不能从静态上下文引用。"我的次要问题,也是一个不太重要的问题,就是如何使信息垂直和水平地位于框的中心。

    import javax.swing.*;
    import java.awt.*;
    import java.util.Scanner;

    public class RandomNumberGame{
            public static JLabel higherThan;
            public static JPanel tooHigh;
            public static JLabel lowerThan;
            public static JPanel tooLow;
            public static JPanel exactlyCorrect;
            public static JLabel correctAnswer;
            public static JFrame guiFrame;
        public static void main(String[] args){
            RandomFun();
            }
        public static void RandomFun()
        {
            Scanner input=new Scanner(System.in);
            guiFrame = new JFrame();


            guiFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            guiFrame.setTitle("Fun Games!");
            guiFrame.setSize(500,500);
            guiFrame.setLocationRelativeTo(null);
            guiFrame.setVisible(true);      


            final JPanel tooHigh = new JPanel();
                 higherThan = new JLabel("Too High!");
            final JPanel tooLow = new JPanel();
                 lowerThan  = new JLabel("Too Low!");
            final JPanel exactlyCorrect = new JPanel();
                 correctAnswer = new JLabel("Congratulations, you won!");

            tooHigh.add(higherThan);
            tooLow.add(lowerThan);
            exactlyCorrect.add(correctAnswer);
            guiFrame.add(tooHigh, BorderLayout.CENTER);
            guiFrame.add(tooLow, BorderLayout.CENTER);
            guiFrame.add(exactlyCorrect, BorderLayout.CENTER);
            }
        public static void GuessNumber(){
            String again;
            String lastGuess = "0";
            boolean moreGame=true;
            int lastGuessInt = Integer.parseInt(lastGuess.toString());
            int winner = (int) (Math.random()*999+1);
            while(moreGame){
                lastGuess = JOptionPane.showInputDialog("Guess a Number");
                    if(winner < lastGuessInt){
                        tooHigh.setVisible(true);
                        tooLow.setVisible(false);
                        exactlyCorrect.setVisible(false);
                        }
                    else if(winner > lastGuessInt){
                        tooHigh.setVisible(false);
                        tooLow.setVisible(true);
                        exactlyCorrect.setVisible(false);
                        }
                    else{
                        tooHigh.setVisible(false);
                        tooLow.setVisible(false);
                        exactlyCorrect.setVisible(true);
                        moreGame=false;
                        }
            }
                    again = JOptionPane.showInputDialog("Play again? Y/N");
            switch(again){
                case "y": case "Y":
                    GuessNumber();
                    break;
                case "n": case "N":
                    System.exit(0);
                    break;
                }                   
            }
        }

1 个答案:

答案 0 :(得分:2)

为什么&#34;错误行为&#34;:

  • 您的主要方法是RandomFun()
  • 然后RandomFun()创建一个JFrame并显示。
  • 它在BorderLayout.CENTER位置添加了3个JPAnels all
  • 因此,只有最后一个JPanel会显示,因为它将覆盖所有以前添加的JPanels,这符合BorderLayout记录的行为。
  • 因此,您的代码的行为完全符合您的预期。
  • 其他问题包括静态过度使用静态修饰符,在添加所有组件之前调用JFrame 上的setVisible(true),设置JFrame的大小,创建方法{{ 1}}永远不会被可行的运行代码调用,代码不遵循Java命名conventinons(方法和字段应以小写字母开头,带大写字母的类),...

如果我在你的位置,我会把GUI编码放在一边,因为我首先要集中精力学习Java基础知识,包括避免所有静态方法和字段,而是创建真正的OOP-兼容类,因为在深入研究GUI编码之前,这种理解是至关重要的。只需几周的学习就足以让你足够强大,然后尝试一些Swing编码。


我尝试制作猜谜游戏程序:

GuessNumber()