简体   繁体   English

我如何制作不会更新的JPanel背景?

[英]how do i make a JPanel background that won't update?

I'm trying to make an animated screensaver with some changing colors and moving shapes and I also want it to have a sort of trail effect (like how the most recent color on each pixel is continually drawn there if you don't set your background color). 我正在尝试制作具有一些不断变化的颜色和移动形状的动画屏幕保护程序,并且我还希望它具有某种拖尾效果(例如,如果不设置背景,则如何在此连续绘制每个像素的最新颜色)颜色)。 I achieved this effect once before, but I don't know how I did it. 我曾经达到过这种效果,但是我不知道我是怎么做到的。 Currently the result is a moving square with that changes colors across a grey background. 当前,结果是一个移动的正方形,该正方形在灰色背景上改变了颜色。 ScreenSaver.java 屏幕保护程序.java

import java.awt.Color;
import java.awt.Component;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

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

public class ScreenSaver extends JPanel
{
    public static Component sc;
    public int delay = 1000/2;
    public int state = 0;
    public int re = 255;
    public int gr = 0;
    public int bl = 0;
    public int d = 1;
    ScreenSaver()
    {
        ActionListener counter = new ActionListener()
        {
            public void actionPerformed(ActionEvent event)
            {
                updateUI();
                repaint();
            }
        };
        new Timer(delay, counter).start();
        System.out.println("this is the secret screensaver that appears after 30 seconds of no mouse activity");//i have this line here so it doesn't print every time the screen updates
    }

    public void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        this.setBackground(null);
        if (state == 0)
        {
            gr++;
            if(gr == 255)
                state = 1;
        }
        if (state == 1)
        {
            re--;
            if(re == 0)
                state = 2;
        }
        if (state == 2)
        {
            bl++;
            if(bl == 255)
                state = 3;
        }
        if (state == 3)
        {
            gr--;
            if(gr == 0)
                state = 4;
        }
        if (state == 4)
        {
            re++;
            if(re == 255)
                state = 5;
        }
        if (state == 5)
        {
            bl--;
            if(bl == 0)
                state = 0;
        }
        g.setColor(new Color(re, gr, bl));
        d++;
        g.fillRect(d, 50, 50, 50);
    }
    public static void main(String[] args)
    {
        //ScreenSaver sc = new ScreenSaver();
    }
}

Main.java: (ScreenSaver.java is called as an object through this file) Main.java :(通过此文件将ScreenSaver.java称为对象)

import java.awt.Color;
import java.awt.Graphics;
//import java.util.Random;

//import javax.swing.AbstractAction;
//import javax.swing.Action;
import javax.swing.JFrame;
import javax.swing.JPanel;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;

import javax.swing.Timer;

public class FinalProject extends JPanel implements MouseMotionListener
{
    public int delay = 1000/2;
    public boolean screenActive = true;
    public int why = 1;
    FinalProject()
    {
        ActionListener counter = new ActionListener()
        {
            public void actionPerformed(ActionEvent event)
            {
                updateUI();
                repaint();
            }
        };
        new Timer(delay, counter).start();
    }
    static JFrame jf = new JFrame();

    public void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        this.setBackground(Color.BLACK);
        if (screenActive)
        {
            why++;
        }
        if (why == 6)
        {
            why = 0;
            System.out.println("inactivity detected");
            screenActive = false;
            ScreenSaver sc = new ScreenSaver();
            jf.add(sc);
        }
    }

    public static void main(String[] args) throws InterruptedException
    {
        System.out.println("Welcome to Computer Simulator 0.1");
        System.out.println("this is the main screen");
        FinalProject e = new FinalProject();
        //ScreenSaver sc = new ScreenSaver();
        jf.setTitle("game");
        jf.setSize(500,500);
        //jf.setUndecorated(true);
        //jf.setBackground(new Color(1.0f,1.0f,1.0f,0.5f));
        jf.setVisible(true);
        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        //jf.add(new ScreenSaver());
        jf.add(e);
    }

    @Override
    public void mouseDragged(MouseEvent arg0) {
        // TODO Auto-generated method stub

    }

    @Override
    public void mouseMoved(MouseEvent MOUSE_MOVED)
    {

    }
}

Don't invoke updateUI(). 不要调用updateUI()。 All you need is the repaint() to cause the component to repaint itself. 您需要做的就是repaint()来使组件重新绘制自身。

One way it to do the drawing to a BufferedImage and then use the BufferedImage to create an ImageIcon which you add to a JLabel. 一种方法是将其绘制为BufferedImage,然后使用BufferedImage创建ImageIcon,然后将其添加到JLabel。

The other way is to keep a list of object that you want to paint and then just iterate through the list each time the component is repainted. 另一种方法是保留要绘制的对象的列表,然后在每次重新绘制组件时仅遍历该列表。

Check out Custom Painting Approches for working examples and an analysis of when you might use either approach. 请查看“ 自定义绘画方法”中的工作示例,以及何时使用哪种方法的分析。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM