使用不显示Java的MouseAdapter绘制一条线

时间:2016-02-14 00:23:22

标签: java graphics line draw mouselistener

找到此示例代码,该代码应在单击后生成绘制的行,但不显示任何内容或有效。假设所有import语句都是正确的,代码没有错误,我不知道为什么它不起作用。线条颜色为红色,背景为白色,因此如果有效则应清晰显示。鼠标监听器似乎也是正确的。这个代码不起作用的原因是什么?

public class PathPanel extends JPanel {

/**
 * The panel width.
 */
public static final int WIDTH = 400;

/**
 * The panel height.
 */
public static final int HEIGHT = 400;

/**
 * The background color of the panel.
 */
public static final Color BACKGROUND_COLOR = Color.WHITE;

/**
 * The color to paint with.
 */
public static final Color FOREGROUND_COLOR = Color.RED;

/**
 * The line width.
 */
public static final int LINE_WIDTH = 8;

// Instance Fields

/**
 * 
 */
private static final long serialVersionUID = -3644129903653409515L;

/**
 * The path being created.
 */
private final Path2D myPath;

// OR you could use Path2D.Double instead of GeneralPath

// Constructor

/**
 * Constructs a new general path panel.
 */
public PathPanel() {
    super();
    myPath = new GeneralPath();
    myPath.setWindingRule(GeneralPath.WIND_EVEN_ODD);

    //myPath = new Path2D.Double();

    setPreferredSize(new Dimension(WIDTH, HEIGHT));
    setBackground(BACKGROUND_COLOR);
    addMouseListener(new MyMouseListener());
}

/**
 * Paints the current path.
 * 
 * @param theGraphics The graphics context to use for painting.
 */
@Override
public void paintComponent(final Graphics theGraphics) {
    super.paintComponent(theGraphics);
    final Graphics2D g2d = (Graphics2D) theGraphics;

    g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                         RenderingHints.VALUE_ANTIALIAS_ON);
    g2d.setPaint(FOREGROUND_COLOR);
    g2d.setStroke(new BasicStroke(LINE_WIDTH));
    g2d.draw(myPath);
}

// Main Method

/**
 * Creates and displays a GeneralPathPanel.
 * 
 * @param theArgs Command line arguments (ignored).
 */
public static void main(final String... theArgs) {
    final PathPanel panel = new PathPanel();
    final JFrame frame = new JFrame("GeneralPathPanel Demo");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.add(panel);
    frame.pack();
    frame.setLocationRelativeTo(null);
    frame.setVisible(true);
}

// Inner Class

/**
 * Listens for mouse clicks, to draw on our panel.
 */
private class MyMouseListener extends MouseAdapter {
    /**
     * Handles a click event.
     * 
     * @param theEvent The event.
     */
    @Override
    public void mouseClicked(final MouseEvent theEvent) {

        if (myPath.getCurrentPoint() == null) {
            myPath.moveTo(theEvent.getX(), theEvent.getY());
        } else if (theEvent.getClickCount() == 2) {
            myPath.closePath();
        } else {
            myPath.lineTo(theEvent.getX(), theEvent.getY());
        }
        repaint();
    }
}

}

1 个答案:

答案 0 :(得分:0)

您发布的示例代码对我来说很好。您是否尝试在System.out.println()方法中添加mouseClicked(final MouseEvent theEvent)来检查它是否实际被调用?如果未调用,您可以尝试将其更改为mouseReleased

我使用的进口商品:

import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.geom.GeneralPath;
import java.awt.geom.Path2D;