关于awt,swing组件的绘制问题。

Java中awt和swing中,给每个组件(按钮,面板等)都提供了paint()方法来对组件进行绘制,我想问问,这个绘制在程序初始化后就开始了还是等调用repaint()... Java中awt和swing中,给每个组件(按钮,面板等)都提供了 paint() 方法来对组件进行绘制,我想问问,这个绘制在程序初始化后就开始了还是等调用repaint()方法后才绘制,还有,关于那个paint()方法中参数 Graphics g 的用法,谁能详细介绍介绍,我用它的时候,总是很迷茫。前几天写个画直线的小程序,鼠标拖动的时候总是不显示直线,等鼠标放开后,直线才出来。分我这里有,如果答案满意,我会毫不吝啬的。
一楼可不可以多说点??呵呵……另外,那个Painting in AWT and Swing有没有中文版的,英文看久了头晕。二楼的,我又不是要代码,我只想准确的理解这个方法的含义,确保自己以后会使用它,就算我看得懂你的代码,也不见得我就会灵活的用这个方法了,加油!!
展开
 我来答
百度网友e588d08
2010-05-17 · TA获得超过664个赞
知道小有建树答主
回答量:352
采纳率:0%
帮助的人:257万
展开全部
public void paint(Graphics g)绘制此组件。
应该绘制组件的内容时调用此方法;例如首次显示组件或者组件已损坏并需要修复时。Graphics 参数中的剪贴区矩形设置为需要绘制的区域。重写此方法的 Component 子类不需要调用 super.paint(g)。

出于性能的考虑,首次显示宽度或高度为 0 的 Component 时认为它不需要进行绘制,并且也不需要修复。

注:有关 AWT 和 Swing 所用绘制机制的更多信息,包括如何编写最高效的绘制代码的信息,请参阅 Painting in AWT and Swing。

参数:
g - 用于绘制的图像上下文

以上是java api中对这个函数的解释,我想你的第一个问题已经回答了,就是第一次是就已经绘制了。调用repaint()方法是你对组件有刷新操作时,需要重画组件时,才会调用。

第二个问题:这个Graphics g是java程序虚拟出的一个屏幕,并非是硬件上的显示屏,因为硬件上的显示屏只有一个,现在系统又可以同时跑很多程序,如果每个程序都有要显示屏的权利,那么你的屏幕资源只能供你使用一个程序,这个硬件的显示屏只有操作系统才有权利来图画,而操作系统要求每个程序都虚拟出一个显示屏,然后操作系统协调各个程序来进行真正显示屏上的图画操作。
g的用法有很多,这里不便都写上。建议看java api的文档,下载地址上网找一下,会很多,如果找不到,请给我发E-mail:milky0915@126.com,我会给你发一份过去。。。
ZESTRON
2024-09-04 广告
在Dr. O.K. Wack Chemie GmbH,我们高度重视ZESTRON的表界面分析技术。该技术通过深入研究材料表面与界面的性质,为提升产品质量与可靠性提供了有力支持。ZESTRON的表界面分析不仅涵盖了相变化、化学反应、吸附与解吸... 点击进入详情页
本回答由ZESTRON提供
hardneedl
2010-05-17 · TA获得超过921个赞
知道小有建树答主
回答量:1353
采纳率:57%
帮助的人:606万
展开全部
如认可,请您赏分200分 谢谢
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
/**
* @author Hardneedl
*/
class LineBrush extends JFrame {
private static final Dimension minSize = new Dimension(300, 200);
private static final Dimension maxSize = new Dimension(1024, 768);
private static final Dimension preferredSize = new Dimension(600, 400);

public Dimension getMaximumSize() {return maxSize;}
public Dimension getMinimumSize() {return minSize;}
public Dimension getPreferredSize() {return preferredSize;}
public String getTitle() {return "Line Brush";}

private _Brush brush = new _Brush();
private JComponent canvas = new JComponent(){
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(Color.BLACK);
g.fillRect(0,0,getWidth(),getHeight());
brush.doPaint(g);
}
};
LineBrush() throws HeadlessException {
doLay();
attachListeners();
}

private void doLay() {
Container container = getContentPane();
container.add(canvas,BorderLayout.CENTER);
pack();
}

private void attachListeners() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
canvas.addMouseListener(new MouseAdapter(){

public void mousePressed(MouseEvent e) {
brush.setStartPoint(e.getX(),e.getY());
if (canvas.isVisible()){
canvas.paintImmediately(0,0,canvas.getWidth(),canvas.getHeight());
}
}

});

canvas.addMouseMotionListener(new MouseAdapter(){
public void mouseDragged(MouseEvent e) {
brush.setEndPoint(e.getX(),e.getY());
if (canvas.isVisible()){
canvas.paintImmediately(0,0,canvas.getWidth(),canvas.getHeight());
}
}
});
}

private interface Brush {
void doPaint(java.awt.Graphics g);
}

private class _Brush implements Brush {
private int sx=0,sy=0,ex=0,ey=0;
private void setStartPoint(int x,int y){sx = x;sy = y;}
private void setEndPoint(int x,int y){ex=x;ey=y;}
private Stroke stroke = new BasicStroke(2.0f);
public void doPaint(Graphics g) {
Graphics2D gg = (Graphics2D)g.create();
gg.setColor(Color.YELLOW);
gg.setStroke(stroke);
gg.drawLine(sx,sy,ex,ey);
gg.dispose();
}
}

public static void main(String[] args) {
new LineBrush().setVisible(true);
}
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式