web-dev-qa-db-fra.com

Comment dessiner dans JPanel? (Swing/graphisme Java)

Je travaille sur un projet dans lequel j'essaye de créer un programme Paint ..__ Jusqu'ici, j'ai utilisé Netbeans pour créer une interface utilisateur graphique et configurer le programme.

À l'heure actuelle, je suis en mesure d'appeler tous les coordonnés nécessaires pour dessiner à l'intérieur, mais je suis très confus quant à la manière de peindre à l'intérieur.

Vers la fin de mon code, la tentative de dessin à l'intérieur du panneau a échoué.

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

Tous les exemples que j'ai trouvés font une classe et la prolongent avec JPanel mais je ne sais pas si je peux le faire car elle a été générée dans netbeans.

Je dois dessiner dans une JPanel, dans ma JFrame. Je ne sais pas où placer la classe graphique.

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();
}// </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 une JFrame et la section blanche au centre est jPanel2, ce sur quoi je veux dessiner .screen shot of some code that is not this

47
Nick R

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

enter image description here

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 à un dessin vers un BufferedImage dans Custom Painting Approaches .

Voir aussi cette approche en utilisant painting dans un BufferedImage .

35
Andrew Thompson

Lorsque vous travaillez avec des interfaces utilisateur graphiques, vous devez vous rappeler que le dessin d'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 de Paint()/paintComponent()/etc. méthodes.

Cependant, vous pouvez utiliser une technique appelée " Mise en mémoire tampon des images ". Fondamentalement, vous devez disposer d'un BufferedImage et dessiner directement dessus (voir sa méthode createGraphics(); ce contexte graphique que vous pouvez conserver et réutiliser pour plusieurs opérations sur une même instance BufferedImage, inutile de recréer tout le temps, uniquement lors de la création d’une nouvelle instance). Ensuite, dans paintComponent() de votre JPanel, il vous suffit de 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 via transformations affines .

14
Yanick Rochon

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:

Output

11
Bijaya Bidari

Variation du code par Bijaya Bidari accepté par Java 8 sans avertissements concernant les appels de méthode pouvant être remplacés 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
joser