2014-11-16 1 views
1

이라고 불립니다. JFrame에는 버튼과 BufferedImgae가 있습니다.이 버튼은 내 방식 (drawLine, pisel로 래스터 그림 픽셀 그리기)을 사용하여 모양과 그림을 그리는 데 사용됩니다. 여기 내가 paintComponent는

public class Main extends javax.swing.JPanel { 

    JPanel panel; 
    JFrame fr; 

    Graphics2D g2; 
    ImageIcon icon; 
    BufferedImage img; 

    public void init() 
    { 
     fr = new JFrame("Lab 2"); 
     fr.setMinimumSize(new Dimension(1350, 650)); 
     fr.setMaximumSize(fr.getMinimumSize()); 
     fr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     JPanel glowny = new JPanel(new BorderLayout()); 
     glowny.setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20)); 
     glowny.add(getBorderCenter(), BorderLayout.CENTER); 
     fr.add(glowny); 
     fr.pack(); 
     fr.setVisible(true); 
    } 

    private JScrollPane getBorderCenter() 
    { 
     img = new BufferedImage(fr.getWidth()-40, fr.getHeight()-40-50, BufferedImage.TYPE_INT_RGB); //20+20 odstępy w glowny, 50 - szerokość paska z guzikami 
     icon = new ImageIcon(img); 
     return new JScrollPane(new JLabel(icon)); 
    } 

    public static void main(String [] args) 
    { 
     Main m = new Main(); 
     m.init(); 
    } 
} 

그런 다음 내가 이중 버퍼링을 사용하는 BufferedImage의에 그리는 시도 JFrame의

에 일을 추가하는 방법이다. 다음 예제에서는 BufferedImage 색상을 검은 색 (현재)에서 흰색으로 변경합니다.

@Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     System.out.println("paintComponent"); 

     WritableRaster raster = img.getRaster(); 
     DataBuffer db = raster.getDataBuffer(); 

     int[] pixels = ((DataBufferInt)db).getData();   
     int adres = 0; 
     for (int y = 0; y < img.getHeight(); y++) 
     { 
      adres = y * img.getWidth(); 
      for (int x = 0; x < img.getWidth(); x++) 
      { 
       pixels[adres] = 16777215; 
       adres += 1; 
      } 
     } 

     Graphics2D g2dComponent = (Graphics2D) g; 
     g2dComponent.drawImage(img, null, 0, 0); // draw buffer on screen 
    } 

나는 paintaint()를 호출하여 repaint()를 이해합니다. 문제는 내가 repaint()를 호출하는 방법이 중요하지 않다는 것입니다.

fr.repaint(); 
glowny.repaint(); 
repaint(); 

결코 호출되지 않습니다.

+1

'paintComponent()'를 대체하는 컴포넌트는 무엇입니까? – trashgod

+0

더 나은 도움을 받으려면 SSCE를 게시하십시오. –

+0

나는 이해하지 못한다, 모든 코드는 한 클래스에서 나온다 – kamilosdzikos

답변

3

Main을 절대로 GUI에 추가하지 마십시오. paintComponent를 오버라이드하는 JPanel 인 this을 GUI에 추가해야합니다.

someComponentShownInGui.add(this); 

나는 GLOWNY 변수를 제거하고 대신 this을 사용하여 얻을 것이다 : 예를 들어, 당신은 어딘가에 뭔가를해야합니다.

즉, 도면 JPanel을 추가 어떤 구성 요소가 이미지를 다룰 것입니다, 그래서 당신은 몇 가지가 불투명해야 할 수도 있음을

public void init() 
{ 
    fr = new JFrame("Lab 2"); 
    fr.setMinimumSize(new Dimension(1350, 650)); 
    fr.setMaximumSize(fr.getMinimumSize()); 
    fr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

    // JPanel glowny = new JPanel(new BorderLayout()); 
    // glowny.setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20)); 
    // glowny.add(getBorderCenter(), BorderLayout.CENTER); 
    // fr.add(glowny); 

    setLayout(new BorderLayout(); 
    setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20)); 
    add(getBorderCenter(), BorderLayout.CENTER); 
    fr.add(this); 

    fr.pack(); 
    fr.setVisible(true); 
} 

참고.

+1

그것의 작동! 대단히 감사합니다. 좋은 하루 되세요. – kamilosdzikos

+0

@kamilosdzikos : 잘 됐어. 다행이야. –

1

모든 구성 요소를 JPanel에 추가 한 다음 패널의 paintComponent 메서드를 재정의해야합니다. (JFrame은 paintComponet하지만 paint 메소드를 가지고 있지 않으며 그것을 오버라이드 할 것을 권장하지 않습니다.)