Свинг Darwn прямоугольник имеет разрыв - PullRequest
0 голосов
/ 05 марта 2019

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

import javax.swing.*;
import javax.swing.border.Border;
import java.awt.*;

class DropShadowPanel extends JPanel {

    private static final long serialVersionUID = 1L;

    public int pixels;

    public DropShadowPanel(int pix) {
        setOpaque(false);
        this.pixels = pix;
        Border border = BorderFactory.createEmptyBorder(pixels, pixels, pixels, pixels);
        this.setBorder(BorderFactory.createCompoundBorder(this.getBorder(), border));
        this.setLayout(new BorderLayout());
    } 

    @Override
    protected void paintComponent(Graphics g) {
        Graphics2D g2d = (Graphics2D)g;
        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        int shade = 0;
        int topOpacity = 60;
        for (int i = 0; i <= pixels; i++) {
            g2d.setColor(Color.black);
            g2d.drawRect(i, i, this.getWidth() - ((i * 2)), this.getHeight() - ((i * 2)));  // Originally i*2+1,but i fix it the problem also appears.
       }
    }

    @Override
    public Dimension getPreferredSize() {
        return new Dimension(200, 200);
    }
}

public class  Main {
    public static void main(String[] args) {
        JFrame jFrame = new JFrame("Test");
        JPanel panel = new JPanel();
        panel.add(new DropShadowPanel(20));
        jFrame.add(panel);
        jFrame.pack();
        jFrame.setVisible(true);
    }
}

Теперь я обновил полный код.Чтобы прояснить проблему, я изменил цвет в коде на черный.

Это проблемные изображения: enter image description here

enter image description here

1 Ответ

0 голосов
/ 05 марта 2019

Вы пропускаете пиксель.В цикле for в методе paintComponent().

Когда i равен 0 (нулю), вызов drawRect() равен ...

drawRect(0, 0, this.getWidth() - 1, this.getHeight() - 1);

и когда i равно 1 (одному), вызов drawRect() - это ...

drawRect(1, 1, this.getWidth() - 3, this.getHeight() - 3)

другими словами, вы пропускаете 2 (два).

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