Arhn - архитектура программирования

GradientPaint работает странно

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

Ответы:


1

Итак, на основе JavaDocs

GradientPaint
public GradientPaint(float x1,
float y1,
Color color1,
float x2,
float y2,
Color color2)

Создает простой ациклический объект GradientPaint.

Параметры:
x1 - координата x первой указанной точки в пользовательском пространстве
y1 - координата y первой указанная точка в пространстве пользователя
color1 — цвет первой указанной точки
x2 — координата x второй указанной точки в пространстве пользователя
y2 — координата 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 так как у него больше возможностей, но это только я;)

30.01.2015
  • Хех, это научит меня обращать больше внимания на то, что говорят Javadocs. Спасибо хоть; это беспокоило меня какое-то время. Обязательно посмотрю и LinearGradientPaint. 30.01.2015
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..