使用paint或repaint方法在applet JAVA上绘制线条

时间:2013-03-22 08:44:28

标签: java swing applet awt paint

我想知道是否可以在applet上绘制线条。我正在从外部源加载applet,但我想绘制光标在屏幕上的行。

有人可以告诉我,我该怎么做?

这是一个例子。

  g.drawLine(mouse.getLocation().x - 6, mouse.getLocation().y,
            mouse.getLocation().x + 6, mouse.getLocation().y);
            g.drawLine(mouse.getLocation

            ().x, mouse.getLocation().y - 6,


            mouse.getLocation().x, mouse.getLocation().y + 6);

1 个答案:

答案 0 :(得分:2)

  

我想知道是否可以在小程序上绘制线条。

当然可以。只需在applet中放置一个面板,添加鼠标动作监听器并根据事件在该面板上绘制。

说明这个

的小例子
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JApplet;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class TestAppletDraw extends JApplet {

    public static class MyDrawPanel extends JPanel {

        private List<Point> points = new ArrayList<Point>();

        public MyDrawPanel() {
            setBackground(Color.WHITE);
            MouseAdapter listener = new MouseAdapter() {

                @Override
                public void mouseClicked(MouseEvent e) {
                    points.clear();
                    repaint();
                }

                @Override
                public void mouseMoved(MouseEvent e) {
                    points.add(e.getPoint());
                    repaint();
                }
            };
            addMouseListener(listener);
            addMouseMotionListener(listener);
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(300, 300);
        }

        @Override
        protected void paintComponent(java.awt.Graphics g) {
            super.paintComponent(g);
            Point p1 = null;
            Point p2 = null;
            g.setColor(Color.BLUE);
            for (Point p : points) {
                p2 = p1;
                p1 = p;
                if (p1 != null && p2 != null) {
                    g.drawLine(p1.x, p1.y, p2.x, p2.y);
                }
            }
        }
    }

    protected void initUI() {
        add(new MyDrawPanel());
        validate();
    }

    @Override
    public void init() {
        super.init();
        try {
            SwingUtilities.invokeAndWait(new Runnable() {
                @Override
                public void run() {
                    initUI();
                }
            });
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

}

注意:使用缓冲图像而不是存储点可能会在很长一段时间内更具可扩展性(否则点列表会变得很大)但是它需要处理面板尺寸的增加。