Java 我的JFrame背景赢了';不变

Java 我的JFrame背景赢了';不变,java,swing,Java,Swing,我是Java新手,有人建议我通过小游戏学习Java。所以我尝试做一个小的乒乓球游戏,我做了一个球员,移动就像我想要的,但我之前的颜色背景,它不再显示了。我尝试了很多方法,但我真的不知道这里的错误。这是我的密码: 窗口类 import java.awt.Color; import java.awt.Dimension; import javax.swing.JFrame; public class Window{ public Window(){ JFrame window = ne

我是Java新手,有人建议我通过小游戏学习Java。所以我尝试做一个小的乒乓球游戏,我做了一个球员,移动就像我想要的,但我之前的颜色背景,它不再显示了。我尝试了很多方法,但我真的不知道这里的错误。这是我的密码:

窗口类

import java.awt.Color;
import java.awt.Dimension;
import javax.swing.JFrame;

public class Window{
  public Window(){
    JFrame window = new JFrame();
    Player player = new Player();
    window.setSize(720, 480);
    window.setResizable(true);
    window.setTitle("2DGame");
    window.setUndecorated(false);
    window.setBackground(new Color(16,16,16));
    window.getContentPane().add(player);
    window.setLocationRelativeTo(null);
    window.getContentPane().setBackground(Color.BLACK);
    window.setVisible(true);
    window.setMinimumSize(new Dimension(720, 480));
  }
}
球员级别

import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JPanel;
import javax.swing.Timer;

public class Player extends JPanel implements ActionListener, KeyListener{
  Timer t = new Timer(5, this);
  private int speed = 2;
  private int ydirection = 0;
  private int x = 28;
  private int y = 190;
  private boolean key1 = false;
  private boolean key2 = false;
  public Player(){
    t.start();
    addKeyListener(this);
    this.setFocusable(true);
    setFocusTraversalKeysEnabled(false);
  }
  public void paint(Graphics g){
    super.paint(g);
    g.setColor(new Color(50, 50, 50));
    g.fillRect(x, y, 20, 100);
  }
  public void actionPerformed(ActionEvent e){
    repaint();
    y += ydirection;
  }
  public void keyPressed(KeyEvent e){
    int KeyCode = e.getKeyCode();
    if(KeyCode == KeyEvent.VK_W){
      ydirection = -speed;
      key1 = true;
    }
    if(KeyCode == KeyEvent.VK_S){
      ydirection = speed;
      key2 = true;
    }
    if(key1 == true && key2 == true){
      ydirection = 0;
    }
  }
  public void keyReleased(KeyEvent e){
    int KeyCode = e.getKeyCode();
    if(KeyCode == KeyEvent.VK_W){
      ydirection = 0;
      key1 = false;
    }
    if(KeyCode == KeyEvent.VK_S){
      ydirection = 0;
      key2 = false;
    }
    if(KeyCode == KeyEvent.VK_ESCAPE){
      System.exit(0);
    }
  }
  public void keyTyped(KeyEvent e){}
}

您的回答将不胜感激。

您的问题包括:您正在设置contentPane的颜色,但通过向contentPane的
边框布局.中间位置添加不透明组件(JLabel)来覆盖它。同样,这完全覆盖了contentPane

帮助解决问题的建议和其他无关的建议:

  • 通过对播放器JPanel调用
    setOpaque(false)
    使其不不透明。这样,容器上的任何背景色都会显示出来
  • 或者简单地设置播放器JPanel的背景色,因为它现在充当contentPane,因为它覆盖了实际contentPane的中心部分
  • 副建议1:不要覆盖JPanel的paint方法,而应覆盖其paintComponent方法,因为paint涉及绘制子组件和边框,这是您不希望产生副作用的,并且因为paint不使用JPanel的双缓冲,因此,如果覆盖paintComponent,动画将更加平滑
  • 使用键绑定而不是键侦听器可以减少GUI焦点混乱带来的麻烦
您的问题包括:您正在设置contentPane的颜色,但通过向contentPane的
边框布局.居中位置添加不透明组件(JLabel)来覆盖它。同样,这完全覆盖了contentPane

帮助解决问题的建议和其他无关的建议:

  • 通过对播放器JPanel调用
    setOpaque(false)
    使其不不透明。这样,容器上的任何背景色都会显示出来
  • 或者简单地设置播放器JPanel的背景色,因为它现在充当contentPane,因为它覆盖了实际contentPane的中心部分
  • 副建议1:不要覆盖JPanel的paint方法,而应覆盖其paintComponent方法,因为paint涉及绘制子组件和边框,这是您不希望产生副作用的,并且因为paint不使用JPanel的双缓冲,因此,如果覆盖paintComponent,动画将更加平滑
  • 使用键绑定而不是键侦听器可以减少GUI焦点混乱带来的麻烦
阅读上Swing教程的部分。它显示由框架、内容窗格和添加到内容窗格的组件组成的框架层次结构

但是我在window类中的自定义颜色没有显示,相反,背景显示为黑色


同样,内容窗格覆盖了框架,因此您可以看到黑色。您应该只在内容窗格中设置自定义颜色,而不是框架本身。

阅读上Swing教程的部分。它显示由框架、内容窗格和添加到内容窗格的组件组成的框架层次结构

但是我在window类中的自定义颜色没有显示,相反,背景显示为黑色

同样,内容窗格覆盖了框架,因此您可以看到黑色。您只需将自定义颜色设置为内容窗格,而不是框架本身。

尝试这样做

JFrame window = new JFrame();
window.getContentPane.setBackground(Color.RED);
像这样试试

JFrame window = new JFrame();
window.getContentPane.setBackground(Color.RED);
但如果你想把图像放在背景中。试试这个

setContentPane(new JLabel(new ImageIcon("C:\\Downloads\\file Sample.png")));
但如果你想把图像放在背景中。试试这个

setContentPane(new JLabel(new ImageIcon("C:\\Downloads\\file Sample.png")));

谢谢你的建议。我添加了set不透明(false),并将绘制方法更改为paintComponent。但是我在window类中的自定义颜色没有显示,相反,背景显示为黑色。你能帮我吗?谢谢你的建议。我添加了set不透明(false),并将绘制方法更改为paintComponent。但是我在window类中的自定义颜色没有显示,相反,背景显示为黑色。你能帮我做这个吗?