Использование Graphics FillOval с градиентной краской удаляет несколько пикселей - PullRequest
0 голосов
/ 24 сентября 2019

Я пытаюсь написать свою собственную кнопку для проекта UI passion на Java, и я хочу добавить градиент в качестве подсветки наведения на кнопку.Кнопка также должна иметь рамку, поэтому для сплошных цветов я просто использую метод fillOval, а затем метод drawOval для рисования для границы.

Это работает, как и предполагалось, для сплошных цветов, но по какой-то причине при использовании градиентной краски в правой нижней части овала отсутствуют некоторые пиксели.

Вот мои методы рисования:

    @Override
    public void paintComponent(Graphics g) {
        g.setColor(getParent().getBackground());
        g.fillRect(0,0,getWidth(),getHeight());
        Graphics2D g2D = (Graphics2D)g;
        if (hit){
            g2D.setPaint(Color.green);
        }else if(focus){
            g2D.setPaint(this.createGradient());
        }else{
            g2D.setPaint(Color.RED);
        }

        this.paintButton(g2D);
        this.paintBorder(g2D);
    }

    private void paintButton(Graphics2D g){
        switch (this.shape){
            case SQUARE:
                g.fillRect(0,0,getWidth() - 1,getHeight() - 1);
                break;
            case OVAL:
                g.fillOval(0,0,getWidth() -1 ,getHeight() - 1);
                break;
        }
    }

    private void paintBorder(Graphics2D g){
        g.setPaint(this.borderColor);
        switch (this.shape){
            case OVAL:
                g.drawOval(0,0,getWidth() - 1,getHeight() - 1);
                break;
            case SQUARE:
                g.drawRect(0,0,getWidth() - 1,getHeight() - 1);
                break;
        }
    }

    private LinearGradientPaint createGradient(){
        Point2D start = new Point2D.Float(0, 0);
        Point2D end = new Point2D.Float(getWidth()-1, 0);
        Float mousePoint = (float)mouseLocation.x / getWidth();
        if(mousePoint == 0) {
            mousePoint = 0.1f;
        }
        float[] dist = {0.0f, mousePoint, 1.0f};
        Color[] colors = {Color.RED, Color.GREEN, Color.RED};
        return new LinearGradientPaint(start, end, dist, colors);
    }

Это изображение со сплошным цветом, и вы можете видеть, что оно красиво заполнено

Здесь вы можете увидеть внизукруг с белыми и мешающими пикселями

Это мой первый вопрос, поэтому любые комментарии / предложения по форматированию моего вопроса приветствуются.

1 Ответ

0 голосов
/ 25 сентября 2019

для этого

g.setColor(getParent().getBackground());
        g.fillRect(0,0,getWidth(),getHeight());

лучше

component.setOpaque(false);

вне метода рисования.

по некоторым причинам рендеринга графики в свинге лучше соблюдать егоЯ не уверен, но это может повлиять на рисунок в вашем случае.

, но я уверен, что это те пиксели, в которых, как ожидается, в вашем случае используется псевдонимная графика (Graphics2D по умолчанию), поэтому вы можете попробоватьвизуализируйте его снова с помощью

g2d.getRenderingHints().put(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

, когда я запустил ваш код (с небольшим кодом для динамического изменения размера), я увидел, что некоторые пиксели были пропущены, как вы сказали, но честно, я не следил за изменениемпо правилам изменения, поэтому, когда я применил инструкции, которые я упомянул выше, это сработало отлично, вы сами определяете, где это было.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...