java 导入JFrame类 用repaint()循环后不檫除原有的字,请帮修改一下代码 5
importjava.awt.*;importjava.awt.event.*;importjavax.swing.*;publicclassxq44{publicsta...
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class xq44
{
public static void main(String[] args)
{
xq44_1 a=new xq44_1();
}
}
class xq44_1 extends JFrame implements Runnable
{
int x=5;
Thread trd=new Thread(this);
xq44_1()
{
setBounds(100,100,300,180);
setVisible(true);
setBackground(Color.yellow);
setForeground(Color.blue);
setFont(new Font("隶书",Font.BOLD,36));
trd.start();
addWindowListener(new WindowAdapter(){public void windowClosing(WindowEvent e){setVisible(true);System.exit(0);}});
}
public void run()
{
while(true)
{
x=x+2;
if(x>200) x=5;
try
{
trd.sleep(100);
}
catch (InterruptedException e)
{
}
repaint();
}
}
public void paint(Graphics g)
{
g.drawString("欢迎光临",x,80);
}
}
我添加后可以达到我要的效果,但是会覆盖背景色 不知道是怎么回事
public void paint(Graphics g)
{
super.paint(g);
g.drawString("欢迎光临",x,80);
}
而且如果继承的是Frame 类就没这些问题 展开
import java.awt.event.*;
import javax.swing.*;
public class xq44
{
public static void main(String[] args)
{
xq44_1 a=new xq44_1();
}
}
class xq44_1 extends JFrame implements Runnable
{
int x=5;
Thread trd=new Thread(this);
xq44_1()
{
setBounds(100,100,300,180);
setVisible(true);
setBackground(Color.yellow);
setForeground(Color.blue);
setFont(new Font("隶书",Font.BOLD,36));
trd.start();
addWindowListener(new WindowAdapter(){public void windowClosing(WindowEvent e){setVisible(true);System.exit(0);}});
}
public void run()
{
while(true)
{
x=x+2;
if(x>200) x=5;
try
{
trd.sleep(100);
}
catch (InterruptedException e)
{
}
repaint();
}
}
public void paint(Graphics g)
{
g.drawString("欢迎光临",x,80);
}
}
我添加后可以达到我要的效果,但是会覆盖背景色 不知道是怎么回事
public void paint(Graphics g)
{
super.paint(g);
g.drawString("欢迎光临",x,80);
}
而且如果继承的是Frame 类就没这些问题 展开
3个回答
展开全部
因为 repaint 以后系统会重新调用 paint 方法,“欢迎光临”又会画上去了。
首先我想说明一下,改成 paint() 通常是不可取的,除非实在没有办法的情况下才用。也没有 drawHold 这样的方法。
-----------------------------------------------------------
如果楼主要不擦除原有的字,你有两个办法,一个是需要一个列表来存储每一次的文字(或相关信息)。例如你这里可以存储 x 坐标。把 x 改成一个数组:
int x[] = new int[98];
for (int i=0; i<98; i++)
x[i] = 5 + 2 * i;
再定义一个标记,记录当前的位置。
int y = 1;
然后把你的 run 和 paint 都修改了:
public void run()
{
while(true)
{
y++;
if(y>98) y = 98;
try
{
trd.sleep(100);
}
catch (InterruptedException e)
{
}
repaint();
}
}
public void paint(Graphics g)
{
super.paint(g);
for (int i=0; i<y; i++) {
g.drawString("欢迎光临",x[i],80);
}
}
--------------------------------------------------------
还有一种办法就是不要重写 paint 方法,不要调用 repaint 方法。
而是在你原来 repaint 的位置改成:getGraphics().drawString("欢迎光临", x, 80);
缺点是一旦窗口最小化或移出桌面,上面的字会被擦除。
首先我想说明一下,改成 paint() 通常是不可取的,除非实在没有办法的情况下才用。也没有 drawHold 这样的方法。
-----------------------------------------------------------
如果楼主要不擦除原有的字,你有两个办法,一个是需要一个列表来存储每一次的文字(或相关信息)。例如你这里可以存储 x 坐标。把 x 改成一个数组:
int x[] = new int[98];
for (int i=0; i<98; i++)
x[i] = 5 + 2 * i;
再定义一个标记,记录当前的位置。
int y = 1;
然后把你的 run 和 paint 都修改了:
public void run()
{
while(true)
{
y++;
if(y>98) y = 98;
try
{
trd.sleep(100);
}
catch (InterruptedException e)
{
}
repaint();
}
}
public void paint(Graphics g)
{
super.paint(g);
for (int i=0; i<y; i++) {
g.drawString("欢迎光临",x[i],80);
}
}
--------------------------------------------------------
还有一种办法就是不要重写 paint 方法,不要调用 repaint 方法。
而是在你原来 repaint 的位置改成:getGraphics().drawString("欢迎光临", x, 80);
缺点是一旦窗口最小化或移出桌面,上面的字会被擦除。
展开全部
1.Graphics基类是不是有一个drawhold()还是什么方法,可以在repaint()前加入保留之前已经在屏幕上的图形,这个我不确定。
2.可不可以把repaint()改成paint()呢?
然后paint方法里的g.drawString()就是按两格位移向下打印一竖列欢迎光临。
2.可不可以把repaint()改成paint()呢?
然后paint方法里的g.drawString()就是按两格位移向下打印一竖列欢迎光临。
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
在paint()方法中添加下面一句话:
g.setColor(COLOR.WHITE);
g.fillRect(0,0,this.getHeight,this.getWidth);
每次在写字之前画一个白板,将之前的字覆盖掉,然后再写g.drawString();这句话。
试试吧
g.setColor(COLOR.WHITE);
g.fillRect(0,0,this.getHeight,this.getWidth);
每次在写字之前画一个白板,将之前的字覆盖掉,然后再写g.drawString();这句话。
试试吧
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询