Probleme beim zeichnen mit paintComponent()

kAW

Neues Mitglied
Guten Tag,
ich versuche mittels eines GUIs auf einen JPanel zu zeichnen. Ich habe dies auch erst erfolgreich geschafft, allerdings indem ich getGraphics() benutzt habe. Schnell wurde klar, dass dies nicht der richtige Lösungsansatz ist und ich mit paintComponent() arbeiten muss.
Ich habe in einem JMenu 2 Einträge über die ich Kreise oder Rechtecke zeichnen möchte,
momentan ist es mein Ziel einfach nur " gg.drawOval(100, 100, 100, 100); " welches in paintComponent() ist umzusetzen. Leider vergebens.
Es hieß ich solle meine zu zeichnenden Objekte in Listen speichern und so durchiterieren wenn ich zeichne, leider ist mir nicht klar wie ich dies umsetzen kann.
Bitte guckt euch die Klasse RandomDrawer an. Ich soll mit den Zeichenmethoden der Klasse Graphics2D zeichen.
Was mache ich falsch? Hier mein text:

Java:
package plotterpackage;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.util.List;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.Shape;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
import java.util.ArrayList;
import java.util.Random;

import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.WindowConstants;
import javax.swing.border.BevelBorder;
import javax.swing.text.JTextComponent;


public class PlotterApp implements ComponentListener  {
    private JFrame frame;
    private JPanel canvas;
    private JPanel statusBar;
    private JTextField status;
    /**
     * Public default constructor.   
     */
    public PlotterApp() {
        initialize();
    }
    /**
     * Start of the application.
     * @param args command line arguments
     */
    public static void main(String[] args) {
        PlotterApp app = new PlotterApp();
        app.start();
    }
    /**
     * Initialize the application.
     */
    protected void initialize() {
        frame = new JFrame("Main");
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frame.setBounds(50,50, 50+640, 50+480);
        frame.setBackground(Color.GREEN);
        frame.setJMenuBar(createMenuBar());
       
        frame.getContentPane().add(createContent(), BorderLayout.CENTER);
        frame.getContentPane().add(createStatusBar(),BorderLayout.SOUTH);       
    }
    /**
     * Start the graphical user interface.
     */
    public void start() {
        // show the GUI
        frame.setVisible(true);
        status.setText("Application started");
    }
    /**-*
     * Internal helper to create the main content.
     * @return component with application content.
     */
    protected JComponent createContent() {
        canvas = new JPanel();
        canvas.addMouseListener(new Painter());
        canvas.addMouseMotionListener(new Painter());
        canvas.addComponentListener(this);
        canvas.setBackground(new Color(128,218,255));
        canvas.setForeground(Color.RED);
        canvas.setBorder(new BevelBorder(BevelBorder.LOWERED));
        return canvas;
    }
    /**
     * Internal helper to create the statusbar and -fields.
     * @return component with status/bar.
     */   
    protected JComponent createStatusBar() {
        FlowLayout layout = new FlowLayout(FlowLayout.LEFT);
        layout.setHgap(5);
       
        statusBar = new JPanel(layout);
        statusBar.add(new JLabel("Status: "));

        status = new JTextField();
        status.setPreferredSize(new Dimension(400,25));
        status.setEditable(false);
        status.setBorder(new BevelBorder(BevelBorder.RAISED,Color.MAGENTA,Color.LIGHT_GRAY));
        status.getInsets().set(2, 10, 2, 10);
        statusBar.add(status);
       
        return statusBar;
    }
    /**
     * Internal helper to create the frames menubar.
     * @return menu bar
     */
    protected JMenuBar createMenuBar() {
        JMenuBar mb = new JMenuBar();
        JMenuItem item;
        JMenu menu;
        // Action menu
        menu = new JMenu("Actions");
        mb.add(menu);
        item = new JMenuItem("Draw RandomCircle");
        item.addActionListener(new RandomDrawer());
        menu.add(item);
       
        item = new JMenuItem("Draw RandomRectangle");
        item.addActionListener(new RandomDrawer());
        menu.add(item);
       
        item = new JMenuItem("check array");
        item.addActionListener(new RandomDrawer());
        menu.add(item);
       
        menu.addSeparator();
        item = new JMenuItem("Exit");
        item.addActionListener(new AppCloser());
        menu.add(item);
       
        // Color menu not used so far
        menu = new JMenu("Colors");       
        mb.add(menu);
        // Help menu not used so far
        menu = new JMenu("Help");       
        mb.add(menu);
       
        return mb;
    }
   
    class AppCloser implements ActionListener {
        /* (non-Javadoc)
         * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
         */
        @Override
        public void actionPerformed(ActionEvent e) {
            System.out.println("application finished, bye-bye... ");
            frame.setVisible(false);
            frame.dispose();
            System.exit(0);
        }       
    }

    class DrawShape {
        public DrawShape() {
            // TODO Auto-generated constructor stub
        }
        public DrawShape(String string) {
            // TODO Auto-generated constructor stub
        }
    }
   
    class RandomDrawer extends JPanel implements ActionListener {
        /* (non-Javadoc)
         * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
         */   
        private List<DrawShape> shapes = new ArrayList<DrawShape>();
       

        public void addShape(DrawShape s) {
            shapes.add(s);
            repaint();
        }

       
        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            final Graphics2D gg = (Graphics2D) g;
            gg.setColor(Color.BLACK);
            gg.drawOval(100, 100, 100, 100);
        }
       
       
        @Override
        public void actionPerformed(ActionEvent e) {
            Random generator = new Random();
            int x = generator.nextInt(100)+100;
            int y = generator.nextInt(100)+100;
           
            if (e.getActionCommand()==("Draw RandomCircle")) {
                System.out.printf("x = %d y = %d\n", x, y);
                //status.setText(String.format("rnd draw x:%d  y:%d ", x, y));
                DrawShape shape = new DrawShape();
                addShape(shape);
                int count = shapes.size();
                System.out.printf("objects in array: %d\n", count);
                //repaint();
            }
           
            else if (e.getActionCommand()==("Draw RandomRectangle")) {
                System.out.printf("x = %d y = %d\n", x, y);
                DrawShape shape = new DrawShape();
                addShape(shape);
                int count = shapes.size();
                System.out.printf("objects in array: %d\n", count);
                //status.setText(String.format("rnd draw x:  y: "));
                //Graphics2D gg = (Graphics2D) canvas.getGraphics();
                //gg.setColor(Color.BLACK);
                //gg.drawRect(x, y, generator.nextInt(x), generator.nextInt(y));
            }
            else {
                int ss = shapes.size();
                System.out.printf("objects in ARRAY: %d\n", ss);
            }
        }
    }

   
    class Painter extends MouseAdapter implements MouseMotionListener {
   
      Point start, end;
      int startX, startY, oldX, oldY, oldWidth, oldHeight;

      public void mousePressed(MouseEvent e) {
        start = e.getPoint();
        oldX = startX;
        oldY = startY;
        startX = e.getX();
        startY = e.getY();
        status.setText(String.format("Mouse start: " + start));
      }

      public void mouseDragged(MouseEvent e) {
        //Graphics2D gc = (Graphics2D)canvas.getGraphics();
        //gc.setColor(new Color(128, 218, 255));
        //gc.drawOval(oldX, oldY, oldWidth, oldHeight);
        System.out.printf("oldWidth ist = %3d, oldHeight ist = %3d\n", oldWidth, oldHeight);
        oldWidth = e.getX();
        oldHeight = e.getY();
        //gc.setColor(Color.BLACK);
        //gc.drawOval(startX, startY, e.getX(), e.getY());
      }

      public void mouseReleased(MouseEvent e) {
        end = e.getPoint();
        status.setText(String.format("Mouse end: " + end));
      }
    }


    @Override
    public void componentHidden(ComponentEvent e) {
        // TODO Auto-generated method stub
       
    }
    @Override
    public void componentMoved(ComponentEvent e) {
        // TODO Auto-generated method stub
       
    }
    @Override
    public void componentResized(ComponentEvent e) {
        // TODO Auto-generated method stub
       
    }
    @Override
    public void componentShown(ComponentEvent e) {
        // TODO Auto-generated method stub
       
    }
    }
 

Harry Kane

Top Contributor
Ich sehe zwei Hauptfehler:
1. Deine Instanzen von RandomDrawer sind sowohl JPanels als auch ActionListener. Sie werden aber nirgendwo als JPanel verwendet, d. h. sie werden nirgendwo in deine Gui eingefügt. Deswegen wird ihre paintComponent-methode auch niemals ausfegrufen.
2. Deine DrawShape-Klasse ist sinnlos. Was soll eine Klasse die nur aus leeren Methodenrümpfen besteht?
Ein vereinfachtes Beispiel für das, was du machen möchtest, habe ich hier schon mal programmiert.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
B 2D-Grafik paintcomponent Probleme beim zeichnen AWT, Swing, JavaFX & SWT 10
S AWT Probleme beim Zeichnen AWT, Swing, JavaFX & SWT 3
N 2D-Grafik 2 Probleme beim zeichnen AWT, Swing, JavaFX & SWT 18
O Probleme beim Zeichnen und AWT-Event-Queue-0 Exception AWT, Swing, JavaFX & SWT 5
R Probleme beim Zeichnen eines Koordinatensystems AWT, Swing, JavaFX & SWT 10
I Probleme beim Drucken auf einen PDF-Drucker AWT, Swing, JavaFX & SWT 8
D JavaFX Probleme beim nachtäglichen hinzufügen der jfx dependency AWT, Swing, JavaFX & SWT 7
L JavaFX Probleme beim Installieren JavaFX11 / JavaFX12 -- Eclipse 2019-03 AWT, Swing, JavaFX & SWT 3
H JavaFX Probleme Beim Wechseln der scene als .fxml AWT, Swing, JavaFX & SWT 7
F JavaFX Probleme beim automatischen Konvertieren AWT, Swing, JavaFX & SWT 4
T Java FX Probleme beim befüllen eines Tableviews AWT, Swing, JavaFX & SWT 5
K Probleme beim JPasswordField AWT, Swing, JavaFX & SWT 11
D JavaFX Probleme bei Service-Klasse beim ändern der GUI AWT, Swing, JavaFX & SWT 8
C Java FX Probleme beim Schließen einer Stage AWT, Swing, JavaFX & SWT 11
H Swing Probleme beim erstellen eines neuen Objektes durch einen Button AWT, Swing, JavaFX & SWT 10
C SWT probleme beim einbinden von Images AWT, Swing, JavaFX & SWT 2
S Probleme beim drucken AWT, Swing, JavaFX & SWT 13
D Swing Probleme beim Anzeigen der einzelnen Komponenten AWT, Swing, JavaFX & SWT 16
N Probleme beim positionieren von Elementen AWT, Swing, JavaFX & SWT 2
A Probleme beim FocusListener AWT, Swing, JavaFX & SWT 6
L Probleme beim Refresh von JTable AWT, Swing, JavaFX & SWT 7
S Swing Probleme beim Aktualisieren einer JComboBox nach Auswahländerung AWT, Swing, JavaFX & SWT 2
K JList-Probleme beim Hinzufügen von Elementen AWT, Swing, JavaFX & SWT 3
P Swing Probleme beim Zeichen AWT, Swing, JavaFX & SWT 6
A Probleme beim Drucken AWT, Swing, JavaFX & SWT 5
M Probleme beim Bild einfügen in CenterPanel AWT, Swing, JavaFX & SWT 5
A Probleme beim Drucken (Seite wird abgeschnitten) AWT, Swing, JavaFX & SWT 2
S Probleme beim Neuzeichnen eines JLabels AWT, Swing, JavaFX & SWT 6
W Probleme beim Erstellen einer Tabelle AWT, Swing, JavaFX & SWT 2
T Probleme beim Resizen einer JScrollPane AWT, Swing, JavaFX & SWT 2
M Probleme beim Hinzufügen von Objekten zu getContentPane() AWT, Swing, JavaFX & SWT 2
G Probleme beim Panelstruktur AWT, Swing, JavaFX & SWT 13
E Probleme beim Layout! AWT, Swing, JavaFX & SWT 8
E Probleme beim Layout mit Buttons und CheckboxGroup AWT, Swing, JavaFX & SWT 9
S Probleme beim Laden und Speichern von Dateien AWT, Swing, JavaFX & SWT 6
C Habe Probleme beim Bild laden! *Update 30.11.2006* AWT, Swing, JavaFX & SWT 28
C Probleme beim Serialisieren mit JOptionPane AWT, Swing, JavaFX & SWT 12
C Probleme beim ausführen von Programmen mit Fenstern+Inhalt AWT, Swing, JavaFX & SWT 3
Q JTextPane / Probleme beim Einfügen von <br>-Tags AWT, Swing, JavaFX & SWT 2
G Probleme beim Lösen einer Übungsaufgabe AWT, Swing, JavaFX & SWT 5
C Probleme beim 2. öffnen eines Fensters AWT, Swing, JavaFX & SWT 5
A Probleme beim Ausdrucken AWT, Swing, JavaFX & SWT 4
V Probleme beim Scrollen ein JPanels mit JScrollPane AWT, Swing, JavaFX & SWT 2
R Probleme beim Wiederherstellen eines JInternalFrames AWT, Swing, JavaFX & SWT 4
G Probleme beim Füllen einer JTable AWT, Swing, JavaFX & SWT 2
Juelin Probleme bei Stage.close() AWT, Swing, JavaFX & SWT 23
XWing Swing Image anzeigen und probleme mit klassen AWT, Swing, JavaFX & SWT 3
E repaint Probleme AWT, Swing, JavaFX & SWT 13
mananana Mögliche probleme die in einer GUI passieren Können AWT, Swing, JavaFX & SWT 6
S GridBagLayout - Probleme mit Bilderanzeige AWT, Swing, JavaFX & SWT 3
J Probleme mit idividueller Tablecell AWT, Swing, JavaFX & SWT 0
J Probleme mit InputDialog AWT, Swing, JavaFX & SWT 4
D JavaFX TextArea Probleme bei langen Zeilen AWT, Swing, JavaFX & SWT 1
G JavaFX SplitPane Anwendung - Controller Probleme AWT, Swing, JavaFX & SWT 5
K Probleme bei der Erstellung und Ausführung einer Jar Datei AWT, Swing, JavaFX & SWT 2
B Probleme Action Listener Taschenrechner AWT, Swing, JavaFX & SWT 27
pph080560 JavaFX Probleme mit FX AWT, Swing, JavaFX & SWT 3
M Probleme mit OpenJDK AWT, Swing, JavaFX & SWT 6
B Swing Probleme mit dem Layout AWT, Swing, JavaFX & SWT 1
Fiedlerdan Image-Pfad Probleme nach Export aus Eclipse AWT, Swing, JavaFX & SWT 31
H JFreeChart - DemoDataSetFactory Probleme AWT, Swing, JavaFX & SWT 1
H LayoutManager Probleme mit Positionierung/Abständen der Komponenten AWT, Swing, JavaFX & SWT 14
A Probleme mit gridheight (GridBagLayout) AWT, Swing, JavaFX & SWT 6
U Opaque Probleme AWT, Swing, JavaFX & SWT 3
S Probleme mit JComboboxen(?) AWT, Swing, JavaFX & SWT 18
S Swing Probleme mit MigLayout AWT, Swing, JavaFX & SWT 2
C Probleme mit createImage AWT, Swing, JavaFX & SWT 1
J Probleme mit contex Menu (javafx) AWT, Swing, JavaFX & SWT 1
J Probleme bei GameofLife AWT, Swing, JavaFX & SWT 24
S JavaFx - Button ActionEvent Probleme AWT, Swing, JavaFX & SWT 3
T Swing Probleme mit repaint() bzw. JScrollPane AWT, Swing, JavaFX & SWT 7
ImperatorMing JavaFX Probleme mit WindowEvent AWT, Swing, JavaFX & SWT 0
ImperatorMing JavaFX Probleme mit WindowEvent AWT, Swing, JavaFX & SWT 5
J LayoutManager GridBagLayout, probleme mit Anordnung von Objekten AWT, Swing, JavaFX & SWT 6
A Swing Probleme mit dem adden von JButtons zur JScrollPane AWT, Swing, JavaFX & SWT 2
D Swing Probleme mit dem Resizing AWT, Swing, JavaFX & SWT 7
G Probleme mit TextArea AWT, Swing, JavaFX & SWT 5
G JFrame Probleme AWT, Swing, JavaFX & SWT 2
G Cardlayout Refresh Probleme AWT, Swing, JavaFX & SWT 2
J Swing Probleme mit ListSelectionListener(), Inhalte der JList werden gelöscht? AWT, Swing, JavaFX & SWT 6
M JButton Probleme AWT, Swing, JavaFX & SWT 14
L Probleme mit Programm AWT, Swing, JavaFX & SWT 13
blazingblade komischerweise probleme mit jtextfield.gettext() AWT, Swing, JavaFX & SWT 9
Xanny 2D-Grafik Beginner! Probleme mit Swing, Gprahics class und paint AWT, Swing, JavaFX & SWT 13
Sin137 LayoutManager GridBagLayout Probleme AWT, Swing, JavaFX & SWT 6
H Netbeans Designer: Probleme mit JPanel und JFrame AWT, Swing, JavaFX & SWT 2
M Swing Probleme mit Frame.pack() AWT, Swing, JavaFX & SWT 1
M Swing JProgressbar und Outoputstream probleme AWT, Swing, JavaFX & SWT 2
S Swing Probleme mit transparenz der Hintergrundfarbe und JRadioButtons AWT, Swing, JavaFX & SWT 2
Z Probleme mit JPanel's AWT, Swing, JavaFX & SWT 6
T Probleme mit Anzeige von Elementen im JPanel AWT, Swing, JavaFX & SWT 1
Shams Probleme bei dem Hinzufügen von Komponenten zu einem JFrame AWT, Swing, JavaFX & SWT 3
A Swing Probleme mit JScrollPane AWT, Swing, JavaFX & SWT 6
M Layout-Probleme unter Swing AWT, Swing, JavaFX & SWT 5
J JavaFX JavaFX Probleme bei der Anzeige von Text AWT, Swing, JavaFX & SWT 18
A Probleme mit TilledBorder("***") AWT, Swing, JavaFX & SWT 4
F Bildschirmschoner Probleme mit Preview AWT, Swing, JavaFX & SWT 8
X Panel Probleme (Tetris) AWT, Swing, JavaFX & SWT 8
N JTable probleme AWT, Swing, JavaFX & SWT 5
B Probleme bei ImageIO.read (?!) AWT, Swing, JavaFX & SWT 9

Ähnliche Java Themen

Neue Themen


Oben