在使用Java的绘画工具时,我遇到了java.awt.GradientPaint
类,它允许在绘制形状时进行渐变着色。我决定玩它,在JPanel上绘制带有红色到绿色渐变的填充矩形,并立即注意到一些奇怪的东西。
当我开始绘制一个矩形时,它是一个纯红色,在我将其高度或宽度增加到某个值后,会出现渐变。在某些情况下,在出现梯度之前,矩形的高度或宽度必须很大(即200px)。然后我注意到,在我开始绘制矩形的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) {}
}
答案 0 :(得分:3)
所以,基于JavaDocs
GradientPaint
公共GradientPaint(浮点x1,
漂浮y1,
颜色 color1,
float x2,
漂浮y2,
颜色 color2)
构造一个简单的非循环GradientPaint 对象。
参数:
x1 - x坐标 用户空间中第一个指定Point的值为y1-y 用户空间中第一个指定Point的坐标
color1 - 第一个指定点的颜色
x2 - 用户中第二个指定Point的x坐标 space
y2 - 第二个指定Point的y坐标 在用户空间
color2 - 指定的第二个颜色 点
(强调我加入)
x2
和y2
参数不是宽度和高度,而是实际坐标
这意味着像......
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
这样的东西,因为它有更多的选择,但只是我;)