Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JFrame正在丢失其结构,并在单击按钮后查看大小调整_Java_Swing_Jframe - Fatal编程技术网

Java JFrame正在丢失其结构,并在单击按钮后查看大小调整

Java JFrame正在丢失其结构,并在单击按钮后查看大小调整,java,swing,jframe,Java,Swing,Jframe,我有以下代码,可以在单击按钮时运行一个简单的数字猜测程序: public class test3 implements ActionListener { public void create() { Dimension s=new Dimension(400,400); JFrame l=new JFrame(); l.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); l.setSize(s); l.set

我有以下代码,可以在单击按钮时运行一个简单的数字猜测程序:

public class test3 implements ActionListener {

public void create()
{
    Dimension s=new Dimension(400,400);
    JFrame l=new JFrame();

    l.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    l.setSize(s);
    l.setResizable(true);
    Dimension s1=new Dimension(400,200);

    JPanel me=new JPanel(); 
    JPanel ne=new JPanel();

    JLabel kingsman=new JLabel ("GUESS THE KING'S NUMBER!");
    kingsman.setFont(new Font("Serif", Font.BOLD, 45));

    JPanel common=new JPanel();
    BoxLayout n1=new BoxLayout(common,1);
    common.setLayout(n1);

    JButton p=new JButton("START"); 
    p.setFont(new Font("Serif", Font.BOLD, 40));
    p.setPreferredSize(s1);
    //l.add(p);
    me.add(kingsman);
    ne.add(p);

    common.add(me);
    common.add(ne);
    l.add(common);
   // l.pack();
    l.setVisible(true);
    p.addActionListener(this); 

}
 public void actionPerformed(ActionEvent e)
    {
        System.out.println("Welcome to Guess the number Game");
        System.out.println("You have 3 chances to guess a number between 0 and 10 excluding 10");
        gamer2 game=new gamer2();
        game.generatenum();
    }
public static void main(String args[])
{
    test3 ob=new test3();
    ob.create();

}

}

但单击按钮后,JFrame会退化:

当点击按钮时,JFrame也拒绝关闭,即使
setDefaultCloseOperation(JFrame.EXIT_ON_close)。但如果我不单击按钮,它将关闭

generatenum
类中的函数
gamer2

void generatenum()
    {
        int ran=(int)(Math.random()*10);
        System.out.println("For developer-no.selected "+ran);
        gamer3 ob1=new gamer3(); //gamer3 takes user input
        ob1.getUserInput(ran);

    }
有人能解释一下到底出了什么问题吗?我一直在试图破解它,但到目前为止什么都帮不了我。 事件处理部分工作正常。单击按钮,
generatenum()
成功运行。其余程序在
Eclipse控制台上运行

  • 我知道JFrame在整个程序执行之前不会关闭,但在这种情况下,程序的其余部分并不依赖于JFrame。它拒绝关闭是因为
    gamer2
    的对象是在只有JFrame存在时才存在的操作处理方法中创建的吗
  • JFrame只是在我调整它的大小时才改变它的外观。调整它的大小会破坏它的外观,但如果按钮还没有点击,这种情况不会发生
gamer3
(接受用户输入):

gamer1

static int trial=0; int result=0; int value=0; String d;
    public void checker(int get,int craze)
    {
        value=get;
        result=craze;
        ++trial;
       if(value==result)
       {
           System.out.println("Successful");
       }
       else 
       {
           System.out.println("wrong entry");
           if(trial<=3)
           {
               int c=3;
               int rem=c-trial;
               System.out.println("You have " +rem+ " chance(s) left!");


            if(trial<3)
            {
                System.out.println("Enter y to play again or n to exit!");
                   System.out.println("D you want to retry?_");
                   InputStreamReader k =new InputStreamReader(System.in);
                   BufferedReader read=new BufferedReader(k);
                    try {
                        d= read.readLine();
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                if(d.equals("y"))
                {
                    d="null";

                    gamer3 mele=new gamer3();
                    mele.getUserInput(result);
                }

            }   


           }



               else
               {
                   System.out.println("you are out of the game.No chances left!");
               }
       }

    }

    }

尝试将
DISPOSE\u ON\u CLOSE
设置为默认关闭操作

还可以尝试实现如下
WindowListener
界面:

public void windowClosed(WindowEvent e){
    System.exit(0);
}

您正在通过尝试从控制台读取用户输入来阻止事件调度线程

这只是一个非常糟糕的想法,请参阅以了解更多详细信息

GUI是事件驱动的环境,也就是说,发生了一些事情,您会对此做出响应。控制台程序在本质上更倾向于线性。把它们混在一起不是个好主意


如果您使用的是GUI,请通过GUI从用户处获取输入。请仔细查看以获取更多详细信息。

您能显示
getUserInput
的代码以及它调用的其他方法吗?是的……我将编辑问题以添加这一点@Sweeper@Sweeper我只对JFrame有一个问题。游戏运行良好,当游戏执行完成时JFrame关闭。但是为什么它在最小化和最大化方面又发生了变化(点击按钮后)?…每次我最小化和最大化时,它的外观都在不断变化。我对java GUI不太熟悉。你能解释一下吗?@MathewsMathai他基本上告诉你将默认关闭操作设置为其他操作。在类声明中添加
实现WindowListener
,并在他的答案中添加方法。好的。明白了。我会试试看。但问题是我的代码到底出了什么问题@Sweeper@BinoyCherian你能解释一下我的代码有什么问题吗?为什么点击按钮后JFrame在最小化时会恶化?…这有点奇怪,我在互联网上的其他任何地方都找不到这个问题。
JFrame.EXIT on\u CLOSE
正是按照你刚才描述的那样做的,但代码要少得多(事实上,这就是它存在的原因。)这与OP的实际问题没有多大关系!我现在明白了。
package test;
public class gamer2 {
int getIt;
//complete generation of the goddamn random number
void generatenum()
{
    int ran=(int)(Math.random()*10);
    System.out.println("For developer-no.selected "+ran);
    gamer3 ob1=new gamer3();
    ob1.getUserInput(ran);

}



public static void main(String[] args) {
System.out.println("Welcome to Guess the number Game");
System.out.println("You have 3 chances to guess a number between 0 and 10 excluding 10");
gamer2 newj=new gamer2();
newj.generatenum();
}

}
public void windowClosed(WindowEvent e){
    System.exit(0);
}