Играя с инструментами рисования 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) {}
}
LinearGradientPaint
. 30.01.2015