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);
}
}
我正在尝试使用 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);
}
}