java - 使用事件更改绘图程序中线条的颜色

标签 java swing graphics colors keylistener

我正在尝试创建一个使用点画线的程序。我已经完成了这一点。当程序最小化并再次最大化时,这条线需要重新绘制。这是我的第一个问题发生的地方。假设我画了 2 条线,第一条线的最后一个点和第二条线的第一个点在最大化时连接在一起。

然而,这不是我的主要问题。我想实现一个键处理程序,也就是说,当按下键 1-9 时,每个键代表该行的不同颜色变化。我已经尝试实现一个 key 处理程序,但显然出现了问题,因为我无法让它正常工作。任何帮助,将不胜感激。我的代码如下所示。

包第 2 部分;

导入 javax.swing.*;
导入 java.awt.*;
导入 java.awt.event.KeyEvent;
导入 java.util.ArrayList;
导入java.awt.Point;
导入 java.awt.Color;

公共(public)类 ScribbleComponentRepaint 扩展 JComponent 实现 Scribbler {
    int w = 640;
    整数 h = 360;
    c点;
    ArrayList 线;
    ArrayList> 行;

    public static void main(String[] args) {
        ScribbleComponentRepaint sc = new ScribbleComponentRepaint();
        新的 JEasyFrame(sc,“涂鸦”);
        sc.addMouseListener(新唱首歌(sc));
        sc.addMouseMotionListener(新移动器(sc));
        sc.addKeyListener(新键(sc));
    }

    公共(public) ScribbleComponentRepaint() {
        line = new ArrayList();
        lines = new ArrayList>();
    }

    public void handleKey(int e) {

        开关(e){
            案例 KeyEvent.VK_1:

                休息;
            默认: {
                System.out.println("默认");
            }
        }
    }


    public void paintComponent(Graphics g) {
        for (ArrayList line : lines) {
            诠释 n = 0;
            整数限制= 1;
            如果 (line.size() > 0) {
                对于(点 p :线){
                    点 c = line.get(Math.max(n - limit, 0));
                    n++;
                    g.setColor(Color.RED);
                    g.drawLine(c.x, c.y, p.x, p.y);
                }
            }
        }
    }

    public void penDown(Point p) {
        c = p;

    }

    public void penUp(Point p) {
        画到(p);
        c = 空;

    }

    public void drawTo(Point p) {
        如果(c!=空){
            图形 g = getGraphics();
            g.setColor(Color.BLUE);
            g.drawLine(c.x, c.y, p.x, p.y);
            c = p;
        }
        line.add(c);
        lines.add(线);

    }

    public void drag(Point p) {
       //不应该为空
        画到(p);
    }


    公共(public)维度 getPreferredSize() {
        返回新维度(w,h);
    }

}

包第 2 部分;

导入 java.awt.event.KeyAdapter;
导入 java.awt.event.KeyEvent;

公共(public)类 key 扩展 KeyAdapter {

    涂鸦者;

    公钥(Scribbler sc){
        这个.sc = sc;
    }

    public void keyPressed(KeyEvent e) {
       //System.out.println(k);
        sc.handleKey(e.getKeyCode());
    }
}

包第 2 部分;

导入 java.awt.*;

公共(public)接口(interface) Scribbler {
    public void paintComponent(Graphics g);
    public void penDown(Point p);
    public void drag(Point p);
    public void penUp(Point p);
    public void handleKey(int e);
}

最佳答案

在主程序结束时:

    sc.setFocusable(true);
    sc.requestFocusInWindow();

顺便说一句

  • 应在 EDT 上构建 GUI。
  • 考虑使用键绑定(bind)代替 KeyListener
  • 设计精美的代码(既定义了接口(interface)又对其进行了编码),但为了尽快获得更好的帮助,请发布 SSCCE .我不得不对代码进行一些更改,然后才能测试我的理论,即检测键的问题是“焦点”。

关于java - 使用事件更改绘图程序中线条的颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9749660/

相关文章:

algorithm - 如何绕任意轴旋转?

java - 将单用户 Apache Derby 数据库转换为用户数据库

java - 如何更改 Java 应用程序中的默认插入符?

javafx 颜色解析

java - 如何使一组 jbuttons 在 java 中不可见

java - 使用Keylistener后如何重新绘制图形?

java - 方法退出方法

java - 调整图像大小使其适合 JPanel 网格

java - 如何为虚拟屏幕运行我的 Java 应用程序?

c++ - 你能从 gltf 文件中得到一个明确的骨架吗?