web-dev-qa-db-de.com

Wie zeichnet man in JPanel? (Swing/Grafik Java)

Ich arbeite an einem Projekt, in dem ich versuche, ein Paint-Programm zu erstellen ... Bisher habe ich Netbeans verwendet, um eine GUI zu erstellen und das Programm einzurichten.

Im Moment kann ich alle koordinierten Elemente aufrufen, die nötig sind, um darin zu zeichnen, aber ich bin sehr verwirrt, wie man tatsächlich darin malen kann.

Gegen Ende meines Codes habe ich einen Versuch unternommen, in das Panel zu zeichnen.

Kann jemand erklären/zeigen, wie man Grafiken in einem solchen Beispiel verwendet?

Alle Beispiele, die ich gefunden habe, machen eine Klasse und erweitern sie mit JPanel, aber ich weiß nicht, ob ich dies tun kann, da sie in Netbeans generiert wurde.

Ich muss eine JPanel in meine JFrame zeichnen. Ich weiß nicht, wo ich die Grafikklasse platzieren soll.

JavaPaintUI-Klasse

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

Bildschirmfoto

Das Ganze ist eine JFrame und der weiße Abschnitt in der Mitte ist jPanel2, worauf ich zeichnen möchte .screen shot of some code that is not this

47
Nick R

Beachten Sie die zusätzlichen Kommentare.

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

Bildschirmfoto

enter image description here

Andere Beispiele - mehr auf mehrere Linien und mehrere Liniensegmente zugeschnitten

HFOE hat als ersten Kommentar zu diesem Thread einen guten Link eingefügt. Camickr hat auch eine Beschreibung des aktiven Gemäldes im Vergleich zu einer BufferedImage im Custom Painting Approaches -Artikel.

Siehe auch diesen Ansatz mit Malen in einer BufferedImage .

35
Andrew Thompson

Wenn Sie mit grafischen Benutzeroberflächen arbeiten, müssen Sie beachten, dass das Zeichnen in einem Bereich in der Java AWT/Swing-Ereigniswarteschlange erfolgt. Sie können das Objekt Graphics nicht einfach außerhalb der Paint()/paintComponent()/etc verwenden. Methoden.

Sie können jedoch eine Technik namens " Frame buffering " verwenden. Grundsätzlich müssen Sie ein BufferedImage haben und direkt darauf zeichnen (siehe createGraphics()-Methode; , dass Sie den Grafikkontext beibehalten können und für mehrere Vorgänge auf derselben BufferedImage Instanz wiederverwenden, ohne dass diese ständig neu erstellt werden muss (nur beim Erstellen einer neuen Instanz). Dann müssen Sie in Ihrer JPanel 's paintComponent() einfach die BufferedImage -Instanz auf die JPanel zeichnen. Mit dieser Technik können Sie Zoom-, Translations- und Rotationsoperationen ganz einfach durch affine Transformationen ausführen.

14
Yanick Rochon

Hier ist ein einfaches Beispiel. Ich denke, es wird leicht zu verstehen sein:

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

}

Und die Ausgabe sieht so aus:

Output

11
Bijaya Bidari

Variation des Codes von Bijaya Bidari, der von Java 8 ohne Warnung bezüglich überschreibbarer Methodenaufrufe im Konstruktor akzeptiert wird:

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