【问题标题】:JavaSwing Game: JFrame not showingJava Swing 游戏:JFrame 未显示
【发布时间】:2016-01-08 15:12:38
【问题描述】:

我正在尝试编写一个简单的游戏。我在一切的开始,我的目标是创建一个听我键盘的盒子。当试图在 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));
    }

}

【问题讨论】:

  • 在没有相关代码的情况下很难猜出你有什么错误。请首先通过提出一个更好的问题来帮助我们帮助您,该问题显示相关代码,最好是 minimal reproducible example(请阅读链接),并显示和描述您的调试尝试的结果。
  • @HovercraftFullOfEels 当然......我真傻!
  • 那么上面的代码在 3 秒内关闭?您是否看到任何异常或错误?我第一眼看到的主要问题是您使用空布局,应该避免这种情况,但这不会关闭 GUI。
  • 啊,你从来没有给setVisible(true);打电话!!!作为社区 wiki 回答,但该问题应作为重复项关闭。

标签: java swing jframe jpanel


【解决方案1】:

您永远不会在您的 GUI 实例上调用 setVisible(true);

所以:

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

另外,关于您使用空布局的一个小问题,虽然空布局和setBounds() 对于 Swing 新手来说似乎是创建复杂 GUI 的最简单和最好的方法,但您创建的 Swing GUI 越多,您遇到的困难就越严重使用它们时会遇到。当 GUI 调整大小时,它们不会调整您的组件大小,它们是增强或维护的皇家女巫,放置在滚动窗格中时它们完全失败,在与原始不同的所有平台或屏幕分辨率上查看时它们看起来很糟糕.

关于你的蓝框——你的 Blue_Box 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);
    }

}

并摆脱空布局

【讨论】:

  • 哇不知道 JPanel 是在 0,0。我还可以添加按键侦听器吗?
  • @MertKarakas:新问题——新问题,但先搜索,因为这些问题之前都已经回答过了。特别是,您可能希望使用 Key Bindings 而不是 KeyListener,因此也要搜索它,例如this linkthis one.
猜你喜欢
  • 2012-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-30
  • 1970-01-01
  • 2014-03-06
  • 1970-01-01
相关资源
最近更新 更多