【问题标题】:JFrame background disappears after startJFrame背景启动后消失
【发布时间】:2014-11-25 15:21:05
【问题描述】:

所以我不确定我设置 Jframe 背景的问题出在哪里

frame.getContentPane().setBackground(Color.green);

但是,一旦程序启动,它会显示一抹绿色,然后就消失了。

Game.java

package com.questkings.game;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.Timer;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Game extends JPanel{

Player player = new Player(this);

public Game(){
    addKeyListener(new KeyListener(){

        @Override
        public void keyTyped(KeyEvent e){
        }

        @Override
        public void keyReleased(KeyEvent e){
            player.keyReleased(e);
        }

        @Override
        public void keyPressed(KeyEvent e){
            player.keyPressed(e);
        }
    });
    setFocusable(true);
}

public void move(){
    player.move();
}

@Override
public void paint(Graphics g){
    super.paint(g);
    Graphics2D g2d = (Graphics2D) g;
    g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
            RenderingHints.VALUE_ANTIALIAS_ON);

    player.paint(g2d);
}

public void timer1() throws InterruptedException{
     int delay = 1000; //milliseconds
      ActionListener taskPerformer = new ActionListener() {
          public void actionPerformed(ActionEvent evt) {
          }
      };
      new Timer(delay, taskPerformer).start();;

Thread.sleep(10);
}

public static void main(String args[]) throws InterruptedException, Exception{
    int Width = 800;
    int Height = 400;
    Game game = new Game();

    JFrame frame = new JFrame("quest Kings");
    frame.setSize(Width, Height);
    frame.setVisible(true);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.getContentPane().setBackground(Color.green);
    frame.add(game);
    frame.setResizable(false);


    //What to do after the program starts
    while(true){
        game.move();
        game.repaint();
        game.timer1();
    }
}
}

【问题讨论】:

  • 1) 为了尽快获得更好的帮助,请发布MCVE(最小完整可验证示例)或SSCCE(简短、自包含、正确示例)。 2)Thread.sleep(10);为什么在代码里?
  • while(true){ .. } 不要阻塞 EDT(事件调度线程)。发生这种情况时,GUI 将“冻结”。有关详细信息和修复,请参阅 Concurrency in Swing
  • @AndrewThompson while(true) 不应阻塞 EDT,因为它是在主线程中调用的。
  • 如果我只是在后台为我的尺寸写了一个新的 Rectangle 会有什么缺点?
  • 您确实意识到您的 while(true) 循环正在创建一个庞大的 Swing 计时器实例

标签: java swing jframe paint


【解决方案1】:

您的while(true) {...} 循环块主线程,这就是发生这种情况的原因。尝试使用worker在单独的线程中执行此类操作。

此链接可能会有所帮助:

SWING WORKER EXAMPLE

【讨论】:

  • while(true) 在“主”线程中被调用,为什么要阻塞 EDT?
【解决方案2】:

我给你一个建议,从内容窗格中直接设置应用程序的颜色,就像那样

contentPane.setBackground(Color.red);

【讨论】:

    猜你喜欢
    • 2015-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多