关于允许用户画线的 Java 挑战第 2 部分

标签 java graphics drawing awt mouseevent

我的问题已在 Java Challenge on Permitting the User to Draw A Line 中提到过但是,我仍然遇到困难,因为单击并拖动鼠标时我的应用程序上没有出现任何线条。

回答这个问题肯定会帮助大多数初学者程序员更好地理解图形类和绘图,这是一个通常很复杂的过程,特别是对于初学者来说。

根据我正在使用的文本(因为我正在自学Java),这是如何使用Java画线的示例:

/*
 * LineTest
 * Demonstrates drawing lines
 */

import java.awt.*;
public class LineTest extends Canvas {

public LineTest() {
    super();
    setSize(300, 200);
    setBackground(Color.white);
}

public static void main(String args[]) {
    LineTest lt = new LineTest();
    GUIFrame frame = new GUIFrame("Line Test");
    frame.add(lt);
    frame.pack();
    frame.setVisible(true);
}

public void paint(Graphics g) {
    g.drawLine(10, 10, 50, 100);
    g.setColor(Color.blue);
    g.drawLine(60, 110, 275, 50);
    g.setColor(Color.red);
    g.drawLine(50, 50, 300, 200);
}
}

规范为:

Create an application that allows you to draw lines by clicking the initial 
point and draggingthe mouse to the second point. The application should be 
repainted so that you can see the line changing size and position as you
are dragging the mouse. When the mouse button is eleased, the line is drawn.

正如您所认识到的,运行该程序不会由用户创建任何绘图。我相信遇到此错误是由于缺少 mouseReleased 方法。

非常感谢任何帮助。预先感谢您就此事所付出的所有时间和合作。

我回答问题的代码是:

import java.awt.*;
import java.awt.event.*;

public class LineDrawer2 extends Canvas {

    int x1, y1, x2, y2;

      public LineDrawer2() {
          super();
    setSize(300,200);
    setBackground(Color.white);
      }

public void mousePressed(MouseEvent me) {
          int x1 = me.getX();
    int y1 = me.getY();
          x2 = x1;
    y2 = y1;
    repaint();
}

      public void mouseDragged(MouseEvent me) {
    int x2 = me.getX();
    int y2 = me.getY();
    repaint();
}

public void mouseReleased(MouseEvent me) {
}

      public void paint(Graphics g) {
    super.paint(g);
    g.setColor(Color.blue);
          g.drawLine(x1, y1, x2, y2);
}

public static void main(String args[]) {
    LineDrawer2 ld2 = new LineDrawer2();
    GUIFrame frame = new GUIFrame("Line Drawer");
    frame.add(ld2);
    frame.pack();
    frame.setVisible(true);
}

public void mouseMoved(MouseEvent me) {
}
public void mouseClicked(MouseEvent me) {
}
public void mouseEntered(MouseEvent me) {
}
public void mouseExited(MouseEvent me) {
}

}

P.S.:我从上次回复中了解到这是一种旧格式,但是,如果可能的话请让我知道使用旧格式,我也一定会学习新格式。我衷心感谢。

最佳答案

您正在初始化局部变量,而不是初始化事件处理方法中的字段。而不是

int x2 = me.getX();
int y2 = me.getY();

应该是

this.x2 = me.getX();
this.y2 = me.getY();

或者简单地

x2 = me.getX();
y2 = me.getY();

编辑:

另一个问题是,即使你的类有 mousePressed()、mouseDragged() 等方法,它也没有实现 MouseListener 和 MouseMotionListener。最后,它不会向自身添加任何此类监听器。所以代码应该修改如下:

public class LineDrawer2 extends Canvas implements MouseListener, MouseMotionListener {
    ...
    public LineDrawer2() {
        ...
        addMouseListener(this);
        addMouseMotionListener(this);
    }

我的建议:每次向类添加方法(例如 mousePressed()),并且该方法应该覆盖类或接口(interface)中的方法时,请用 @Override。这样,如果该方法实际上没有重写任何方法,编译器将生成编译错误:

@Override
public void mousePressed(MouseEvent e) {

}

关于关于允许用户画线的 Java 挑战第 2 部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14092551/

相关文章:

java - Java 中是否有接受多个引号字符的 CSVReader 类?

java - 如何在同一个工作台中运行Eclipse插件?

java - 如何为现有代码记录List接口(interface)方法

java - 为 Java long 类型设置第 32 位会产生 -1

ios - 在 drawrect 方法中绘制带动画的矩形?

C# 画线 OnPaint() 与 CreateGraphics()

xcode - XCode和Qt之间的犹豫

java - 在哪个监视器面板中运行我的 Swing GUI?

math - 点序列插值

java - 为什么我的绘图面板在调整窗口大小时有时会绘画而有时不会?