2013-03-04 2 views
1

У меня проблемы с рисованием на JPanel. Вот что я сейчас делаю. Я знаю, что образ действителен, так как я написал его в файл из этого класса и получаю точный образ, который я хочу рисовать, но когда я пытаюсь нарисовать его на JPanel, он сразу же стирается. Я попробовал Google, но придумал сухую. Есть идеи?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() на компоненте, таким образом, как, например графики, полученные не будет сохраняться. Почему вы не используете объект Graphics, предоставленный JVM в вашем методе paintComponent?
  • Не добавляйте MouseListeners в JButtons. Для этого нужны ActionListeners.
  • Не используйте пустые макеты и setBounds, так как это сделает вашу программу очень негибкой и сложной для обновления и обновления.
  • Вместо этого прочитайте и используйте менеджеров компоновки.
  • Не переопределяйте repaint(), как вы это делаете. Это нормально, чтобы переопределить его иногда, но не делать больше рисунка, как вы пытаетесь сделать.
  • Прочитайте учебники Swing, так как все это и многое объяснено там.
+1

Почему они используют 'null' макеты :( – MadProgrammer

+0

@Hovercraft Full Of Угри B/C Я идиотка и думал об этом waaaaay на много сегодня. Спасибо за помощь, которая работала. Я чувствую, глупый lol –

+0

@ReidMac: больше предложений выше –

Смежные вопросы