Java - 同时使用 GUI 和 2D 图形

Java - Using both the GUI and 2Dgraphics

我正在尝试使用 java swing GUI,同时我正在为我正在创建的游戏绘制 2D 图形。我的目标是在图形顶部有一个下拉菜单。每当我尝试制作一个按钮或在摇摆中掉落时,我都看不到它。我相信这是覆盖摆动元素的二维图形。

这是我的 class decleration 和我的 JFrame 创建:

public class Main extends JFrame{

public Main(){
    setBackground(Color.LIGHT_GRAY);
    setSize(1000,600);
    setTitle("Scaling Tests");
    setDefaultCloseOperation(3);
    setVisible(true);

这就是我双缓冲和绘制图形的方式:

public void paint(Graphics g){

    dbImage = createImage(1000, 600);
    dbg = dbImage.getGraphics();
    draw(dbg);
    g.drawImage(dbImage, 0, 0, this.getWidth(), this.getHeight() , this);
    repaint();

}

public void draw(Graphics g){

    g.setColor(Color.red);
    g.fillRect(100, 100, 200, 200);

我试过在构造函数和绘制方法中绘制这样的 JLabel:

JLabel mylabel = new JLabel();
    mylabel.setText("Hello World!");
    mylabel.setBounds(0, 0, 1280, 720);
    mylabel.setVisible(true); //unnecessary 
    this.add(mylabel);

这没有用。无论我把它放在代码的哪个位置,我都看不到 Jlabel。我认为覆盖它的图形存在一些问题。

你的问题是你打破了绘制链,因为你没有调用 super.paint() 所以 none 的子组件被绘制了。

但是,您不应重写 JFrame 上的 paint()。

相反,自定义绘画是通过在 JPanel 上覆盖 paintComopnent() 然后将面板添加到框架来完成的。并且不要忘记调用 super.paintComponent(g) 作为方法中的第一条语句。

然后您可以将 JLabel 添加到面板。

此外,从未在绘画方法中调用 repaint()。这将导致无限循环。

这行得通 - 除了标签是所有背景,您必须使用一些布局管理器来处理它

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


public class Main extends JFrame{

public Main(){
setBackground(Color.LIGHT_GRAY);
setSize(1000,600);
setTitle("Scaling Tests");
setDefaultCloseOperation(3);
JLabel mylabel = new JLabel();
mylabel.setText("Hello World!");
mylabel.setBounds(0, 0, 1280, 720);
add(mylabel);
setVisible(true);

  }

  public static void main(String args[]) {
Main m=new Main();
}

public void paint(Graphics g){

Image dbImage = createImage(1000, 600);
Graphics dbg = dbImage.getGraphics();
draw(dbg);
g.drawImage(dbImage, 0, 0, this.getWidth(), this.getHeight() , this);

}

public void draw(Graphics g){

g.setColor(Color.red);
g.fillRect(100, 100, 200, 200);

}

}