Я столкнулся с этой проблемой, и это было связано с субпиксельной точностью. Я также могу воспроизвести ошибку, которую вы видите. Используйте сглаживание, чтобы исправить это.
Следующий код решает проблему для меня:
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
).