JavaSwing游戏:JFrame未显示

JavaSwing游戏:JFrame未显示,java,swing,jframe,jpanel,Java,Swing,Jframe,Jpanel,我想写一个简单的游戏。我在一切的开始,我的目标是创建一个听我的键盘的盒子。当试图在JPanel中绘制一个方框时,JFrame启动,然后在3秒内关闭。有人能帮忙吗?我迷失在这个Java Swing JFrame、JPanel的情况中 package abbygail; public class Abbygail { public static void main(String[] args) { GUI gui = new GUI(); } } 不同类别: p

我想写一个简单的游戏。我在一切的开始,我的目标是创建一个听我的键盘的盒子。当试图在JPanel中绘制一个方框时,JFrame启动,然后在3秒内关闭。有人能帮忙吗?我迷失在这个Java Swing JFrame、JPanel的情况中

package abbygail;

public class Abbygail {
    public static void main(String[] args) {
        GUI gui = new GUI();
    }

}
不同类别:

package abbygail;

import javax.swing.JFrame;
import javax.swing.JPanel;



public class GUI extends JFrame {



    public GUI(){
        setSize(640, 480);
        setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
        Game_Board brd = new Game_Board();
        setContentPane(brd);
        getContentPane().setLayout(null);


    }
}
package abbygail;

import javax.swing.JPanel;


public class Game_Board extends JPanel{

    public Game_Board(){
        setSize(640, 480);
        Blue_Box blbx = new Blue_Box();
        add(blbx);
    }
}
package abbygail;

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.RenderingHints;
import java.awt.geom.Rectangle2D;
import javax.swing.JPanel;


public class Blue_Box extends JPanel{

  /**
    *
    * @param g
    */
    private Point p1 = new Point(100, 100);
    private Point p2 = new Point(540, 380);

    public Blue_Box(){

    }

    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2d = (Graphics2D) g;
        g2d.setColor(Color.blue);
        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
        g2d.setStroke(new BasicStroke(8,BasicStroke.CAP_ROUND,      BasicStroke.JOIN_BEVEL));
        g2d.draw(new Rectangle2D.Double(p1.x, p1.y, 40, 30));
    }

}
不同类别:

package abbygail;

import javax.swing.JFrame;
import javax.swing.JPanel;



public class GUI extends JFrame {



    public GUI(){
        setSize(640, 480);
        setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
        Game_Board brd = new Game_Board();
        setContentPane(brd);
        getContentPane().setLayout(null);


    }
}
package abbygail;

import javax.swing.JPanel;


public class Game_Board extends JPanel{

    public Game_Board(){
        setSize(640, 480);
        Blue_Box blbx = new Blue_Box();
        add(blbx);
    }
}
package abbygail;

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.RenderingHints;
import java.awt.geom.Rectangle2D;
import javax.swing.JPanel;


public class Blue_Box extends JPanel{

  /**
    *
    * @param g
    */
    private Point p1 = new Point(100, 100);
    private Point p2 = new Point(540, 380);

    public Blue_Box(){

    }

    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2d = (Graphics2D) g;
        g2d.setColor(Color.blue);
        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
        g2d.setStroke(new BasicStroke(8,BasicStroke.CAP_ROUND,      BasicStroke.JOIN_BEVEL));
        g2d.draw(new Rectangle2D.Double(p1.x, p1.y, 40, 30));
    }

}
不同类别:

package abbygail;

import javax.swing.JFrame;
import javax.swing.JPanel;



public class GUI extends JFrame {



    public GUI(){
        setSize(640, 480);
        setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
        Game_Board brd = new Game_Board();
        setContentPane(brd);
        getContentPane().setLayout(null);


    }
}
package abbygail;

import javax.swing.JPanel;


public class Game_Board extends JPanel{

    public Game_Board(){
        setSize(640, 480);
        Blue_Box blbx = new Blue_Box();
        add(blbx);
    }
}
package abbygail;

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.RenderingHints;
import java.awt.geom.Rectangle2D;
import javax.swing.JPanel;


public class Blue_Box extends JPanel{

  /**
    *
    * @param g
    */
    private Point p1 = new Point(100, 100);
    private Point p2 = new Point(540, 380);

    public Blue_Box(){

    }

    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2d = (Graphics2D) g;
        g2d.setColor(Color.blue);
        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
        g2d.setStroke(new BasicStroke(8,BasicStroke.CAP_ROUND,      BasicStroke.JOIN_BEVEL));
        g2d.draw(new Rectangle2D.Double(p1.x, p1.y, 40, 30));
    }

}

您从不调用
setVisible(true)

因此:

另外,关于使用null布局的一个小问题是,尽管null布局和
setBounds()
可能会像创建复杂GUI的最简单和最好的方法一样吸引新手,但您创建的GUI越多,在使用它们时会遇到越严重的困难。当GUI调整大小时,它们不会调整您的组件的大小,它们是一个需要增强或维护的皇家女巫,当它们放置在滚动窗格中时会完全失败,当在所有平台或屏幕分辨率与原始分辨率不同的情况下查看时,它们看起来非常糟糕

关于你的蓝盒——你的蓝盒JPanel的大小是0,0。给它一个getPreferredSize方法并返回一个合适的大小:

public class Blue_Box extends JPanel {

    private static final int PREF_W = 640;
    private static final int PREF_H = 480;
    private Point p1 = new Point(100, 100);
    private Point p2 = new Point(540, 380);

    public Blue_Box() {

    }

    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2d = (Graphics2D) g;
        g2d.setColor(Color.blue);
        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        g2d.setStroke(new BasicStroke(8, BasicStroke.CAP_ROUND, BasicStroke.JOIN_BEVEL));
        g2d.draw(new Rectangle2D.Double(p1.x, p1.y, 40, 30));
    }

    @Override
    public Dimension getPreferredSize() {
        if (isPreferredSizeSet()) {
            return super.getPreferredSize();
        }
        return new Dimension(PREF_W, PREF_H);
    }

}

并消除空布局

您从未调用过
setVisible(true)

因此:

另外,关于使用null布局的一个小问题是,尽管null布局和
setBounds()
可能会像创建复杂GUI的最简单和最好的方法一样吸引新手,但您创建的GUI越多,在使用它们时会遇到越严重的困难。当GUI调整大小时,它们不会调整您的组件的大小,它们是一个需要增强或维护的皇家女巫,当它们放置在滚动窗格中时会完全失败,当在所有平台或屏幕分辨率与原始分辨率不同的情况下查看时,它们看起来非常糟糕

关于你的蓝盒——你的蓝盒JPanel的大小是0,0。给它一个getPreferredSize方法并返回一个合适的大小:

public class Blue_Box extends JPanel {

    private static final int PREF_W = 640;
    private static final int PREF_H = 480;
    private Point p1 = new Point(100, 100);
    private Point p2 = new Point(540, 380);

    public Blue_Box() {

    }

    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2d = (Graphics2D) g;
        g2d.setColor(Color.blue);
        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        g2d.setStroke(new BasicStroke(8, BasicStroke.CAP_ROUND, BasicStroke.JOIN_BEVEL));
        g2d.draw(new Rectangle2D.Double(p1.x, p1.y, 40, 30));
    }

    @Override
    public Dimension getPreferredSize() {
        if (isPreferredSizeSet()) {
            return super.getPreferredSize();
        }
        return new Dimension(PREF_W, PREF_H);
    }

}

并且要摆脱空布局

如果没有相关的代码,很难猜出你有什么bug。请先问一个更好的问题来帮助我们,这个问题会显示相关代码,最好是a(请阅读链接),并显示和描述调试尝试的结果。@hovercraftfullofels当然。。。我真傻!那么上面的代码在3秒内关闭?您是否看到任何异常或错误?我在quick first look上看到的主要问题是使用空布局,这是应该避免的,但这不会关闭GUI!!!以社区维基的形式回答,但是这个问题应该以重复的形式结束。如果没有相关的代码,很难猜出你有什么bug。请先问一个更好的问题来帮助我们,这个问题会显示相关代码,最好是a(请阅读链接),并显示和描述调试尝试的结果。@hovercraftfullofels当然。。。我真傻!那么上面的代码在3秒内关闭?您是否看到任何异常或错误?我在quick first look上看到的主要问题是使用空布局,这是应该避免的,但这不会关闭GUI!!!以社区维基的形式回答,但问题应该以重复的形式结束。Wow不知道JPanel是0,0。我还可以添加一个keylistener吗?@MertKarakas:新问题--新问题,但先搜索,因为这些问题以前都已经回答过了。特别是,您可能希望使用键绑定,而不是键侦听器,因此也可以在上面搜索,例如,and.Wow不知道JPanel处于0,0。我还可以添加一个keylistener吗?@MertKarakas:新问题--新问题,但先搜索,因为这些问题以前都已经回答过了。特别是,您可能希望使用键绑定,而不是键侦听器,因此也可以搜索它,例如和。