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)提到了code>。但如果我不单击按钮,它将关闭
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);
}