2013-04-21 5 views
2

코드를 컴파일하고 화면 중앙에 이미지가 나타나는 프로그램을 실행합니다. 치수를 JTextFields에 넣고 크기 조정 단추를 누릅니다. 모든 것이 잘 작동합니다. 이제 창을 닫고 이미지를 다시 실행하면 이미지가 나타납니다.하지만 크기가 변하는 버튼을 처음 누르면 사라집니다. 다시 누르면 모든 것이 올바르게 작동합니다. 윈도우가 실행 중일 때 코드를 컴파일하고 실행하면 그 사소한 문제가 발생합니다.빈 이미지 처음 만 크기 변경 버튼 누르기

누구나 무슨 일이 일어나는가에 대한 단서가 있습니까? resize_image에서

import java.awt.*; 
import javax.swing.*; 
import java.awt.event.*; 
import java.io.File; 
import java.io.IOException; 
import javax.imageio.ImageIO; 
import java.awt.image.BufferedImage; 
public class ImageApp extends JFrame implements ActionListener{ 
//*********************************Variables********************************* 
//*************************************************************************** 
    private JButton align_l,align_c,align_r,rsz; 
    private JLabel w,h,pic; 
    private JTextField w_txt,h_txt; 
    private static final String IMG_PATH = "./hamster.jpg"; 
    private static int img_w,img_h; 
    private static ImageIcon icon; 
    private JMenuItem reset_option,double_option; 
//********************************Constructor******************************** 
//*************************************************************************** 
    public ImageApp(String title){ 
     super(title); 
     //****************************Align Panel**************************** 
     align_l = new JButton("Align Left"); 
     align_c = new JButton("Align Center"); 
     align_r = new JButton("Align Right"); 
     align_l.addActionListener(this); 
     align_c.addActionListener(this); 
     align_r.addActionListener(this); 
     JPanel align_panel = new JPanel(); 
     align_panel.setLayout(new GridLayout(1,3)); 
     align_panel.add(align_l); 
     align_panel.add(align_c); 
     align_panel.add(align_r); 
     add("North",align_panel); 
     //***************************Picture Label*************************** 
     try { 
      BufferedImage img = ImageIO.read(new File(IMG_PATH)); 
      img_w = img.getWidth(); 
      img_h = img.getHeight(); 
      ImageIcon icon = new ImageIcon(img); 
      pic = new JLabel(icon); 
      add(pic); 
     } catch (IOException e) { 
       e.printStackTrace(); 
     } 
     //****************************Resize Panel*************************** 
     w = new JLabel("Width:"); 
     h = new JLabel("Height:"); 
     w_txt = new JTextField(String.valueOf(img_w),4); 
     h_txt = new JTextField(String.valueOf(img_h),4); 
     rsz = new JButton("Resize"); 
     rsz.addActionListener(this); 
     JPanel resize_panel = new JPanel(); 
     resize_panel.setLayout(new GridLayout(3,2)); 
     resize_panel.add(w); 
     resize_panel.add(w_txt); 
     resize_panel.add(h); 
     resize_panel.add(h_txt); 
     resize_panel.add(rsz); 
     add("South",resize_panel); 
     //*************************Menu Options Panel************************ 
     JMenuBar menu_bar = new JMenuBar(); 
     setJMenuBar(menu_bar); 
     JMenu options_menu = new JMenu("Options"); 
     menu_bar.add(options_menu); 
     JMenuItem reset_option = new JMenuItem("Reset"); 
     JMenuItem double_option = new JMenuItem("Double"); 
     options_menu.add(reset_option); 
     options_menu.add(double_option); 
     reset_option.addActionListener(this); 
     double_option.addActionListener(this); 
     //******************************************************************** 
     addWindowListener(new WindowAdapter() { 
      public void windowClosing(WindowEvent evt) { 
       System.exit(0); 
      } 
     }); 
    } 
//**********************************Methods********************************** 
//*************************************************************************** 
    public void actionPerformed(ActionEvent e){ 
     //Object b = e.getSource(); 
     String b = e.getActionCommand(); 
     if (b.equals("Align Left")){pic.setHorizontalAlignment(SwingConstants.LEFT);} 
     else if (b.equals("Align Center")){pic.setHorizontalAlignment(SwingConstants.CENTER);} 
     else if (b.equals("Align Right")){pic.setHorizontalAlignment(SwingConstants.RIGHT);} 
     else if (b.equals("Resize")){ 
      int wid,hei; 
      try{ 
       wid=Integer.parseInt(w_txt.getText()); 
       hei=Integer.parseInt(h_txt.getText()); 
      }catch(NumberFormatException nfe){ 
       wid=img_w; 
       hei=img_h; 
      } 
      if(wid == 0 || hei == 0){ 
       wid=img_w; 
       hei=img_h; 
      } 
      if(wid > 4096){ 
       wid=4096; 
      } 
      if(hei > 2048){ 
       hei=2048; 
      } 
      resize_image(wid,hei); 
     } 
     else if (b.equals("Reset")){ 
      resize_image(img_w,img_h); 
     } 
     else if (b.equals("Double")){ 
      Icon newIcon = pic.getIcon(); 
      int wid = 2 * newIcon.getIconWidth(); 
      int hei = 2 * newIcon.getIconHeight(); 
      if(wid > 4096){ 
       wid=4096; 
      } 
      if(hei > 2048){ 
       hei=2048; 
      } 
      resize_image(wid,hei); 
     } 
    } 
    public void resize_image(int w,int h){ 
      Image im = Toolkit.getDefaultToolkit().getImage(IMG_PATH); 
      BufferedImage b_i = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB); 
      Graphics g = b_i.createGraphics(); 
      g.drawImage(im, 0, 0, w, h, null); 
      ImageIcon newIcon = new ImageIcon(b_i); 
      pic.setIcon(newIcon); 
      w_txt.setText(String.valueOf(w)); 
      h_txt.setText(String.valueOf(h)); 
    } 
    public static void main(String [] args){ 
     ImageApp i = new ImageApp("Image Application."); 
     i.setSize(800,600); 
     i.setLocationRelativeTo(null); 
     i.setVisible(true); 
    } 
} 
+0

* 여기에 동작을 참조하지 않고 *** 깊이 *** 의심되는 증상은 당신이 말한 것과 정확히 같습니다. –

+0

관련 코드 예제와 함께 좋은 질문입니다. 1 + –

답변

3

: 처음 getImage에서

public void resize_image(int w, int h) { 
    Image im = Toolkit.getDefaultToolkit().getImage(IMG_PATH); 
    /* ... */ 
    g.drawImage(im, 0, 0, w, h, null); 
    /* ... */ 
} 

이라고 im 정말로드되지 않았습니다. drawImage가 불려 가면 (자), AWT는 다른 thread로 이미지를로드하기 시작했습니다. 이미지가로드 될 때까지 차단되지 않았습니다. 그리고 drawImage이미지가로드되지 않았다고 생각하기 때문에, 아무 것도하지 않았습니다. 두 번째 getImage에서

AWT는 자동으로 이미지를 캐시, 그래서 모든 것이 잘 작동하기 때문에 im가로드 된 호출됩니다.

솔루션 : MediaTracker. "윈도우가 실행되며, 실행 내가 돈 동안 내가 코드를 컴파일하는 경우에만, t는 사소한 문제가 있음이"*

public void resize_image(int w, int h) { 
    Image im = Toolkit.getDefaultToolkit().getImage(IMG_PATH); 
    waitForImage(im); 
    /* ... */ 
    g.drawImage(im, 0, 0, w, h, null); 
    /* ... */ 
} 

private MediaTracker tracker = new MediaTracker(this); 

private void waitForImage(Image image){ 
    tracker.addImage(image, 0); 
    try { 
     tracker.waitForID(0); 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } 
} 
+1

아하! 그게 다야! 1+ –