Comment dessiner dans JPanel? (Swing / graphiques Java)


Je travaille sur un projet dans lequel j'essaie de faire un programme de peinture. Jusqu'à présent, j'ai utilisé Netbeans pour créer une interface graphique et configurer le programme.

À partir de maintenant, je suis capable d'appeler tout le nécessaire coordonné pour dessiner à l'intérieur, mais je suis très confus avec la façon de peindre à l'intérieur.

Vers la fin de mon code, j'ai une tentative ratée de dessin à l'intérieur du panneau.

Quelqu'un Peut-il expliquer/montrer comment utiliser des graphiques dans un exemple comme celui-ci?

Tous les exemples I j'ai trouvé faire une classe et l'étendre avec JPanel mais je ne sais pas si je peux le faire car il a été généré dans netbeans.

j'ai besoin de tirer à l'intérieur d'un JPanel, à l'intérieur de mon JFrame. Je ne sais pas où mettre la classe graphique.

JavaPaintUI Classe

package javapaint;

import java.awt.*;
import javax.swing.*;

public class JavaPaintUI extends javax.swing.JFrame {

public JavaPaintUI() {
    initComponents();
}


private void initComponents() {


    jPanel2 = new javax.swing.JPanel();

    jPanel2.setBackground(new java.awt.Color(255, 255, 255));
    jPanel2.setBorder(javax.swing.BorderFactory.createBevelBorder(javax.swing.border.BevelBorder.RAISED));
    jPanel2.addMouseListener(new java.awt.event.MouseAdapter() {
        public void mousePressed(java.awt.event.MouseEvent evt) {
            jPanel2MousePressed(evt);
        }
        public void mouseReleased(java.awt.event.MouseEvent evt) {
            jPanel2MouseReleased(evt);
        }
    });
    jPanel2.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() {
        public void mouseDragged(java.awt.event.MouseEvent evt) {
            jPanel2MouseDragged(evt);
        }
    });
    pack();
}// </editor-fold>                        

int currentX, currentY, oldX, oldY;

private void jPanel2MouseDragged(java.awt.event.MouseEvent evt) {                                     
    if (tool == 1) {
        currentX = evt.getX();
        currentY = evt.getY();
        oldX = currentX;
        oldY = currentY;
        System.out.println(currentX + " " + currentY);
        System.out.println("PEN!!!!");
    }

}                                    

private void jPanel2MousePressed(java.awt.event.MouseEvent evt) {                                     
    oldX = evt.getX();
    oldY = evt.getY();
    System.out.println(oldX + " " + oldY);
}                                    


//mouse released//
private void jPanel2MouseReleased(java.awt.event.MouseEvent evt) {                                      
    if (tool == 2) {
        currentX = evt.getX();
        currentY = evt.getY();
        System.out.println("line!!!! from" + oldX + "to" + currentX);
    }
}                                     

//set ui visible//
public static void main(String args[]) {
    java.awt.EventQueue.invokeLater(new Runnable() {

        public void run() {
            new JavaPaintUI().setVisible(true);
        }
    });
}

// Variables declaration - do not modify                     
private javax.swing.JPanel jPanel2;
// End of variables declaration                   

class jPanel2 extends JPanel {

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);

        g.drawString("BLAH", 20, 20);
        g.drawRect(200, 200, 200, 200);
    }
}
}

Capture d'Écran

Le tout est un JFrame et la section blanche au centre est jPanel2, ce sur quoi je veux dessiner. capture d'écran d'un code qui n'est pas ce

Author: Andrew Thompson, 2011-05-25

4 answers

Notez les commentaires supplémentaires.

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.*;

class JavaPaintUI extends JFrame {

    private int tool = 1;
    int currentX, currentY, oldX, oldY;

    public JavaPaintUI() {
        initComponents();
    }

    private void initComponents() {
        // we want a custom Panel2, not a generic JPanel!
        jPanel2 = new Panel2();

        jPanel2.setBackground(new java.awt.Color(255, 255, 255));
        jPanel2.setBorder(BorderFactory.createBevelBorder(BevelBorder.RAISED));
        jPanel2.addMouseListener(new MouseAdapter() {
            public void mousePressed(MouseEvent evt) {
                jPanel2MousePressed(evt);
            }
            public void mouseReleased(MouseEvent evt) {
                jPanel2MouseReleased(evt);
            }
        });
        jPanel2.addMouseMotionListener(new MouseMotionAdapter() {
            public void mouseDragged(MouseEvent evt) {
                jPanel2MouseDragged(evt);
            }
        });

        // add the component to the frame to see it!
        this.setContentPane(jPanel2);
        // be nice to testers..
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        pack();
    }// </editor-fold>

    private void jPanel2MouseDragged(MouseEvent evt) {
        if (tool == 1) {
            currentX = evt.getX();
            currentY = evt.getY();
            oldX = currentX;
            oldY = currentY;
            System.out.println(currentX + " " + currentY);
            System.out.println("PEN!!!!");
        }
    }

    private void jPanel2MousePressed(MouseEvent evt) {
        oldX = evt.getX();
        oldY = evt.getY();
        System.out.println(oldX + " " + oldY);
    }


    //mouse released//
    private void jPanel2MouseReleased(MouseEvent evt) {
        if (tool == 2) {
            currentX = evt.getX();
            currentY = evt.getY();
            System.out.println("line!!!! from" + oldX + "to" + currentX);
        }
    }

    //set ui visible//
    public static void main(String args[]) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                new JavaPaintUI().setVisible(true);
            }
        });
    }

    // Variables declaration - do not modify
    private JPanel jPanel2;
    // End of variables declaration

    // This class name is very confusing, since it is also used as the
    // name of an attribute!
    //class jPanel2 extends JPanel {
    class Panel2 extends JPanel {

        Panel2() {
            // set a preferred size for the custom panel.
            setPreferredSize(new Dimension(420,420));
        }

        @Override
        public void paintComponent(Graphics g) {
            super.paintComponent(g);

            g.drawString("BLAH", 20, 20);
            g.drawRect(200, 200, 200, 200);
        }
    }
}

Capture d'écran

entrez la description de l'image ici

Autres exemples - plus adaptés à plusieurs lignes et plusieurs segments de ligne

HFOE a mis un bon lien comme premier commentaire sur ce fil. Camickr a également une description de la peinture active par rapport au dessin à un BufferedImage dans l'article Custom Painting Approaches.

Voir aussi cette approche à l'aide de peinture dans un BufferedImage.

 35
Author: Andrew Thompson, 2017-05-23 10:30:08

Lorsque vous travaillez avec des interfaces utilisateur graphiques, vous devez vous rappeler que le dessin sur un volet est effectué dans la file d'attente d'événements Java AWT/Swing. Vous ne pouvez pas simplement utiliser l'objet Graphics en dehors du paint()/paintComponent()/etc. méthode.

Cependant, vous peut utiliser une technique appelée "Cadre de mise en mémoire tampon". Fondamentalement, vous devez avoir un BufferedImage et dessiner directement dessus (voir c'est la méthode createGraphics(); que contexte graphique que vous pouvez conserver et réutiliser pour plusieurs opérations sur une même instance BufferedImage, pas besoin de la recréer tout le temps, uniquement lors de la création d'une nouvelle instance). Ensuite, dans votre JPanel ' s paintComponent(), vous devez simplement dessiner l'instance BufferedImage vers le JPanel. En utilisant cette technique, vous pouvez effectuer des opérations de zoom, de translation et de rotation assez facilement à travers transformations affines.

 14
Author: Yanick Rochon, 2011-05-25 02:23:38

Voici un exemple simple. Je suppose que ce sera facile à comprendre:

import java.awt.*;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Graph extends JFrame {
JFrame f = new JFrame();
JPanel jp;


public Graph() {
    f.setTitle("Simple Drawing");
    f.setSize(300, 300);
    f.setDefaultCloseOperation(EXIT_ON_CLOSE);

    jp = new GPanel();
    f.add(jp);
    f.setVisible(true);
}

public static void main(String[] args) {
    Graph g1 = new Graph();
    g1.setVisible(true);
}

class GPanel extends JPanel {
    public GPanel() {
        f.setPreferredSize(new Dimension(300, 300));
    }

    @Override
    public void paintComponent(Graphics g) {
        //rectangle originates at 10,10 and ends at 240,240
        g.drawRect(10, 10, 240, 240);
        //filled Rectangle with rounded corners.    
        g.fillRoundRect(50, 50, 100, 100, 80, 80);
    }
}

}

Et la sortie ressemble à ceci:

Sortie

 11
Author: Bijaya Bidari, 2016-11-05 17:29:26

Variation du code par Bijaya Bidari qui est acceptée par Java 8 sans avertissements en ce qui concerne les appels de méthode remplaçables dans le constructeur:

public class Graph extends JFrame {
    JPanel jp;

    public Graph() {
        super("Simple Drawing");
        super.setSize(300, 300);
        super.setDefaultCloseOperation(EXIT_ON_CLOSE);

        jp = new GPanel();
        super.add(jp);
    }

    public static void main(String[] args) {
        Graph g1 = new Graph();
        g1.setVisible(true);
    }

    class GPanel extends JPanel {
        public GPanel() {
            super.setPreferredSize(new Dimension(300, 300));
        }

        @Override
        public void paintComponent(Graphics g) {
            super.paintComponent(g);
            //rectangle originated at 10,10 and end at 240,240
            g.drawRect(10, 10, 240, 240);
                    //filled Rectangle with rounded corners.    
            g.fillRoundRect(50, 50, 100, 100, 80, 80);
        }
    }
}
 0
Author: joser, 2016-11-07 12:02:08