【问题标题】:java paint () auto executed?java paint() 自动执行?
【发布时间】:2011-11-10 12:25:46
【问题描述】:
import java.awt.*;
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.event.*;
import java.awt.geom.*;
import java.util.*;

public class test extends JFrame implements ActionListener, MouseListener {

    private Vector<String> vlist = new Vector<String> ();
    private int mouseX, mouseY;
    Canvas c = new Canvas();

    public test () {
        setSize(400,400);
        addMouseListener(this);

    }

    public static void main(String[] args) {


        java.awt.EventQueue.invokeLater(new Runnable() {
              public void run() {
                    test frame = new test();
                    //frame.setBackground(Color.yellow); 
                    frame.setVisible(true);
              }
        });
    }

    public void actionPerformed(ActionEvent ae) {

    }

    @Override
    public void paint(Graphics g) {

        Shape circle = new Ellipse2D.Float(100f, 100f, 100f, 100f);
        Graphics2D ga = (Graphics2D)g;
        ga.draw(circle);

    }

    public void move() {

    }

    public void drawCircle(int x, int y) {

    }

    public void mouseClicked(MouseEvent e) {
        repaint();

    }

    public void mouseExited(MouseEvent e) {

    }

    public void mousePressed(MouseEvent e) {
        this.mouseX=e.getX();
        this.mouseY=e.getY();
    }

    public void mouseReleased(MouseEvent e) {

    }

    public void mouseEntered(MouseEvent e) {

    }
}

我想写一个测试程序来学习java中的图形编程。运行上述代码,会自动绘制圆。为什么paint() 方法会自动执行?我点击鼠标时要创建的圆圈。

【问题讨论】:

  • 除了其他更具体的建议 1) 不要将 Swing 组件(例如 JFrame)与 AWT(例如 Canvas)混合。 2) setSize(400,400); 设置自定义渲染组件的引用大小,并在添加到框架后调用pack()。 3) 如果不需要同步,请使用ArrayList 而不是Vector

标签: java


【解决方案1】:

为类添加一个属性。

boolean draw;

paint(...)中的代码括起来
if (draw) {
    // existing code
}

这将使程序仅在draw 为真时绘制。最初,它是假的,所以它不会绘制任何东西。当鼠标点击时,值属性draw 将为true

public void mouseClicked(MouseEvent e) {
    draw = true;
    repaint();
}

【讨论】:

    【解决方案2】:

    Swing 绘制管理器在呈现 JFrame 时调用绘制方法。有关此内部工作原理的更多详细信息,请参阅Painting in AWT and Swing

    要改进您的程序,您需要

    • 在 JPanel 或其他继承自 JComponent 的组件中进行绘图。
    • 在 JPanel 的 paintComponent 方法中进行实际绘制,而不是在 paint 方法中。
    • 先调用 super.paintComponent() 方法。
    • 如果您想在鼠标单击时绘制圆形,则在 paintComponent 方法中添加一个 if 块,以便仅在某个类字段 boolean 为 true 时绘制圆形 - 然后在 MouseListener 中将其设置为 true,然后调用 repaint。
    • 最重要的是,阅读有关如何制作 Swing 图形的教程,因为其中的大部分内容有些违反直觉(Tom 在此线程中的回答证明了这一点)。

    【讨论】:

      【解决方案3】:

      您不应该重写 JFrame 的 paint() 方法来进行自定义绘画。

      您应该重写 JPanel 或 JComponent 的 paintComponent() 方法并将该组件添加到 JFrame。

      查看Custom Painting 上的 Swing 教程了解基础知识。

      查看Painting in AWT and Swing了解详细信息。

      【讨论】:

        猜你喜欢
        • 2011-05-07
        • 2011-01-17
        • 1970-01-01
        • 1970-01-01
        • 2012-06-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-04-19
        相关资源
        最近更新 更多