48 votes

Comment dessiner dans JPanel? (Swing/graphics Java)

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

Actuellement, je suis capable d'appeler toutes les coordonnées nécessaires pour dessiner à l'intérieur, mais je suis très confus sur la manière de peindre effectivement à l'intérieur.

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

Est-ce que quelqu'un peut expliquer / montrer comment utiliser les graphiques dans un exemple comme celui-ci?

Tous les exemples que j'ai trouvés créent une classe et l'étendent avec JPanel mais je ne sais pas si je peux le faire puisque cela a été généré dans Netbeans.

Je dois dessiner à l'intérieur d'un JPanel, à l'intérieur de mon JFrame. Je ne sais pas où mettre la classe des graphiques.

Classe JavaPaintUI

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();
}//                         

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

//libération de la souris//
private void jPanel2MouseReleased(java.awt.event.MouseEvent evt) {                                      
    if (tool == 2) {
        currentX = evt.getX();
        currentY = evt.getY();
        System.out.println("ligne!!!! de" + oldX + "à" + currentX);
    }
}                                     

//rendre l'interface visible//
public static void main(String args[]) {
    java.awt.EventQueue.invokeLater(new Runnable() {

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

// Déclaration des variables - ne pas modifier                     
private javax.swing.JPanel jPanel2;
// Fin de la déclaration des variables                   

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

Tout l'ensemble est un JFrame et la section blanche au centre est jPanel2 sur laquelle je veux dessiner. capture d'écran de quelques codes qui ne sont pas ceux-ci

36voto

Andrew Thompson Points 108505

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() {
        // nous voulons un Panel2 personnalisé, pas un JPanel générique!
        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);
            }
        });

        // ajouter le composant au cadre pour le voir!
        this.setContentPane(jPanel2);
        // soyez gentil avec les testeurs..
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        pack();
    }// 

    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("STYLO!!!!");
        }
    }

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

    //souris relâchée//
    private void jPanel2MouseReleased(MouseEvent evt) {
        if (tool == 2) {
            currentX = evt.getX();
            currentY = evt.getY();
            System.out.println("ligne!!!! de" + oldX + "à" + currentX);
        }
    }

    //définir l'interface utilisateur visible//
    public static void main(String args[]) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                new JavaPaintUI().setVisible(true);
            }
        });
    }

    // Déclaration des variables - ne pas modifier
    private JPanel jPanel2;
    // Fin de la déclaration des variables

    // Le nom de cette classe est très confus, car il est également utilisé comme
    // nom d'attribut!
    //classe jPanel2 étend JPanel {
    classe Panel2 étend JPanel {

        Panel2() {
            // définir une taille préférée pour le panneau personnalisé.
            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

entrer 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 dans ce fil. Camickr a également une description de la peinture active par rapport au dessin sur un BufferedImage dans l'article Custom Painting Approaches.

Voir également cette approche utilisant la peinture dans un BufferedImage.

15voto

Yanick Rochon Points 18537

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

Cependant, vous pouvez utiliser une technique appelée "Tampon d'image". Fondamentalement, vous devez avoir un BufferedImage et dessiner directement dessus (voir sa méthode createGraphics(); ce contexte graphique vous pouvez le conserver et le réutiliser pour de multiples opérations sur une même instance de BufferedImage, pas besoin de le recréer tout le temps, seulement lors de la création d'une nouvelle instance). Ensuite, dans la méthode paintComponent() de votre JPanel, vous avez simplement besoin de dessiner l'instance de BufferedImage sur le JPanel. En utilisant cette technique, vous pouvez effectuer facilement des opérations de zoom, de translation et de rotation à travers des transformations affines.

11voto

Bijaya Bidari Points 106

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("Dessin Simple");
    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 commence à 10,10 et se termine à 240,240
        g.drawRect(10, 10, 240, 240);
        //rectangle rempli avec des coins arrondis.
        g.fillRoundRect(50, 50, 100, 100, 80, 80);
    }
}

}

Et la sortie ressemble à ceci:

Output

0voto

joser Points 113

Variation of the code by Bijaya Bidari that is accepted by Java 8 without warnings in regard with overridable method calls in constructor:

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X