2014-10-29 2 views
2

Я пытаюсь нарисовать большой круг и заполнить меньший круг в центре. Вот что у меня есть до сих пор:Заполнение графикой # fillOval отключается

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.RenderingHints; 

import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class Main { 

    public static void main(String[] args) { 
     JFrame frame = new JFrame(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setPreferredSize(new Dimension(50, 75)); 

     frame.add(new JPanel() { 

      @Override 
      public void paintComponent(Graphics g) { 
       super.paintComponent(g); 

       Graphics2D g2 = (Graphics2D) g; 

       g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 
       g2.setColor(Color.BLACK); 
       g2.drawOval(0, 0, 26, 26); 
       g2.fillOval(4, 4, 18, 18); 
      } 

     }); 

     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

} 

Небольшой круг не правильно центрирован и выглядит странно. Однако, если я изменю g2.fillOval (4, 4, 18, 18); к g2.drawOval (4, 4, 18, 18); он выглядит правильно центрированным, но явно не заполнен. Я бы ожидал, что два метода будут рисовать овал в одном и том же положении и размере. Я не знаю, почему это происходит. Любая помощь будет оценена по достоинству.

+0

Это будет связано с тем, как работает сглаживание и как ваши глаза «воспринимают» это ... оптическая иллюзия, другими словами – MadProgrammer

+0

@MadProgrammer Существует ли другой вариант рендеринга, который бы работал? Я не очень разбираюсь в разных вариантах рендеринга. – Stripies

+0

Не совсем, проблема связана с тем, что пиксели являются дробными, например, у вас не может быть половины пикселя, поэтому он пытается выполнить некоторые трюки, чтобы применить смягчение. Все, что вы можете работать на вашем ПК, вероятно, не будет работать на каком-то одном elses – MadProgrammer

ответ

0

Ну, если я назову оба drawOval AND fillOval, он выглядит намного лучше, как если бы drawOval исправил некоторые из отсутствующих пикселей.

  g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 
      g2.setColor(Color.BLACK); 
      g2.drawOval(0, 0, 26, 26); 
      g2.drawOval(4, 4, 18, 18); 
      g2.fillOval(4, 4, 18, 18); 

Если я очень внимательно, некоторые пиксели в юго-восточной части серого цвета вместо черного (как будто эффект drawOval был слишком тонким), вероятно, используя удар с большей шириной, чем по умолчанию будет исправить это как Что ж.