2012-09-13 21 views
8

This question has been asked before, pero las respuestas no resuelven el problema, entonces lo vuelvo a preguntar.¿Hay alguna manera de dibujar líneas con precisión subpíxel en Swing?

Se sugirió que en lugar de utilizar g2.drawLine, podría utilizar g2.draw(line), donde line es una Line2D.Double. Sin embargo, como puede ver en la captura de pantalla, las líneas se dibujan como si terminaran en un píxel entero (cada conjunto de 10 líneas es exactamente paralelo).

import javax.swing.*; 
import java.awt.*; 
import java.awt.geom.Line2D; 

public class FrameTestBase extends JFrame { 

    public static void main(String args[]) { 
     FrameTestBase t = new FrameTestBase(); 
     t.add(new JComponent() { 
      public void paintComponent(Graphics g) { 
       Graphics2D g2 = (Graphics2D) g; 
       g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, 
         RenderingHints.VALUE_ANTIALIAS_ON); 
       for (int i = 0; i < 50; i++) { 
        double delta = i/10.0; 
        double y = 5 + 5*i; 
        Shape l = new Line2D.Double(5, y, 200, y + delta); 
        g2.draw(l); 
    // Base case, with ints, looks exactly the same: 
    //    g2.drawLine(5, (int)y, 200, (int)(y + delta)); 
       } 
      } 
     }); 

     t.setDefaultCloseOperation(EXIT_ON_CLOSE); 
     t.setSize(220, 300); 
     t.setVisible(true); 
    } 
} 

non-parallel lines

lo tanto, es imposible en Swing para representar correctamente las líneas que no terminan exactamente en un pixel?

+1

Se puede tratar g2d.setRenderingHint (RenderingHints .KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_PURE); ? http://stackoverflow.com/questions/5018635/java-does-subpixel-line-accuracy-require-an-affinetransform – I82Much

+0

Debe dibujar los píxeles del borde en un color diferente (subpixel)/graytone (antialiasing sin subpixel). – ninjalj

+0

@ I82Much ¡Parece que funciona! ¡Debe agregar esto como una respuesta! –

Respuesta

Cuestiones relacionadas