2013-03-04 14 views
1

JPanel에 그리는 데 문제가 있습니다. 여기 제가 현재하고있는 일이 있습니다. 이미지를이 클래스의 파일에 작성하고 그려야하는 정확한 이미지를 얻었으므로 이미지가 유효하다는 것을 알고 있지만 JPanel에 그릴 때 즉시 지워진 것처럼 보입니다. 나는 구글을 시도했지만 건조 해졌다. 어떤 아이디어?JPanel에서 내 그래픽을 표시하지 않습니다.

import java.awt.Graphics; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import java.awt.image.BufferedImage; 
import java.io.ByteArrayOutputStream; 
import java.io.IOException; 

import javax.imageio.ImageIO; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.border.EmptyBorder; 

import utilities.Log; 

public class Signature extends JFrame { 

    /** 
    * 
    */ 
    private static final long serialVersionUID = 8908413895953622794L; 
    private JPanel contentPane; 
    private JPanel panel; 
    private BufferedImage image; 

    /** 
    * Create the frame. 
    */ 
    private Signature() { 
     setResizable(false); 

     setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     setBounds(100, 100, 631, 338); 
     contentPane = new JPanel(); 
     contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); 
     setContentPane(contentPane); 
     contentPane.setLayout(null); 



     JLabel lblDateSigned = new JLabel("Date Signed:"); 
     lblDateSigned.setBounds(48, 248, 91, 14); 
     contentPane.add(lblDateSigned); 

     JLabel lblDateGoesHere = new JLabel("date goes here"); 
     lblDateGoesHere.setBounds(48, 262, 83, 14); 
     contentPane.add(lblDateGoesHere); 

     JButton btnClose = new JButton("Close"); 
     btnClose.addMouseListener(new MouseAdapter() { 
      @Override 
      public void mousePressed(MouseEvent e) { 
       dispose(); 
      } 
     }); 
     btnClose.setBounds(521, 258, 89, 23); 
     contentPane.add(btnClose); 
     panel = new JPanel() { 
      private static final long serialVersionUID = -7148070953904995529L; 

      @Override 
      public void paintComponent(Graphics g) { 
       super.paintComponent(g); 
       if (image != null) { 
        Graphics gc = this.getGraphics(); 
        // gc.setColor(Color.WHITE); 
        gc.drawImage(image, 0, 0, null); 

       } 

      } 

      @Override 
      public void repaint() { 
       super.repaint(); 
       if (image != null) { 
        Graphics gc = this.getGraphics(); 
        // gc.setColor(Color.WHITE); 
        gc.drawImage(image, 0, 0, null); 
        // gc.dispose(); 
       } 
      } 

     }; 

     panel.setBounds(10, 11, 600, 200); 
     contentPane.add(panel); 

    } 

    public byte[] getImageByteArray() { 
     ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
     byte[] imageInBytes = null; 
     try { 
      ImageIO.write(image, "jpg", baos); 
      baos.flush(); 
      imageInBytes = baos.toByteArray(); 
      baos.close(); 
     } catch (IOException e) { 
      Log.showMessage("Error processing signature: " + e.toString()); 
     } 
     return imageInBytes; 
    } 

    public void setVisible() { 
     setVisible(true); 
     panel.repaint(); 
    } 

    public Signature(BufferedImage image) { 
     this(); 
     this.image = image; 
    } 
} 

답변

6

제안 :

  • 유지되지 않습니다 얻은 그래픽 인스턴스로이 방법으로 한 구성 요소로 getGraphics()를 호출하지 마십시오. 대신 paintComponent 메소드에서 JVM이 제공 한 Graphics 객체를 사용하지 않는 이유는 무엇입니까?
  • JButton에 MouseListener를 추가하지 마십시오. 그것이 ActionListeners가하는 것입니다.
  • null 레이아웃과 setBounds를 사용하지 마십시오. 프로그램이 매우 융통성이 없어서 업데이트 및 업그레이드가 어려울 수 있습니다.
  • 대신 레이아웃 관리자를 읽고 사용하십시오.
  • repaint()을 무시하지 마십시오. 가끔씩 다시 정의하는 것이 좋지만 수행하려고하는 것처럼 더 많은 그림을 그리는 것은 아닙니다.
  • 스윙 튜토리얼을 읽으면서이 모든 것이 잘 설명되어 있습니다.
+1

왜 그들은 '널 (null)'레이아웃을 사용하고 있습니까? ( – MadProgrammer

+0

@ Hovercraft Full of Eels B/C 나는이 바보에 대해 많은 생각을 해왔습니다. 덕분에 도움이되었습니다. 어리석은 롤 –

+0

@ReidMac : 위의 추가 제안 –

관련 문제