我的JFrame背景不会发生变化

时间:2016-03-13 17:27:10

标签: java swing

我是Java的新手,我已经获得了通过小游戏学习java的建议。所以我正在尝试制作一个小型Pong游戏,我已经完成了一个按照我想要的方式移动的玩家,但是我之前没有显示的颜色背景。我尝试了很多方法,但我真的不知道这里的错误。这是我的代码:

窗口类

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){}
}

您的回答将非常受欢迎。

4 个答案:

答案 0 :(得分:2)

阅读Top Level Containers上的Swing教程中的部分。它显示了一个框架的层次结构,它由框架,内容窗格和添加到内容窗格的组件组成。

  

但是窗口类中的自定义颜色没有显示,而背景显示为黑色

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

答案 1 :(得分:1)

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

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

  • 通过调用setOpaque(false)使播放器JPanel不透明。这样,容纳它的容器上的任何背景颜色都将显示出来。
  • 或者只是设置播放器JPanel的背景颜色,因为它现在充当contentPane,因为它覆盖了实际contentPane的中心部分。
  • 侧面建议1:不要覆盖JPanel的paint方法,而是覆盖paintComponent方法,因为paint涉及绘制子组件和边框,你不想引起副作用,并且因为paint不使用JPanel的双重缓冲,因此如果覆盖paintComponent,动画将更加平滑。
  • 使用Key Bindings而不是KeyListener可以减少GUI焦点kludges的麻烦。

答案 2 :(得分:1)

试试这个

JFrame window = new JFrame();
window.getContentPane.setBackground(Color.RED);

答案 3 :(得分:0)

JFrame window = new JFrame();
getContentPane().setBackground(Color.YELLOW); // ANY COLOR YOU WANT.

但是如果你想把Image放在你的背景中。试试这个。

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