java - 在具有不断重新绘制的 JPanel 的 JApplet 中使用组件

标签 java swing applet japplet

我在完成这项学校作业时遇到了一个大问题;幸运的是我早早开始了。我们被要求使用 JApplet 制作一个 child 数学游戏。到目前为止,一切都很好。我设法创建了一个 JPanel,然后将其添加到 JApplet 并保存所有绘图(JPanel 内容不断重绘) .但是,每当我尝试将一个 Swing 组件(例如 JLabel)添加到 JApplet 内容 Pane 时,它不会显示或显示曾经存在的迹象。我是 JApplet 的新手,所以如果很明显,请不要太苛刻。

代码如下:

import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JApplet;
import javax.swing.JPanel;
import javax.swing.Timer;

public class CountingSheep extends JApplet
{

    final int BOARDWIDTH = 800;
    final int BOARDHEIGHT = 500;
    final int SCREENWIDTH = 800;
    final int SCREENHEIGHT = 800;
    Dimension boardDim = new Dimension(BOARDWIDTH, BOARDHEIGHT);
    Dimension screenDim = new Dimension(SCREENWIDTH, SCREENHEIGHT);
    Graphics bufferGraphics;
    Image offScreen;
    Image backgroundImage;
    Image[] sheepImage = new Image[2];
    JPanel gameBoard = new JPanel(true);
    List<Sheep> sheepArray = new ArrayList<>();
    Timer myTimer;

    public void init()
    {
        loadImages();
        initScreen();
        initBufferGraphics();
        initBoard();
        initTimer();
        sheepArray.add(new Sheep(sheepImage));
        myTimer.start();
    }

    private void loadImages()
    {
        sheepImage[0] = getImage(getDocumentBase(), "sheep.png");
        sheepImage[1] = getImage(getDocumentBase(), "sheep2.png");
        backgroundImage = getImage(getDocumentBase(), "bg.jpg");
    }

    private void initScreen()
    {
        setSize(800, 600);
        setLayout(new FlowLayout(FlowLayout.LEFT, 0, 0));
    }

    private void initBoard()
    {
        gameBoard.setPreferredSize(new Dimension(BOARDWIDTH, BOARDHEIGHT));
        getContentPane().add(gameBoard);
    }

    private void initBufferGraphics()
    {
        offScreen = createImage(BOARDWIDTH, BOARDHEIGHT);
        bufferGraphics = offScreen.getGraphics();
    }

    private void initTimer()
    {
        myTimer = new Timer(80, new ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            {
                timerTick(e);
            }
        });
    }

    private void timerTick(ActionEvent e)
    {
        repaint();
    }

    public void paint(Graphics g)
    {
        bufferGraphics.clearRect(0, 0, BOARDWIDTH, BOARDHEIGHT);
        bufferGraphics.drawImage(backgroundImage, 0, 0, null);
        drawSheepHerd();
        moveSheepHerd();
        gameBoard.getGraphics().drawImage(offScreen, 0, 0, this);
    }

    public void drawSheepHerd()
    {
        for (Sheep s : sheepArray)
        {
            s.draw(bufferGraphics);
        }
    }

    public void moveSheepHerd()
    {
        for (Sheep s : sheepArray)
        {
            s.move();
        }
    }
}

在此先感谢,希望你们能解决这个问题,因为我很困惑。

最佳答案

总结一下我的一些建议:

  • 创建您自己的 ContentPane 类,该类扩展 JPanel,覆盖 paintComponent(...) 并绘制背景图像并显示动画。
  • 在 JApplet 的 init 方法中调用 setContentPane(...),传入一个此类的对象。
  • 试验 ContentPane 的不同布局和定位。
  • 确保 paintComponent(Graphics g) 方法的第一行是:super.paintComponent(g) 这样每次绘图都会被重置油漆。
  • 默认情况下 JPanel 是不透明的,您应该保留它,因为 contentPanes 必须是不透明的。如果您在 contentPane 顶部添加组件并希望看到添加组件后面的图像,您可能必须使它们不透明。

关于java - 在具有不断重新绘制的 JPanel 的 JApplet 中使用组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10960939/

相关文章:

java - 从文件读入数组

java - JMenuItem 无法动态添加组件

Java Applet 表在运行时不显示

java - JFrame 不添加 TabbedPane

java - 无法从java中的列表中获取项目

Java Applet - 无法将默认平台编码更改为其他一些

java - 使用 spring-boot 和 spring-data 全局启用 hibernate 过滤器

java - Hibernate 语句挂起

java - Android Studio 为新添加的方法添加测试

Java swing图形绘制并用颜色填充选定的矩形