Swing Mit Swing zeichnen / NetBeans GUI

Helgon

Bekanntes Mitglied
Hey, habe mich heute das erste mal mit dem zeichnen in Java beschäftigt und bin dann auch auf das Tutorial zu mit Java in Swing zeichnen gestoßen. Ausprobiert, alles geklappt, also sofort versucht umzusetzen.

Hab mir mein benötigtes GUI in NetBeans zusammen geklickt, alles eingebunden wie es sich gehört, nur leider wird bei mir nichts gezeichnet.

Vielleicht hat ja jemand eine Idee warum:

Java:
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Shape;

import javax.swing.JComponent;

class NaivePaintingComponent extends JComponent
{
    private Shape shape;
    private Color c;
    
    @Override
    protected void paintComponent(Graphics g) {
    	
        //dient dazu den Hintergrund zu säubern wie wir es vorher bereits mit
        //clearRect getan haben.
        super.paintComponent(g);
        
        //AWT/Swing bestimmt wann paintComponent aufgerufen wird, wir müssen
        //nun also überprüfen ob shape und color noch gar nicht gesetzt wurden
        if(shape!=null && c!=null)
        {
            Graphics2D g2d = (Graphics2D)g;
            g2d.setColor(c);
            g2d.draw(shape);
        }
    }
    
    public void setColor(Color c) {
        this.c = c;
    }
 
    public void setShape(Shape shape) {
        this.shape = shape;
    }

Java:
 private void initComponents() {

        // [...]
        paintingComponent = new NaivePaintingComponent();
        
        paintingComponent.setPreferredSize(new Dimension(300, 300));
        add(paintingComponent, BorderLayout.CENTER);

        drawButton.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent e) {
				
				System.out.println("paint");
				paintingComponent.setColor(Color.BLUE);
				paintingComponent.setShape(new Ellipse2D.Float(10f,10f,100f,100f));
				paintingComponent.repaint();
			}
		});

Alle GUI Elemente befinden sich unten im Fenster, verdeckt wird also definitiv nichts (davon).

Hoffe das jemand mir sagen kann, wo ich grad auf dem Schlauch stehe.

Grüße
 
Alles klar. Einfach die oben gennante Klasse (NativePaintingComponent)

sowie diese hier (ist all in one)

Java:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Shape;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.geom.Ellipse2D;

import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;


public class ProbabilityFrameGui extends javax.swing.JFrame {

    public ProbabilityFrameGui() {
        initComponents();
    }

    @SuppressWarnings("unchecked")
    
    private void initComponents() {

        colorChooser = new javax.swing.JColorChooser();
        jPanel1 = new javax.swing.JPanel();
        colorPickerA = new javax.swing.JButton();
        colorPickerB = new javax.swing.JButton();
        colorA = new javax.swing.JLabel();
        colorB = new javax.swing.JLabel();
        jSeparator1 = new javax.swing.JSeparator();
        zaehlerA = new javax.swing.JTextField();
        nennerA = new javax.swing.JTextField();
        jLabel3 = new javax.swing.JLabel();
        jLabel4 = new javax.swing.JLabel();
        zaehlerB = new javax.swing.JTextField();
        nennerB = new javax.swing.JTextField();
        jSeparator2 = new javax.swing.JSeparator();
        mitOption = new javax.swing.JRadioButton();
        ohneOption = new javax.swing.JRadioButton();
        textCheck = new javax.swing.JCheckBox();
        jLabel5 = new javax.swing.JLabel();
        orderText = new javax.swing.JTextField();
        jLabel6 = new javax.swing.JLabel();
        jSeparator3 = new javax.swing.JSeparator();
        jSeparator4 = new javax.swing.JSeparator();
        resetButton = new javax.swing.JButton();
        drawButton = new javax.swing.JButton();
        buttonGroup1 = new javax.swing.ButtonGroup();
        paintingComponent = new NaivePaintingComponent();
        
        paintingComponent.setPreferredSize(new Dimension(300, 300));
        add(paintingComponent, BorderLayout.CENTER);

        colorPickerA.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent arg0) {
				
				colorA.setBackground(colorChooser.showDialog(colorPickerA, "Farbe für Option A", colorA.getBackground()));
				
			}
		});
        
        colorPickerB.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent arg0) {
				
				colorB.setBackground(colorChooser.showDialog(colorPickerB, "Farbe für Option B", colorB.getBackground()));
				
			}
		});
        
        drawButton.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent e) {
				
				System.out.println("paint");
				paintingComponent.setColor(Color.BLUE);
				paintingComponent.setShape(new Ellipse2D.Float(10f,10f,100f,100f));
				paintingComponent.repaint();
			}
		});
        
        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        jPanel1.setBorder(javax.swing.BorderFactory.createEtchedBorder());

        colorPickerA.setText("Option A");

        colorPickerB.setText("Option B");
        colorPickerB.setMaximumSize(new java.awt.Dimension(75, 23));
        colorPickerB.setMinimumSize(new java.awt.Dimension(75, 23));
        colorPickerB.setPreferredSize(new java.awt.Dimension(75, 23));

        colorA.setBackground(new java.awt.Color(255, 0, 51));
        colorA.setOpaque(true);
        colorA.setPreferredSize(new java.awt.Dimension(21, 21));

        colorB.setBackground(new java.awt.Color(0, 0, 255));
        colorB.setOpaque(true);
        colorB.setPreferredSize(new java.awt.Dimension(21, 21));

        jSeparator1.setOrientation(javax.swing.SwingConstants.VERTICAL);

        zaehlerA.setText("jTextField1");

        nennerA.setText("jTextField1");

        jLabel3.setText("Wahrscheinlichkeit A:");

        jLabel4.setText("Wahrscheinlichkeit B:");

        zaehlerB.setText("jTextField1");

        nennerB.setText("jTextField1");

        jSeparator2.setOrientation(javax.swing.SwingConstants.VERTICAL);

        buttonGroup1.add(mitOption);
        mitOption.setText("Mit zurück legen");

        buttonGroup1.add(ohneOption);
        ohneOption.setText("Ohne zurück legen");

        textCheck.setText("Beschriftung");

        jLabel5.setText("Reihenfolge:");

        orderText.setText("jTextField5");

        jLabel6.setText("Beispiel: \"ABBBAAB\"");

        jSeparator3.setOrientation(javax.swing.SwingConstants.VERTICAL);

        jSeparator4.setOrientation(javax.swing.SwingConstants.VERTICAL);

        resetButton.setText("Zurücksetzen");

        drawButton.setText("Zeichnen");

        javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
        jPanel1.setLayout(jPanel1Layout);
        jPanel1Layout.setHorizontalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel1Layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(jPanel1Layout.createSequentialGroup()
                        .addComponent(colorPickerA)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addComponent(colorA, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                        .addComponent(zaehlerA)
                        .addComponent(jLabel3, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                        .addComponent(nennerA, javax.swing.GroupLayout.PREFERRED_SIZE, 102, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(jSeparator1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(jPanel1Layout.createSequentialGroup()
                        .addComponent(colorPickerB, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addComponent(colorB, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                        .addComponent(zaehlerB)
                        .addComponent(jLabel4, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                        .addComponent(nennerB, javax.swing.GroupLayout.PREFERRED_SIZE, 102, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(jSeparator2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(orderText, javax.swing.GroupLayout.PREFERRED_SIZE, 134, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jLabel5)
                    .addComponent(jLabel6))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(jSeparator3, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(mitOption)
                    .addComponent(ohneOption)
                    .addComponent(textCheck))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jSeparator4, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                    .addComponent(resetButton, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(drawButton, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );
        jPanel1Layout.setVerticalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel1Layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addGroup(jPanel1Layout.createSequentialGroup()
                        .addGap(0, 0, Short.MAX_VALUE)
                        .addComponent(drawButton)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(resetButton))
                    .addComponent(jSeparator4, javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jSeparator3, javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jSeparator1)
                    .addComponent(jSeparator2, javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(javax.swing.GroupLayout.Alignment.LEADING, jPanel1Layout.createSequentialGroup()
                        .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                            .addGroup(javax.swing.GroupLayout.Alignment.LEADING, jPanel1Layout.createSequentialGroup()
                                .addGap(27, 27, 27)
                                .addComponent(jLabel5)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addComponent(orderText, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addComponent(jLabel6))
                            .addGroup(javax.swing.GroupLayout.Alignment.LEADING, jPanel1Layout.createSequentialGroup()
                                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                    .addComponent(colorPickerA)
                                    .addComponent(colorA, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addComponent(jLabel3)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addComponent(zaehlerA, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addComponent(nennerA, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                            .addGroup(javax.swing.GroupLayout.Alignment.LEADING, jPanel1Layout.createSequentialGroup()
                                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                    .addComponent(colorPickerB, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                                    .addComponent(colorB, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addComponent(jLabel4)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addComponent(zaehlerB, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addComponent(nennerB, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                            .addGroup(javax.swing.GroupLayout.Alignment.LEADING, jPanel1Layout.createSequentialGroup()
                                .addComponent(mitOption)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addComponent(ohneOption)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addComponent(textCheck)))
                        .addGap(0, 0, 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(16, Short.MAX_VALUE)
                .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addContainerGap(262, Short.MAX_VALUE)
                .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap())
        );

        pack();
    }
    
public static void main(String[] args) {
		
		try {
            // Set System L&F
        UIManager.setLookAndFeel(
            UIManager.getSystemLookAndFeelClassName());
	    } 
	    catch (UnsupportedLookAndFeelException e) {
	       // handle exception
	    }
	    catch (ClassNotFoundException e) {
	       // handle exception
	    }
	    catch (InstantiationException e) {
	       // handle exception
	    }
	    catch (IllegalAccessException e) {
	       // handle exception
	    }


        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new ProbabilityFrameGui().setVisible(true);
            }
        });
	}
    
    private NaivePaintingComponent paintingComponent;
    private javax.swing.JLabel colorB;
    private javax.swing.JLabel colorA;
    private javax.swing.JColorChooser colorChooser;
    private javax.swing.JButton colorPickerA;
    private javax.swing.JButton colorPickerB;
    private javax.swing.JButton drawButton;
    private javax.swing.JLabel jLabel3;
    private javax.swing.JLabel jLabel4;
    private javax.swing.JLabel jLabel5;
    private javax.swing.JLabel jLabel6;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JSeparator jSeparator1;
    private javax.swing.JSeparator jSeparator2;
    private javax.swing.JSeparator jSeparator3;
    private javax.swing.JSeparator jSeparator4;
    private javax.swing.JRadioButton mitOption;
    private javax.swing.JTextField nennerA;
    private javax.swing.JTextField nennerB;
    private javax.swing.JRadioButton ohneOption;
    private javax.swing.JTextField orderText;
    private javax.swing.JButton resetButton;
    private javax.swing.JCheckBox textCheck;
    private javax.swing.JTextField zaehlerA;
    private javax.swing.JTextField zaehlerB;
    private javax.swing.ButtonGroup buttonGroup1;
}
 
Du fügst zwar deine paintingComponent ein. Überschreibst danach aber das komplette Layout.
Die Komponente ist einfach nichtmehr sichtbar.
 
Wo soll ich sie dann einfügen? Am Ende der Methode bringt jedenfalls nix :/

Hatte auch schon probiert ein JPanel im JFrame zu haben und dann nur darauf zu zeichnen. Klappte nicht.
 
Fang doch erstmal ne Nummer kleiner an. Soviel GUI Code den du nicht verstehst brauchst du nicht.

Java:
public class Demo {
    
    public static void main(String[] args) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            @Override
			public void run() {
                JFrame frame = new JFrame ("Demo");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                
                final NaivePaintingComponent paintingComponent = new NaivePaintingComponent();
                paintingComponent.setPreferredSize(new Dimension (200, 200));
                
                JButton button = new JButton("Zeichnen");
                button.addActionListener(new ActionListener () {
                	@Override
                	public void actionPerformed(ActionEvent e) {
                		paintingComponent.setColor(Color.BLUE);
                        paintingComponent.setShape(new Ellipse2D.Float(10f,10f,100f,100f));
                        paintingComponent.repaint();	
                	}
                });

                frame.add (paintingComponent, BorderLayout.CENTER);
                frame.add (button, BorderLayout.SOUTH);
                frame.pack ();
                frame.setVisible(true);
            }
        });
    }
}
So Funktionierts. Mehr zum Thema Layoutmanager (und warum dein Code nicht funktioniert) findest du hier:
A Visual Guide to Layout Managers (The Java™ Tutorials > Creating a GUI With JFC/Swing > Laying Out Components Within a Container)
 
Jo danke, der Link war hilfreich.

Wies aussieht musste ich die(?) Component an das vertical und horizontal Layout dran hängen
Hab einfach noch ein JPanel ins Gui gezogen und nutze dieses als Zeichenfläche

Java:
paintingComponent.setPreferredSize(jPanel2.getSize());

        javax.swing.GroupLayout jPanel2Layout = new javax.swing.GroupLayout(jPanel2);
        jPanel2.setLayout(jPanel2Layout);
        jPanel2Layout.setHorizontalGroup(
            jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 0, Short.MAX_VALUE)
            .addComponent(paintingComponent)
        );
        jPanel2Layout.setVerticalGroup(
            jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 241, Short.MAX_VALUE)
            .addComponent(paintingComponent)
        );
 
Mal noch kurz ne Frage. Wenn ich mehrere Objekte Zeichnen möchte:

Wird das in einer Paint Componente gemacht, oder erzeugt man mehrere?
 
Das kann man nicht pauschal beantworten. Wenns wie in deinem Fall darum gehen würde unterschiedliche shapes in verschiedenen Farben zu zeichnen, würde ich das mit einer Komponente machen die eine Liste von Formen als Attribut hält.
 
...ahh! ich hatte grad nen Brainlaag , sry 🙂 Ich hatte mich gedanklich grade in einen völlig falschen Ansatz verrant
 

Zurück
Oben