当前位置: 技术问答>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"这句话的意识?
请各位网友帮忙看一下这段程序:
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技术中对于这个有比较好的介绍.
我也给你说不清楚:)
组件把实现其用户界面(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;
}
容器刷新时,由容器来调用的,除非改控件显示格式,否则最好不要调用,即使调用也应该首先在其方法中调用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;
}