使JPanel的paintComponent元素与其中的另一个JPanel一起使用

格雷森·埃里克森

我在中有一个JPanel带有简单动画雪粒效果的JFrame,它可以独立工作。但是,当我尝试向其添加另一个面板时,它使积雪的效果停止了。谁能帮我这个?分层有问题吗?还是我的布局管理器有问题?

我的代码:

package christmasfinal;

import java.awt.*;
import javax.swing.*;

public class ChristmasFinal extends JApplet {

    public static void main(String[] args) {
        JFrame frame = new JFrame();
        TreePanel treePanel = new TreePanel();
        frame.setSize(550, 420);
        SnowBackgroundPanel snowPanel = new SnowBackgroundPanel(frame.getWidth(),    frame.getHeight());
        treePanel.setSize(200, 320);
        snowPanel.setSize(frame.getWidth(), frame.getHeight());
        snowPanel.setLayout(new BorderLayout());
        frame.setLayout(new BorderLayout());
        frame.add(snowPanel, BorderLayout.CENTER);
        snowPanel.add(treePanel, BorderLayout.CENTER);
        System.out.println(treePanel.getWidth() + " " + treePanel.getHeight());

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
        frame.setTitle("Christmas Final");
    }

}


package christmasfinal;

import javax.swing.*;
import java.awt.*;

public class TreePanel extends JPanel{

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        int[] treeX = {getWidth()/2, getWidth()/2-20, getWidth()/2-60, getWidth()/2-20,
        getWidth()/2-40, getWidth()/2-80, getWidth()/2-20, getWidth()/2-60, getWidth()/2-100,
        getWidth()/2+100,getWidth()/2+60, getWidth()/2+20, getWidth()/2+80,
        getWidth()/2+40, getWidth()/2+20, getWidth()/2+60, getWidth()/2+20, getWidth()/2};

        int[] treeY = {getHeight()/2-120, getHeight()/2-80, getHeight()/2-40, getHeight()/2-40,
        getHeight()/2-20, getHeight()/2, getHeight()/2, getHeight()/2+40, getHeight()/2+60,
        getHeight()/2+60, getHeight()/2+40, getHeight()/2, getHeight()/2, getHeight()/2-20,
        getHeight()/2-40, getHeight()/2-40, getHeight()/2-80, getHeight()/2-120};

        g.setColor(Color.GREEN);
        g.fillPolygon(treeX, treeY, treeX.length);
        g.setColor(new Color(102, 51, 0));
        g.fillRect(getWidth()/2-20, getHeight()/2+60, 40, 40);
    }
}

package christmasfinal;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Random;
import java.math.*;

public class SnowBackgroundPanel extends JPanel{
    Random rand = new Random();

    //Create ArrayList for SnowParticles
    ArrayList<SnowParticle> snow = new ArrayList();

    //Create animation timer
    Timer timer = new Timer(7, new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            repaint();
        }
    });



    public SnowBackgroundPanel(int width, int height){
        setSize(width, height);
        System.out.println(getHeight() + " " + getWidth());
        for(int i=0; i<50; i++){
            snow.add(new SnowParticle());
            snow.get(i).x = rand.nextInt(getWidth()+1);
            snow.get(i).y = 0-rand.nextInt(getHeight()+1);
        }
        timer.start();

}
    @Override
    public void paintComponent(Graphics g){
        super.paintComponent(g);
        g.setColor(Color.WHITE);

        //Set, paint, and move snow particles
        for(int i=0; i<50; i++){
            g.fillOval(snow.get(i).x, snow.get(i).y, 10, 10);
            snow.get(i).y += 1;
            if(snow.get(i).y > getHeight()){
                snow.get(i).x = rand.nextInt(getWidth()+1);
                snow.get(i).y = 0-rand.nextInt(getHeight()+1);
            }
        }
    }
}
充满鳗鱼的气垫船

您正在将TreePanel添加到SnowPanel的BorderLayout.CENTER位置,这将有效地覆盖SnowPanel,因此应该可以覆盖SnowPanel的图形和动画。通过调用TreePanel可以将TreePanel设置为非透明,setOpaque(false)这样您就可以查看它:

  TreePanel treePanel = new TreePanel();
  treePanel.setOpaque(false);

您的代码的其他问题:

  • 如果没有Applet代码或行为,ChristmasFinal为什么要扩展JApplet?
  • 避免调用setSize(...)任何东西,因为那是很危险的事情。
  • 最好让组件根据其布局管理器和preferredSizes自行调整大小。
  • 如果您绝对需要设置大小,最好覆盖 getPreferredSize()
  • 您应该避免在paintComponent(...)方法中包含程序逻辑,因为您永远无法完全控制何时甚至是否paintComponent(...)被调用。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

JPanel里面另一个

另一个Jpanel内的Jpanel

使用另一个 jPanel 上的按钮修改 jPanel

从另一个JPanel更改一个变量的值时,更新JPanel的标签

如何在JPanel的右侧对齐一个元素,在左侧对齐另一个元素?

在另一个JFrame上显示JPanel

在另一个类的JFrame上显示JPanel

从另一个类添加 jpanel

从另一个类中删除jPanel

从另一个类调用另一个JFrame / JPanel

将透明的JPanel放置在另一个不起作用的JPanel之上

当鼠标进入另一个JPanel时如何更改JPanel的背景颜色

将另一个类的JPanel添加到JFrame中的JPanel

将具有布局GridLayout的JPanel居中放置在另一个JPanel中

如何获取扩展 JPanel 以显示在另一个 JPanel 类中的类的实例?

Repaint()无法与其他JPanel一起使用吗?

如何从一个 jpanel 到另一个 jpanel 画一条线

使用来自另一个对象(线程)的数据重新绘制JPanel

如何使用来自另一个类的 ActionListener 更改 JPanel 颜色?

在Java中,如何使用另一个类中的数据绘制JPanel?

如何使用 JButton 将 JFrame 类与另一个 JPanel 链接

在HTML中将一个元素与另一个元素包装在一起

克隆元素删除其中的另一个元素

将JPanel内容复制到另一个JPanel而不删除原始JPanel的内容

摇摆。将事件从一个JPanel发送到另一个JPanel

如何将一个JPanel的特定坐标绘制到另一个JPanel上

如何使一个JPanel在另一个JPanel中扩展到最大宽度

如何从一个JFrame或JPanel到Netbeans中的另一个?

从另一个类添加一个JPanel