Comment dessiner à JPanel? (Swing / graphique 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.

En ce moment même, je suis capable d’appeler toutes les coordonnés nécessaires pour dessiner à l’intérieur, mais je suis très confondu avec la façon de peindre à l’intérieur.

Vers la fin de mon code, je tente mal de dessiner à l’intérieur du panneau.

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

Tous les exemples que j’ai trouvés font une classe et l’étendent avec JPanel mais je ne sais pas si je peux le faire car il 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 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(); }//  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(Ssortingng 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.drawSsortingng("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 laquelle je veux dessiner. capture d'écran d'un code qui n'est pas cela

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(); }//  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(Ssortingng 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 atsortingbute! //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.drawSsortingng("BLAH", 20, 20); g.drawRect(200, 200, 200, 200); } } } 

Capture d’écran

entrer la description de l'image ici

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

HFOE a mis un bon lien comme premier commentaire sur ce sujet. Camickr a également une description de la peinture active par rapport à un dessin à BufferedImage dans l’article Approches de peinture personnalisées .

Voir aussi cette approche en utilisant la peinture dans une image BufferedImage .

Lorsque vous utilisez des interfaces utilisateur graphiques, vous devez vous rappeler que le dessin sur un volet est effectué dans la queue des événements Java AWT / Swing . Vous ne pouvez pas simplement utiliser l’object Graphics dehors du paint() / paintComponent() / etc. méthodes.

Cependant, vous pouvez utiliser une technique appelée ” Frame Buffering “. Fondamentalement, vous devez avoir un BufferedImage et y dessiner directement (voir sa méthode createGraphics() ; ce contexte graphique que vous pouvez conserver et réutiliser pour plusieurs opérations sur une même instance de BufferedImage , inutile de le recréer tout le temps, uniquement lors de la création). une nouvelle instance). Ensuite, dans le JPanel paintComponent() votre JPanel , il vous suffit de dessiner l’instance BufferedImage le JPanel . Grâce à cette technique, vous pouvez facilement effectuer des opérations de zoom, de translation et de rotation grâce à des transformations affines .

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(Ssortingng[] 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

Variation du code par Bijaya Bidari acceptée par Java 8 sans avertissements concernant les appels de méthodes 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(Ssortingng[] 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); } } }