2014-06-15 3 views
-2

RescaleOp 사용에 대한 Oracle 웹 사이트의 자습서를 따르고 있습니다. 애플릿없이 자습서를 작성하고 모든 것을 스윙으로 변환하려고합니다. 코드는 다음과 같습니다.페인트, 다시 그리기 및 PaintComponent

import java.awt.Color; 
import java.awt.Component; 
import java.awt.Dimension; 
import java.awt.Font; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.event.WindowAdapter; 
import java.awt.event.WindowEvent; 
import java.awt.image.BufferedImage; 
import java.awt.image.RescaleOp; 
import java.io.File; 
import java.io.IOException; 

import javax.imageio.ImageIO; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JSlider; 
import javax.swing.event.ChangeEvent; 
import javax.swing.event.ChangeListener; 

/* 
* How to load an Image from an external file. 
*/ 
public class ARGB extends JPanel { 

    BufferedImage img; 
    float[] scales = { 1f, 1f, 1f, 0.5f }; 
    float[] offsets = new float[4]; 
    RescaleOp rop; 

    public void paintComponent(Graphics g) { 
     Graphics2D g2d = (Graphics2D) g; 
     g2d.setColor(Color.white); 
     g2d.fillRect(0, 0, getWidth(), getHeight()); 
     g2d.setColor(Color.black); 
     g2d.setFont(new Font("Dialog", Font.BOLD, 24)); 
     g2d.drawString("Java 2D is great!", 10, 80); 
     g2d.drawImage(img, rop, 0, 0); 
     System.out.println("hi"); 

    } 

    public ARGB() { 
     try { 
      img = ImageIO.read(new File("src/strawberry.jpg")); 
     } catch (IOException e) { 
      e.printStackTrace(); 
      // TODO: handle exception 
     } 
    } 

    public Dimension getPreferredSize() { 
     if (img == null) { 
      return new Dimension(100, 100); 
     } else { 
      return new Dimension(img.getWidth(), img.getHeight()); 
     } 
    } 

    public void setOpacity(float opacity) { 
     scales[3] = opacity; 
     rop = new RescaleOp(scales, offsets, null); 
    } 

    public static void main(String[] args) { 
     // TODO Auto-generated method stub 
     final ARGB argb = new ARGB(); 
     JFrame frame = new JFrame("See Through Image"); 
     frame.addWindowListener(new WindowAdapter() { 
      public void windowClosing(WindowEvent e) { 
       System.exit(0); 
      } 
     }); 
     frame.add("Center", new LoadImage()); 
     JSlider opacitySlider = new JSlider(0, 100); 
     frame.add("South", opacitySlider); 
     opacitySlider.addChangeListener(new ChangeListener() { 
      public void stateChanged(ChangeEvent e) { 
       JSlider slider = (JSlider) e.getSource(); 
       argb.setOpacity(slider.getValue()/100f); 
       argb.repaint(); 
      } 
     }); 
     Dimension size = argb.getPreferredSize(); 
     Dimension sliderSize = opacitySlider.getPreferredSize(); 
     frame.setSize(size.width, size.height + sliderSize.height); 
     frame.pack(); 
     frame.setVisible(true); 
    } 

} 

실행하면 39 행에 디버그 문이 표시되지 않습니다. 이유는 알 수 없습니다. 감사합니다.

+1

정확한 문제는 무엇입니까? 좀 더 설명해주세요. 39 호선에 뭐가 있니? 이 게시물의 제목은 무엇이라고 말합니까? – Braj

+0

LoadImage 란 무엇입니까? – MadProgrammer

+0

그리고 super.paintComponent를 호출하는 것을 잊지 마십시오. – MadProgrammer

답변

1

프레임에 ARGB 클래스의 JPanel 객체 ie.e 인스턴스를 추가하지 않았습니다. LoadImage 개체를 추가했습니다. 곳은?? 디버그 문은 ARGB vlass에 있습니다. ARGB 개체를 추가해야합니다. 그러면 페인트 방법 만 호출됩니다.

관련 문제