【问题标题】:Can't set color in paintComponent无法在paintComponent中设置颜色
【发布时间】:2014-04-04 20:28:11
【问题描述】:

我正在编写一个 "paint" 模拟程序(它从 HashSets 中绘制矩形和线条),但我在为点和线着色时遇到了问题。这是我的代码:

package paint;

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import java.awt.geom.Line2D;
import java.awt.geom.Point2D;
import java.util.HashSet;

import javax.swing.JComponent;

public class Draw extends JComponent {
private HashSet<Point2D> points = new HashSet<>();
private HashSet<Line2D> lines = new HashSet<>();
private final int WIDTH = 5, HEIGHT = 5;
private Point2D prevPoint, nextPoint;

public Draw() {
    addMouseListener(new MouseAdapter() {
        @Override
        public void mousePressed(MouseEvent e) {
            super.mousePressed(e);
            if (e.getButton() == MouseEvent.BUTTON1) {
                prevPoint = e.getPoint();
                points.add(prevPoint);
                repaint();
            }
        }

    });

    addMouseMotionListener(new MouseMotionAdapter() {
        @Override
        public void mouseDragged(MouseEvent e) {
            super.mouseDragged(e);
            nextPoint = e.getPoint();
            Line2D line = new Line2D.Double(prevPoint, nextPoint);
            lines.add(line);
            prevPoint = nextPoint;
            repaint();
        }
    });
}

@Override
protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    Graphics2D g2d = (Graphics2D) g;
    for (Point2D p : points) {
        int x = (int)p.getX() - (WIDTH / 2);
        int y = (int)p.getY() - (HEIGHT / 2);
        g2d.setColor(getColor());
        g2d.fillRect(x, y, WIDTH, HEIGHT);
        g2d.drawRect(x, y, WIDTH, HEIGHT);
    }

    for (Line2D l : lines) {
        g2d.setColor(getColor());
        g2d.setStroke(new BasicStroke(WIDTH));
        g2d.draw(l);
    }
}

public Color getColor() {
    Tools t = new Tools();
    return t.getColor();
}

}


package paint;

import java.awt.Color;
import java.awt.event.ActionEvent;

import javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JPanel;

public class Tools extends JPanel {
private Color color;
private JButton button;
private ButtonColor bc;

public Tools() {
    makeButton("black", Color.BLACK);
    makeButton("green", Color.GREEN);
}

public void makeButton(String name, final Color color) {
    bc = new ButtonColor(name, color);
    add(new JButton(bc));
}

private class ButtonColor extends AbstractAction {

    public ButtonColor(String name, Color color) {
        putValue(NAME, name);
        putValue(SHORT_DESCRIPTION, "Choose " + name.toLowerCase() + " color");
        putValue("color", color);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        color = (Color) getValue("color");
        System.out.println(color);
    }

}

public Color getColor() {
    System.out.println(color);
    return color;
}

}

现在,当我按下黑色或绿色按钮时,控制台打印了 java.awt.Color[r=0,g=0,b=0]java.awt.Color[r=0,g=255,b=0]。但是当我尝试画线时,它会打印出null

如何更改方法Draw.getColor() 以使更改颜色成为可能?

【问题讨论】:

    标签: java paint paintcomponent


    【解决方案1】:

    每次调用paintComponent 时,您都使用上次设置的颜色。

    您需要做的是将颜色与当前活动相关联,以便在调用paintComponent 时,您可以查找正在绘制的形状的颜色。

    您可以创建一个包含Line 和颜色值的自定义类,并将它们添加到您的列表中。当您绘制Line 时,您也会查找要使用的颜色

    你需要为你的积分做同样的事情

    【讨论】:

    • 好主意!我已经改变了它,代码看起来更具可读性和灵活性。
    • 但问题在于类工具中的私有颜色颜色。我将其更改为私有静态颜色颜色,现在它工作正常。当然问题是:它安全吗,还是会出现其他不好的事情?
    • 不。颜色应该与您正在绘制的当前元素相关,而不是您正在绘制的画布
    猜你喜欢
    • 2015-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-04
    • 2014-03-29
    相关资源
    最近更新 更多