当前位置:  技术问答>java相关

三个奇怪的问题需要Java高人帮我解决一下!

    来源: 互联网  发布时间:2015-09-19

    本文导语:  各位网友,大家好: 请各位网友帮忙看一下这段程序: import java.awt.*; import java.awt.event.*; import javax.swing.*; class RepaintPanel extends JPanel implements ActionListener {       public RepaintPanel()       {              ...

各位网友,大家好:
请各位网友帮忙看一下这段程序:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
class RepaintPanel extends JPanel implements ActionListener
{
      public RepaintPanel()
      {
             btnTest=new JButton("RepaintTest");
             add(btnTest);
             btnTest.addActionListener(this);
      }
      public void actionPerformed(ActionEvent evt)
      {
             Graphics g=getGraphics();
             g.drawRect(10,10,40,50);
             g.dispose();
             flag=false;
      }
      public void paintComponent(Graphics g)
      {
             if(flag==false)
                           MyDraw(g);
      }
      public void MyDraw(Graphics g)
      {

             g.drawRect(10,10,40,50);
      }
      private JButton btnTest;
      private boolean flag=true;
}
class RepaintFrame extends JFrame
{
      public RepaintFrame()
      {
             setTitle("My Test Repaint Application!");
             setSize(300,250);
             Toolkit tk=Toolkit.getDefaultToolkit();
             Dimension d=tk.getScreenSize();
             int width=(d.width-300)/2;
             int height=(d.height-250)/2;
             setLocation(width,height);
             addWindowListener(new WindowAdapter()
                                   {
                                                  public void windowClosing(WindowEvent e)
                                                  {
                                                         System.exit(0);
                                                  }
                                   });
             Container contentPane=getContentPane();
             contentPane.add(new RepaintPanel());
      }
}
public class RepaintTest
{
       public static void main(String[] args)
       {
              JFrame MyFrame=new RepaintFrame();
              MyFrame.show();
       }
}
1.在这段程序中,为什么在程序需要重画的时候,在Button的左边还会画一个Button呢?这个Button只是一个

图象!!!我并没有在paintComponent方法中重画Button呀。很怪的一个问题哦!这样才能解决这个问题啊?
2.还有如果将actionPerformed方法改成这样:
public void actionPerformed(ActionEvent evt)
{
             repaint();
             flag=false;
}
在调用repaint方法的时候也会调用paintComponent方法,这是什么道理啊?据我所知repaint方法是通过调用

update方法来重画组件的,而update是进行初始化(背景色填充、设置组件前景色)后调用paint()来绘制组件

。并没有说会调用paintComponent方法呀!
3.还有请各位高人帮我解释一下paintComponent方法的帮助好吗?这段帮助我看不太懂(主要是术语看不懂,而

不是英语看不懂):
protected void paintComponent(Graphics g)
If the UI delegate is non-null, calls its paint method. We pass the delegate a copy of the 

Graphics object to protect the rest of the paint code from irrevocable changes (for example, 

Graphics.translate()).
重点是何谓UI delegate?还有"We pass the delegate a copy of the Graphics object to protect the rest 

of the paint code from irrevocable changes"这句话的意识?

|
UI delegate 称为UI代表.
组件把实现其用户界面(UI)的任务交给一个UI代表来完成。UI代表是在他们组件的构造方法中实例化的,是被自动调用并创建的。

这里说一下UI代表的绘制:(Swing所有轻量组间组件绘制都是类似下面的过程)
paint()方法的调用顺序是:先调用paintCoponent()来实现组件本身的绘制,然后再绘制边框,接下来再绘制子组件。
而paintCoponent()其实完成的事情就是;调用该组件的UI代表的update方法,来实现组件绘制。

一般不建议重载paint方法,而是重载paintComponent()方法。

而且调用super。paintComponent()是必须的(对于不透明组件而言)。因为背景由组件的UI代表或者超类的paintComponent方法擦除。如果组件有一个UI代表,那么如果不调用super.component(),UI代表将没有机会进行绘制组件时它所要完成的那部分工作。

强烈建议: 第一部分 Swing技术中对于这个有比较好的介绍.
我也给你说不清楚:)

|
你在程序中最好不要直接调用paintComponent(Graphics g)方法的,此方法是为
容器刷新时,由容器来调用的,除非改控件显示格式,否则最好不要调用,即使调用也应该首先在其方法中调用super.paintComponent(g);

你程序逻辑是为了在刷新时画的图重画,所以你在控件重画时做此动作,此不妥,我给你写了相应的处理方法,如我给你的第二种解决方法。

解决方法一:
public void paintComponent(Graphics g)
{
    //添加如下方法
    super.paintComponent(g);

    if(flag==false)
        MyDraw(g);
}
      
      
解决方法二:(在panel的paint()中处理图像处理,RepaintPanel类改动如下,你可直接替换你的类)
class RepaintPanel extends JPanel implements ActionListener
{
    public RepaintPanel()
    {
        btnTest=new JButton("RepaintTest");
        add(btnTest);
        btnTest.addActionListener(this);
    }
    public void actionPerformed(ActionEvent evt)
    {
        flag=false;
        this.repaint();
    }
    public void paint(Graphics g) {
        super.paint(g);
        if(flag == false)
            g.drawRect(10,10,40,50);
    }  

    private JButton btnTest;
    private boolean flag=true;
}

      

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • solaris8 x86哪三个iso文件是需要刻的啊??
  • 学不好编程的三个原因
  • 我想取出所有的数据记录,然后一行三个一行三个的显示出来。。。一行够三个了就换行,怎么换到第二行?
  • Spring AOP中Pointcut,dvice 和 Advisor三个概念介绍
  • LINUX中装了三个网卡,三个网卡都是同个IP段,如何让他们不能互相访问?
  • 我在下载debian的时候发现有三个iso文件,有一个包含了businesscard这个单词,请问这三个iso文件个有什么用处啊?
  • 用信号量机制解决实际的三个进程同步问题
  • 虚拟机里linux系统下输入l,k,m三个字母不能正常显示,求解答
  • cut命令输出前三个字段
  • ??三个表的联合比对??
  • JSP常见的三个编译指令page、include、taglib
  • 三个网卡的网关配置问题? 非常急!!!
  • 【在线等待】JDK的三个版本有什么特点和差别?
  • shell如何取一个字符串中最右边的三个字符?
  • 三个vimrc文件有什么区别?
  • linux中的三个问题!!!
  • 三个容易bash脚本,高分求解
  • ls --color[=when] 参数为never always auto,这三个参数分别什么意思。
  • sa_sigaction 如何用第三个参数
  • 关于write函数的第三个参数的传递
  • ubuntu11.10 顶部面板的左端没有应用程序,位置和系统 这三个菜单。怎么启动终端
  • 我怎么用vm把三个linux组成一个局域网?


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3