2D-Grafik Panel-Zeichnung erscheint nicht

flosparrow

Mitglied
Hallo,
wie bereits im titel ersichtlich scheitere ich daran einen einfachen Kreis auf einem von Gui erstellten Panel zu zeichnen.
Hier mein bisheriger Code:
Java:
import java.awt.*;
import javax.swing.*;


public class Benutzeroberfläche extends JFrame {

    Graphics zeichenagent;

    /** Creates new form Benutzeroberfläche */
    public Benutzeroberfläche() {
        initComponents();
        zeichenagent = JBild.getGraphics();
        MeinPanel zeichnung = new MeinPanel();
        this.add(zeichnung);
        zeichnung.setBounds(0, 0, 502, 326); // Werte einsetzen !

    }

    public class MeinPanel extends JPanel {

        //Graphics zeichenagent = JBild.getGraphics();
        @Override
        public void paintComponent(Graphics gr) {
            super.paintComponent(gr);
            zeichenagent.setColor(Color.RED);
            zeichenagent.fillOval(10, 10, 100, 100);
            
        }
    }


    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    private void initComponents() {

        JBild = new javax.swing.JPanel();
        jPanel1 = new javax.swing.JPanel();
        jButton1 = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        javax.swing.GroupLayout JBildLayout = new javax.swing.GroupLayout(JBild);
        JBild.setLayout(JBildLayout);
        JBildLayout.setHorizontalGroup(
            JBildLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 502, Short.MAX_VALUE)
        );
        JBildLayout.setVerticalGroup(
            JBildLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 326, Short.MAX_VALUE)
        );

        jButton1.setText("Start");

        javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
        jPanel1.setLayout(jPanel1Layout);
        jPanel1Layout.setHorizontalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel1Layout.createSequentialGroup()
                .addContainerGap(407, Short.MAX_VALUE)
                .addComponent(jButton1, javax.swing.GroupLayout.PREFERRED_SIZE, 85, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap())
        );
        jPanel1Layout.setVerticalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel1Layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jButton1, javax.swing.GroupLayout.DEFAULT_SIZE, 78, Short.MAX_VALUE)
                .addContainerGap())
        );

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addComponent(jPanel1, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(JBild, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(JBild, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap())
        );

        pack();
    }// </editor-fold>

    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                new Benutzeroberfläche().setVisible(true);
            }
        });
    }
    
    // Variables declaration - do not modify
    private javax.swing.JPanel JBild;
    private javax.swing.JButton jButton1;
    private javax.swing.JPanel jPanel1;
    // End of variables declaration
}

Danke für jede Hilfe
 
Java:
zeichenagent.setColor(Color.RED);
zeichenagent.fillOval(10, 10, 100, 100);

=>

Java:
gr.setColor(Color.RED);
gr.fillOval(10, 10, 100, 100);

Diesen Zeichenagent (Respekt für den Namen btw, musste schmunzeln 🙂) kannst du komplett entfernen.
 
was ist JBild und warum nutzt Du in der überschriebenen paintComponent "zeichenagent" benutzt doch einfach das übergebene Graphics Objekt gr.
 
du hast 100, wenn nicht gar 100.000 Zeilen komplizierten GroupLayout-Code, automatisch generiert,
und erwartest dass dann mit einem einfachen [c]this.add(zeichnung);[/c] auch dein Panel erscheint?

hilfreich wären Grundkenntnisse zu Swing,
ansonsten: initComponents(); weglassen täte es im Moment auch,

dazu besser noch dem JFrame eine Größe geben, z.B.
setSize(502, 326);
und auf [c]Graphics zeichenagent;[/c] dringends verzichten,
paintComponent liefert doch extra ein Graphics-Objekt als Parameter, darin malen
wie man nun wirklich in allen Beispielen und Tutorials dieser Welt nicht anders lesen kann

Galileo Computing :: Java ist auch eine Insel – 20 Grafikprogrammierung
 
du hast 100, wenn nicht gar 100.000 Zeilen komplizierten GroupLayout-Code, automatisch generiert,

Ich wollte ja schon nichts sagen, weil ich neulich auf die Mütze bekommen hab bei so nem Kommentar. "Nur weil du das GroupLayout nicht verstehst..."

Aber ja, die erste Reaktion als ich den Code gesehen hab war dann doch den Mauszeiger in Richtung des Zurück-Buttons meines Browser zu bewegen. Hab das mit dem zeichenagent dann noch in letzter Sekunde spontan gesehen 😀
 
ok ich habs verstanden.
das mit dem zeichenagent ist schwachsinn, das hab ich auch verstanden.
Wenn aber
Code:
this.add(zeichnung);
zu einfach ist. und das ist mir auch klar geworden, wie kann ich es dann richtig hinzufügen?
Ansonsten schonmal danke für die anderene infos
 
Methode initComponents() wegwerfen und hoffen, dass sie nie wieder kommt! Lediglich das pack() kannst du daraus verwenden. Und zwar nach dem this.add(zeichnung); im Konstruktor.

Und:
Java:
zeichnung.setBounds(0, 0, 502, 326);

austauschen gegen:
Java:
zeichnung.setPreferredSize(new Dimension(502, 326));

Dann sollte die Sache mit dem ZeichenPanel schonmal funktionieren. Und für alles andere baust du dir - SELBER! - ein schönes Layout zusammen:
A Visual Guide to Layout Managers (The Java™ Tutorials > Creating a GUI With JFC/Swing > Laying Out Components Within a Container)
 
wie gesagt funktioniert das add, wenn du initComponents() weglässt,

alternativ könntest du es irgendwie über einen GUI-Builder einfügen wie bisher schon JBild & Co.
das ist aber keine Java-Frage, sondern Bedienung irgendeines externen Tools

um komplexere GUIs direkt in Java selber zu programmieren musst du ich mit LayoutManagern auseinandersetzen,
nicht ganz leicht aber gibt Lehrbücher, einen Link schon gepostet, Schritt für Schritt
 

Zurück
Oben