JPanel не показывает мою графику

У меня проблемы с рисованием на JPanel. Вот чем я сейчас занимаюсь. Я знаю, что изображение допустимо, так как я записал его в файл из этого класса и получил точное изображение, которое я хочу нарисовать, но когда я пытаюсь нарисовать его в JPanel, оно, кажется, немедленно стирается. Я пробовал Google, но пришел сухой. Есть идеи?

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;
    }
}

person Reid Mac    schedule 04.03.2013    source источник


Ответы (1)


Предложения:

  • Не вызывайте getGraphics() для компонента таким образом, так как полученный экземпляр Graphics не будет сохраняться. Почему вместо этого вы не используете объект Graphics, предоставленный JVM, в методе paintComponent?
  • Не добавляйте MouseListeners в JButtons. Вот для чего нужны ActionListeners.
  • Не используйте пустые макеты и setBounds, так как это сделает вашу программу очень негибкой и трудной для обновления и обновления.
  • Вместо этого читайте дальше и используйте менеджеры компоновки.
  • Не переопределяйте repaint(), как вы это делаете. Можно время от времени переопределять его, но не делать больше рисунков, как вы пытаетесь сделать.
  • Прочтите учебные пособия по Swing, так как все это и многое другое там хорошо объяснено.
person Hovercraft Full Of Eels    schedule 04.03.2013
comment
Почему они используют null макеты :( - person MadProgrammer; 05.03.2013
comment
@Hovercraft Full Of Eels B / C Я идиот и сегодня много думал об этом. Спасибо за помощь, это сработало. Я чувствую себя глупо, лол. - person Reid Mac; 05.03.2013
comment
@ReidMac: больше предложений выше. - person Hovercraft Full Of Eels; 05.03.2013
comment
Не переопределять repaint, но это восходит к Не звонить getGraphics (кстати, +1) - person MadProgrammer; 05.03.2013