【问题标题】:Java applet in JFrame graphics glitch?JFrame 图形故障中的 Java 小程序?
【发布时间】:2015-05-09 05:52:17
【问题描述】:

所以我正在尝试将一个弹球游戏制作为小程序加载到 JFrame 中。小程序加载到它没有问题,但是当我运行它时闪烁并出现故障。提前致谢!

Jframe 类:

import javax.swing.*;
import java.awt.*;
import java.applet.*;
public class PinBallGUI extends JFrame 
{
    public static void main(String[] args)
    {
        JFrame frame = new JFrame("Pinball");
        frame.setVisible(true);
        frame.setSize(600,700);
        int height = 700;
        int width = 600;
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        PinBallGame temp = new PinBallGame();
        frame.add(temp);
        temp.init(width,height);
        temp.start();
        temp.run();
    }
}

小程序类:

import java.awt.*;
import javax.swing.*;
import java.applet.*;
import java.util.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
public class PinBallGame extends Applet implements Runnable
{    
    Thread runner; 
    private Image Buffer;
    private Graphics gBuffer;
    int width,height;
    PinBallBall B1;
    PinBallPaddle P1,P2;
    PinBallRectangle R1,R2,R3,R4;
    PinBallRectangle[] rArray;
    boolean leftKey;
    boolean rightKey;
    boolean downKey;
    boolean spaceKey;
    int points;
    Random gen = new Random();
    public void init(int W,int H)
    {  
        width=W;
        height=H;
        Buffer=createImage(width,height);
        gBuffer=Buffer.getGraphics();
        B1 = new PinBallBall(-1,width-57,645);
        P1 = new PinBallPaddle(180,625,255,640);
        P2 = new PinBallPaddle(300,640,375,625);
        R1 = new PinBallRectangle(1,width-35,60,15,600);
        R2 = new PinBallRectangle(1,width-80,60,15,600);
        R3 = new PinBallRectangle(1,0,625,180,40);
        R4 = new PinBallRectangle(1,375,625,140,40);
        rArray = new PinBallRectangle[5];
        for(int i=0; i<rArray.length; i++)
        {
             rArray[i] = new       PinBallRectangle(-1,gen.nextInt(450),gen.nextInt(450),gen.nextInt(60),gen.nextInt(60));
        }
        int count = 0;
        addKeyListener(new MyKeyListener());
        points = 0;
    }
    private class MyKeyListener extends KeyAdapter
    {
       public void keyPressed(KeyEvent e)
       {
           switch(e.getKeyCode())
           {
               case KeyEvent.VK_LEFT:
               leftKey = true;
               break;
               case KeyEvent.VK_RIGHT:
               rightKey = true;
               break;
               case KeyEvent.VK_SPACE:
               spaceKey = true;
               break;
               case KeyEvent.VK_DOWN:
               downKey = true;
               break;
           }
       }
       public void keyReleased(KeyEvent e)
       {
           switch(e.getKeyCode())
           {
               case KeyEvent.VK_LEFT:
               leftKey = false;
               break;
               case KeyEvent.VK_RIGHT:
               rightKey = false;
               break;
               case KeyEvent.VK_SPACE:
               spaceKey = false;
               break;
               case KeyEvent.VK_DOWN:
               downKey = false;
               break;
            }
        }
    }   
    public void start()
    { 
        if (runner == null)
        {   
            runner = new Thread (this);
            runner.start();
        }
    }
    public void stop()
    {  
        runner = null;
    }
    public void run() 
    {  
        while(true)
        {
            update(gBuffer);
            if(leftKey){P1.moveLeftPaddle();}
            if(rightKey){P2.moveRightPaddle();}
            if(downKey){B1.launchBall(width,height);}
            repaint();
            try {runner.sleep(25);}
            catch (Exception e) { }   
            repaint();
            gBuffer.setColor(Color.black);
            gBuffer.fillRect(0,0,width,height);
            if((B1.getX() != width-57)||(B1.getY() != 645))
            {
                B1.movePinBallBall(width,height);
                B1.update();
            }
            R1.ballCollision(B1);
            repaint();
            R2.ballCollision(B1);
            repaint();
            R3.ballCollision(B1);
            repaint();
            R4.ballCollision(B1);
            repaint();
            P1.ballCollision(B1);
            repaint();
            P2.ballCollision(B1);
            repaint();
            for(int i=0; i<rArray.length; i++)
            {
                rArray[i].ballCollision(B1);
                repaint();
            }
            for(int i=0; i<rArray.length; i++)
            {
                rArray[i].paint(gBuffer);
            }
            update(gBuffer);
            B1.paint(gBuffer);
            R1.paint(gBuffer);
            R2.paint(gBuffer);
            R3.paint(gBuffer);
            R4.paint(gBuffer);
            P1.paint(gBuffer);
            P2.paint(gBuffer);
            repaint();
            update(gBuffer);
        }//while(true)
    } //run    
    public void update(Graphics g)
    {  
        paint(g);
    } 
    public void paint(Graphics g)
    {
        g.drawImage(Buffer,0,0, this);
    }
}

我还有 3 个其他类仅用于对象(球、矩形、桨)。 再次提前感谢!

【问题讨论】:

  • Applet 加载到 JFrame 中——为什么要这样做?
  • 你混合了重量级和重量级的组件,这似乎永远不会结束
  • 1) 为什么要编写小程序?如果是老师指定的,请参考Why CS teachers should stop teaching Java applets。 2) 为什么使用 AWT?请参阅this answer 了解放弃 AWT 使用支持 Swing 的组件的许多充分理由。

标签: java swing applet jframe


【解决方案1】:

您将希望使用 JFrame 和 JPanel 或 Frame 和 Canvas,而不是使用 JFrame 和 Applet。你绝对可以混合和匹配组件,但如果你不这样做,你可能会遇到更少的错误。

我通常发现当您不使用双缓冲时会发生闪烁。对于 JPanel,您需要启用双缓冲,对于 Canvas,如果您确实需要,有一种方法可以实现三重缓冲,但在大多数情况下坚持使用 JPanel。

【讨论】:

    猜你喜欢
    • 2014-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-03
    • 2015-10-26
    • 2014-06-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多