【问题标题】:GradientPaint Working StrangelyGradientPaint 工作异常
【发布时间】:2015-01-30 04:11:08
【问题描述】:

在使用 Java 的绘画工具时,我遇到了 java.awt.GradientPaint 类,它允许在绘制形状时进行渐变着色。我决定试一试,在 JPanel 上绘制具有从红到绿渐变的填充矩形,并立即发现了一些奇怪的东西。

当我开始画一个矩形时,它是纯红色的,当我将它的高度或宽度增加到一定值后,就会出现渐变。在某些情况下,矩形的高度或宽度必须很大(即 200 像素)才能显示渐变。然后我注意到,越靠近我开始绘制矩形的 JPanel 的右侧或底部,在应用渐变之前矩形的大小就必须越大。下面的 GIF 应该(希望)显示发生了什么(用于创建此示例的代码在更下方):

那么为什么会发生这种情况?有没有办法在绘制矩形后立即将渐变应用于矩形?

(另外,有人知道在显示最后一帧后重新启动 GIF 动画的方法吗?)

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Test extends JPanel implements MouseListener, MouseMotionListener {
    int downX, downY, dragX, dragY;
    JComboBox combobox;
    String[] directions = {"Left-Right","Up-Down","Right-Left","Down-Up"};

    public Test() {
        JFrame frame = new JFrame();
        frame.setLayout(new BorderLayout());
        setPreferredSize(new Dimension(300,300));
        frame.add(this,BorderLayout.CENTER);

        combobox = new JComboBox(directions);
        frame.add(combobox,BorderLayout.NORTH);

        addMouseListener(this);
        addMouseMotionListener(this);

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setVisible(true);
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D) g.create();
        if (combobox.getSelectedItem().equals(directions[0]))
            g2.setPaint(new GradientPaint(downX,downY,Color.red,dragX-downX,downY,Color.green));
        else if (combobox.getSelectedItem().equals(directions[1]))
            g2.setPaint(new GradientPaint(downX,downY,Color.red,downX,dragY-downY,Color.green));
        else if (combobox.getSelectedItem().equals(directions[2]))
            g2.setPaint(new GradientPaint(dragX-downX,downY,Color.red,downX,downY,Color.green));
        else if (combobox.getSelectedItem().equals(directions[3]))
            g2.setPaint(new GradientPaint(downX,dragY-downY,Color.red,downX,downY,Color.green));

        g2.fill(new Rectangle(downX,downY,dragX-downX,dragY-downY));
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new Test();
            }
        });
    }

    @Override
    public void mousePressed(MouseEvent ev) {
        downX = ev.getX();
        downY = ev.getY();
    }

    @Override
    public void mouseDragged(MouseEvent ev) {
        dragX = ev.getX();
        dragY = ev.getY();
        repaint();
    }

    @Override public void mouseClicked(MouseEvent ev) {} 
    @Override public void mouseEntered(MouseEvent ev) {}
    @Override public void mouseExited(MouseEvent ev) {}
    @Override public void mouseReleased(MouseEvent ev) {}
    @Override public void mouseMoved(MouseEvent ev) {}
}

【问题讨论】:

    标签: java swing drawing gradient


    【解决方案1】:

    所以,基于JavaDocs

    GradientPaint
    public GradientPaint(float x1,
    浮动 y1,
        颜色 color1,
        浮点 x2,
    float y2,
        颜色 color2)

    构造一个简单的非循环 GradientPaint 对象。

    参数:
      x1 - x 坐标 用户空间中的第一个指定点
      y1 - y 用户空间中第一个指定点的坐标
    color1 - 第一个指定点的颜色
    x2 - 用户中第二个指定点的 x 坐标 space
      y2 - 第二个指定点的 y 坐标 在用户空间中

      color2 - 在第二个指定的颜色 点

    (重点由我添加)

    x2y2参数不是宽度和高度,而是实际坐标

    这意味着类似...

    g2.setPaint(new GradientPaint(downX,downY,Color.red,dragX-downX,downY,Color.green));
    

    实际上应该是……

    g2.setPaint(new GradientPaint(downX, downY, Color.red, dragX, downY, Color.green));
    

    就我个人而言,我更喜欢使用 LinearGradientPaint 之类的东西,因为它有更多选择,但只有我一个人;)

    【讨论】:

    • 嘿,这将教会我更多地关注 Javadocs 所说的内容。不过,谢谢;这一直困扰着我一段时间。我也一定会看看LinearGradientPaint
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多