Paint-Methode aufrufen

Status
Nicht offen für weitere Antworten.

TheKing

Aktives Mitglied
Ich hab schon gegoogelt, aber nichts wirklich hilfreiches gefunden. Also:
Ich habe ein Fenster, mit einem einfachem JPanel und einem JButton. Wenn man auf den Button klickt soll ein Kreis ins JPanel gezeichnet werden.
Mit
Java:
Graphics grafik = getGraphics();
würde mir da schon eine Lösung einfallen.
Mit "public void paint(Graphics grafik) {".. aber nicht. Hat jemand eine Idee?
 
Man macht NIE getGraphics()

zeichnen tut man immer in der paintComponent methode, welche man überschreiben hat (im JPanel)
 
Du überschreibst einfach die paintComponent von deinem Panel, in der bei einem gesetzten Flag ein Kreis in das Panel gezeichnet wird.
Wenn der Button gedrückt wird, setzt du das Flag auf true, repaintest das Panel und setzt danach das Panel wieder auf false.
 
Java:
public class KreisPanel extends JPanel {

    boolean drawCircle = false;

    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        if(drawCircle) {
             // Kreis zeichnen
        }
    }
}

In Swing wird in der Regel die Methode paintComponent() überschrieben, nicht die Methode paint().
Irgendwo außerhalb der paint*()-Methoden getGraphics() aufzurufen ist normalerweise ein Fehler, weil man damit meistens kein bzw nicht das richtige Graphics-Objekt erhält.
 
ich hab mir mal kurz einen (nicht sehr ordentlichen 😳) Code zusammengebastelt...
Java:
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package paint;


import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
/**
 *
 * @author Admin
 */
public class Main extends JFrame implements ActionListener {

    private JButton knopf;
    private boolean button_click;

    public Main() {

       super("Java-Zeichnen");


       JPanel panel = new JPanel();
       knopf = new JButton("Drück");
       knopf.addActionListener(this);
       panel.setLayout(new GridLayout(6, 0));
       panel.add(knopf);
       setContentPane(panel);
    }
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
        Main fenster = new Main();
        fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        fenster.setSize(900, 900);
        fenster.setVisible(true);
    }

    public void actionPerformed(ActionEvent e) {
        if (button_click == false) {
 button_click = true;
 } 
repaint();
        }


    public void paint(Graphics g) {
        g.setColor(Color.red);
        if (button_click) {
         int x = (int) (Math.random() * 901);
         int y = (int) (Math.random() * 901);
       g.fillRect(x, y, 100, 100);
       } 
    }


 }
 
So:
Java:
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package paint;


import javax.swing.*;
import java.awt.*;

/**
 *
 * @author Admin
 */
public class Main extends JFrame  {


    private JLabel label;
    private boolean button_click;

    public Main() {

       super("Java-Zeichnen");


       JPanel panel = new JPanel();
       panel.setLayout(new GridLayout(6, 0));

       label = new JLabel("Malen mit Java:");
       zeichne z =  new zeichne();

       panel.add(label);
       panel.add(z);
       
      setContentPane(panel);
    }
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
        Main fenster = new Main();
        fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        fenster.setSize(900, 900);
        fenster.setVisible(true);
    }



class zeichne extends JPanel {
    @Override

    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.setColor(Color.red);
        g.fillRect(100, 10, 100, 100);
       
    }

}
 }
 
Zuletzt bearbeitet:
Ok. Da wir ja keinen neuen Thread eröffnen wollen:
Ich bin dabei ein kleines (betone "kleines") Spiel in Java zu programmieren. Da ich ja mit der Paint Methode sehr viele "ausernandersetzungen" hatte 😀, hab ich noch ein paar kleine Test's gemacht. Aber es zeichnet mir nichts hin:????:L
Java:
package paint_test;

//Importieren 
import javax.swing.*;
import java.awt.*;

/**
 *
 * @author admin
 */
public class Main extends JFrame {

    public Main() {


        super("Paint");

        JPanel panel = new JPanel();

        Ball ball = new Ball();
        panel.add(ball);

        setContentPane(panel);
    }

    public class Ball extends JPanel {

        @Override
        public void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.setColor(Color.red);
            g.drawRect(100, 100, 100, 100);

        }
    }

    /**
     * @param args the command line arguments
     */

    public static void main(String[] args) {
        
        Main fenster = new Main();
        fenster.setSize(600, 500);
        fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        fenster.setVisible(true);
    }
}
Was ist daran falsch?:rtfm:;(
 
Das JPanel "panel" hat das FlowLayout als Layoutmanager per default gesetzt. Dieser stellt deine Instanz von Ball mit 10x10 Pixeln dar, da dies die default-Preferredsize von JPanel ist (und Ball ist ja ein JPanel...). Änder den Konstruktor z.b. auf das hier:
Java:
    public Main() {
        super("Paint");

        JPanel panel = new JPanel();
        panel.setLayout(new BorderLayout());

        Ball ball = new Ball();
        panel.add(ball);

        add(panel);
    }
 
Zuletzt bearbeitet:
😱 Danke.JUHU

Könnte man das auch mit einem anderen Laayout Manager wie z.B dem GridLayout machen?
 
:shock:

Sorry, habe auch keine Ahnung!

Aber besoffen bin ich doch noch gar nicht! 😳

Wenn du statt
setContentPane(panel);
schreibst:
setContentPane(ball);

dann geht es komischerweise aber den
eigentlichen Fehler sehe ich auch nicht ???:L

Sollte doch eigentlich klappen.

Geh' dann mal lieber ins Wochenende. 😳
 
Könnte man das auch mit einem anderen Laayout Manager wie z.B dem GridLayout machen?
Du kannst das Layout benutzen das dich glücklich macht. Du musst das Layout halt nur so wählen das alles so dargestellt wird wie du es willst. Grundsätzlich ist mit dem GridLayout aufjedenfall viel mehr möglich als mit dem BorderLayout.

Oder war das jetzt ne Frage danach wie der selbe Code mit dem GridBagLayout konkret aussehen würde? :bahnhof:
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben