Wie zeichne ich JPanel? (Swing / Grafik Java)
Arbeite ich an einem Projekt, in dem ich versuche, ein paint-Programm.
Bisher habe ich Netbeans verwendet zum erstellen von GUI-und Einrichtung des Programms.
Ab jetzt bin ich in der Lage, um alle die koordinierte notwendig, um innen zeichnen, aber ich bin sehr verwirrt, wie eigentlich die Farbe innerhalb.
Gegen Ende von meinem code ich habe einen gescheiterten Versuch an der Zeichnung in das panel.
Kann mir jemand erklären/zeigen, wie die Verwendung von Grafiken in einem Beispiel wie diesem?
Alle Beispiele die ich gefunden habe, machen eine Klasse und erweitern Sie mit JPanel
aber ich weiß nicht, ob ich kann dies tun, denn es erzeugt wurde in netbeans.
ich brauche innen zeichnen ein JPanel
in meinem JFrame
. Ich weiß nicht, wohin mit der graphics-Klasse.
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);
}
}
}
Screenshot
Die ganze Sache ist ein JFrame
und den weißen Bereich in der Mitte ist jPanel2
was ich zeichnen will.
InformationsquelleAutor der Frage Nick R | 2011-05-25
Du musst angemeldet sein, um einen Kommentar abzugeben.
Beachten Sie die zusätzlichen Kommentare.
Screenshot
Andere Beispiele - besser auf mehrere Zeilen & mehrere Liniensegmente
HFOE einen gute link als ersten Kommentar in diesem thread. Camickr hat auch eine Beschreibung der aktiven Malerei vs. Zeichnung, um eine
BufferedImage
im Custom Painting Ansätze Artikel.Siehe auch dieser Ansatz mit Malerei in eine
BufferedImage
.InformationsquelleAutor der Antwort Andrew Thompson
Beim arbeiten mit grafischen Benutzeroberflächen, müssen Sie daran denken, dass die Zeichnung auf einem Bereich erfolgt, in dem Java-AWT/Swing-event-queue. Sie können nicht einfach den
Graphics
Objekt außerhalb derpaint()
/paintComponent()
/etc. Methoden.Jedoch, Sie kann verwenden eine Technik namens "Frame-Pufferung". Im Grunde müssen Sie eine BufferedImage und zeichnen direkt auf es (siehe es ist
createGraphics()
Methode; dass Grafik-Kontext können Sie behalten und wiederverwenden, für mehrere Operationen auf einem gleichenBufferedImage
Instanz, keine Notwendigkeit, es neu zu erstellen die ganze Zeit, nur beim erstellen einer neuen Instanz). Dann, in IhremJPanel
'spaintComponent()
müssen Sie einfach ziehen Sie dieBufferedImage
Instanz zu derJPanel
. Mit dieser Technik können Sie zoom, translation und rotation Operationen ganz leicht durch affine Transformationen.InformationsquelleAutor der Antwort Yanick Rochon
Hier ist ein einfaches Beispiel. Ich nehme an, es wird einfach zu verstehen:
}
Und die Ausgabe sieht wie folgt aus:
InformationsquelleAutor der Antwort Bijaya Bidari
Variation der code von Bijaya Bidari, dass angenommen wird, die von Java 8 ohne Warnungen im Zusammenhang mit überschreibbare Methode ruft im Konstruktor:
InformationsquelleAutor der Antwort joser