Тот же код, другая работа (JAVA Графика XOR режим) - PullRequest
0 голосов
/ 13 апреля 2020

мы с моим другом выполняем один и тот же код, но работаем по-разному.

@Override
public void paint(Graphics g) {
    super.paint(g);
    g.setXORMode(getBackground());

    Polygon p = new Polygon();
    p.addPoint(50, 50);
    p.addPoint(150, 150);
    g.drawPolygon(p);
}

enter image description here это изображение - код запуска на моем компьютере. enter image description here, и эта картинка - код запуска на моем другом компьютере. Почему? как это может произойти!

1 Ответ

0 голосов
/ 15 апреля 2020

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

Следующий код решает проблему для меня:

import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Polygon;
import java.awt.RenderingHints;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class Main extends JPanel {
    @Override
    protected void paintComponent(final Graphics g) {
        super.paintComponent(g);

        final Graphics2D g2d = (Graphics2D) g.create();

        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); //This line fixed the problem for me.

        g2d.setXORMode(getBackground());

        final Polygon p = new Polygon();
        p.addPoint(50, 50);
        p.addPoint(150, 150);
        g2d.drawPolygon(p);

        g2d.dispose();
    }

    public static void main(final String[] args) {
        SwingUtilities.invokeLater(() -> {
            final JPanel panel = new Main();
            panel.setPreferredSize(new Dimension(200, 200));

            final JFrame frame = new JFrame("Subpixel accuracy");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.getContentPane().add(panel);
            frame.pack();
            frame.setLocationRelativeTo(null);
            frame.setVisible(true);
        });
    }
}

Для этого вам понадобится ссылка на объект Graphics2D (просто вызовите и приведите create по параметру Graphics paintComponent).

...