gpt4 book ai didi

java - 在java中重用颜色类型(重置颜色)

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:47:37 25 4
gpt4 key购买 nike

有没有什么方法可以在不创建新对象的情况下重复使用相同的 Color 类型对象?因为我认为如果频繁更改颜色,创建新的 Color 对象会减慢程序速度。

像这样:

//passing Graphics g into the function
int color_setting=1;
while(1)
{
Color cl=new Color(color_setting,0,0);
g.setPaint(cl);
//the rest of drawing
color_setting=(color_setting+1)%256;
}
//is there a way to reset the color of old cl without always creating a new Color object?

好的,我将在此处发布整个代码。对不起,有点乱:

import java.lang.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.Timer;
import javax.swing.*;
import java.awt.geom.*;
import static java.lang.System.*;
import java.util.*;
class compo extends JComponent
{
static int color,dir;
{
color=0;
dir=1;
}
Toolkit kit=Toolkit.getDefaultToolkit();
Dimension sz=kit.getScreenSize();
public Dimension getPreferredSize(){return new Dimension(sz.width/2,sz.height/2);}
public void paintComponent(Graphics g)
{

Graphics2D g2=(Graphics2D)g;
float x=255;
int count=255;
while(count!=0)
{
color=color+dir;
if(color%128==0)
dir=-dir;
Color temp_color=new Color(color+64,0,0);
Line2D line=new Line2D.Double(0.0,x,sz.width,x);
g2.setPaint(temp_color);
x--;
count--;
g2.draw(line);
}
}

}

public class hello
{
public static void main(String[] args)
{
EventQueue.invokeLater(new Runnable()
{
public void run()
{
SimpleFrame frame=new SimpleFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
class temp implements ActionListener
{
Timer timer;
Toolkit kit=Toolkit.getDefaultToolkit();
Dimension sz=kit.getScreenSize();
SimpleFrame frame;
public temp(SimpleFrame _frame)
{
frame=_frame;
}

public void actionPerformed(ActionEvent event)
{
timer.stop();
frame.setTitle("this is the frame!");
frame.add(new compo());
frame.pack();
timer.start();
}
public void storing(Timer timer)
{
this.timer=timer;
}
}
ActionListener test=new temp(frame);
Timer t=new Timer(0,test);
((temp)test).storing(t);
t.start();
}
}
);
}
}
class SimpleFrame extends JFrame
{
private static final int DEFAULT_WIDTH=300;
private static final int DEFAULT_HEIGHT=200;
public SimpleFrame()
{
setSize(DEFAULT_WIDTH,DEFAULT_HEIGHT);
}
}

最佳答案

java.awt.Color 是不可变类。如果您需要一种新颜色,您必须创建一个新的 Color 实例,没有其他办法。但是,创建新的 Color 不会减慢您的速度,因为您通常不会像在代码中那样在紧密循环中创建新的 Color。您创建一种颜色,用它做一些事情,然后为其他目的创建另一种颜色并执行其他一些操作。在这种真实情况下,仅根据需要创建新颜色根本不会减慢代码速度!

在与问题作者交换几条消息后添加:

肯定不会在一段时间后减速。这样做验证一下:在paintCompoment方法中添加时间记录。在方法开始时取方法开始时间。在方法结束时取方法结束时间。打印该方法花费了多少毫秒。您会发现即使运行几分钟,时间也不会发生太大变化。

public void paintComponent(Graphics g)
{
long methodBeginTime = System.currentTimeMillis(); //<< Added this line.
Graphics2D g2=(Graphics2D)g;
float x=255;
int count=255;
while(count!=0)
{
color=color+dir;
if(color%128==0)
dir=-dir;
Color temp_color=new Color(color+64,0,0);
Line2D line=new Line2D.Double(0.0,x,sz.width,x);
g2.setPaint(temp_color);
x--;
count--;
g2.draw(line);
}
long methodEndTime = System.currentTimeMillis(); //<< Added this line.
System.out.println("Method time:" + (methodEndTime - methodBeginTime)); //<< Added this line.
}

那么问题是 - 为什么波浪没有以相同的速度前进?看起来绘画算法正在创造波浪减速的错觉。它可能是现有模式被覆盖的交互、屏幕刷新频率等的组合。您可以考虑在每次绘制之前清除背景。使用双缓冲使其更流畅。希望这两件事可以改善这种情况!

关于java - 在java中重用颜色类型(重置颜色),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21806586/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com