Erste Schritte (SEHR mühsam); Grafiktest

Status
Nicht offen für weitere Antworten.

tomdest

Mitglied
Hallo liebes Forum,

ich quäle mich gerade mit dem Einstieg in Java (reines Hobby, habe bisher in Delphi und VB geschrieben, damit kam ich sehr gut zurecht, jetzt würde mich Java aber doch mehr reizen; bisher habe ich zwei Bücher zum Thema Java, diverse Tutorials u. a.; Hauptproblem ist bei mir scheinbar der Umstieg von prozedural auf OOP...).

Das folgend Programm soll "einfach" bei Druck auf die Starttaste eine Grafik zeichnen, und bei der anderen Taste das Fenster schliessen.
Code:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Grafik extends JFrame {
  // Anfang Variablen
  private JButton jButtonStart = new JButton();
  private JButton jButtonEnde = new JButton();
  // Ende Variablen

  public Grafik(String title) {
    // Frame-Initialisierung
    super(title);
    addWindowListener(new WindowAdapter() {
      public void windowClosing(WindowEvent evt) { System.exit(0); }
    });
    int frameWidth = 300;
    int frameHeight = 300;
    setSize(frameWidth, frameHeight);
    Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
    int x = (d.width - getSize().width) / 2;
    int y = (d.height - getSize().height) / 2 ;
    setLocation(x, y);
    Container cp = getContentPane();
    cp.setLayout(null);
    // Anfang Komponenten

    jButtonStart.setBounds(32, 176, 89, 49);
    jButtonStart.setText("Start");
    cp.add(jButtonStart);
    jButtonStart.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent evt) {
        jButtonStartActionPerformed(evt);
      }
    });

    jButtonEnde.setBounds(168, 176, 89, 49);
    jButtonEnde.setText("Ende");
    cp.add(jButtonEnde);
    jButtonEnde.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent evt) {
        jButtonEndeActionPerformed(evt);
      }
    });

    // Ende Komponenten

    setResizable(false);
    setVisible(true);

  }

  // Anfang Ereignisprozeduren
  public void jButtonStartActionPerformed(ActionEvent evt) {

  }

  public void jButtonEndeActionPerformed(ActionEvent evt) {
  System.exit(0);
  }

  // Ende Ereignisprozeduren

  public static void main(String[] args) {
    new Grafik("Grafik");

  }
  public void paint(Graphics g)
  {
  int x = 10, y = 80;
  int sizex, sizey = 0;

  while (x < 280 && y < 180) {
    sizex = 4 + (int) (Math.random() * 9);
    if (Math.random() > 0.5) {
      y += sizey;
      sizey = 4 + (int) (Math.random() * 6);
    } else {
      sizey = 4 + (int) (Math.random() * 6);
      y -= sizey;
    }
    g.drawRect(x,y,sizex,sizey);
    x += sizex;
    //repaint(); wäre rekursiv
  }
}
}
Probleme hierbei:
a) Die Tasten sieht man nur, wenn man mit der Maus ein bißchen im Fenster rumfährt.
b) repaint() oder Ähnliches an das Ereignis "Druck auf die Starttaste" hinzubekommen, schaffe ich überhaupt nicht.

Ich hoffe die Fragen sind a) nicht zu blöd und b) überhaupt statthaft hier.


Viele Grüße,

Tom

P.S.: Benutzt wird das JDK 1.5 und der Java-Editor (sonst hätte ich das mit den Buttons wahrscheinlich überhaupt nicht hinbekommen...)
 

Illuvatar

Top Contributor
Zum Problem a): Die Buttons werden auch innerhalb von paint gezeichnet. Entweder - schöner, aber komplizierter, deshalb hier die Beschreibungs-Kurzversion - du machst dir eine neue Klasse extends JComponent, überschreibst da paint und machst setContentPane (instanzDeinerKlasse) oder du rufst am Ende in deiner paint-Methode
Code:
super.paint(g);
auf.

Zu b): Das ist ein Problem, das viele Anfänger haben ;) Dazu gibt es auch einen FAQ-Beitrag, aber ob der dir gerade so weiterhilft weiß ich nicht. Das Problem ist: paint wird immer aufgerufen, wenn das System neuzeichnen will, da hast du keinen Einfluss drauf. Also muss paint zu jeder Zeit wissen, was es denn jetzt zeichnen soll. In deinem Fall wäre es z.B. sinnvoll, eine Variable anzulegen, die besagt, ob der Button schon gedrückt wurde, wenn ja, wird das Rechteck gezeichnet, wenn nicht, wird nichts gezeichnet.
 

André Uhres

Top Contributor
Ich würde die Grafik erstmal auf ein Image zeichnen und in paintComponent(..) dann einfach nur das Image malen.
Ausserdem ist vom NullLayout dringendst abzuraten:
Code:
//package gui; 
/* 
* Grafik.java 
*/ 
import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 

public class Grafik extends JFrame { 
    // Anfang Variablen 
    private JButton jButtonStart = new JButton(); 
    private JButton jButtonEnde = new JButton(); 
    private DrawingPanel drawingPanel = new DrawingPanel(); 
    private JPanel btnPanel = new JPanel(); 
    private Image image; 
    private Graphics2D g2d; 
    private Color bgd = new Color(255,255,204);//background 
    private Color fgd = new Color(206,3,45);//foreground 
    // Ende Variablen 
    
    public Grafik(final String title) { 
        // Frame-Initialisierung 
        super(title); 
        addWindowListener(new WindowAdapter() { 
            public void windowClosing(final WindowEvent evt) { System.exit(0); } 
        }); 
        setSize(700,400); 
        setLocationRelativeTo(null);//zum zentrieren des Frames 
        Container cp = getContentPane(); 
        // Anfang Komponenten 
        jButtonStart.setText("Start"); 
        btnPanel.add(jButtonStart); 
        jButtonStart.addActionListener(new ActionListener() { 
            public void actionPerformed(final ActionEvent evt) { 
                jButtonStartActionPerformed(evt); 
            } 
        }); 
        
        jButtonEnde.setText("Ende"); 
        btnPanel.add(jButtonEnde); 
        jButtonEnde.addActionListener(new ActionListener() { 
            public void actionPerformed(final ActionEvent evt) { 
                jButtonEndeActionPerformed(evt); 
            } 
        }); 
        cp.add(drawingPanel, BorderLayout.CENTER); 
        cp.add(btnPanel, BorderLayout.SOUTH); 
        // Ende Komponenten 
        
        addComponentListener(new ComponentAdapter() { 
            public void componentResized(ComponentEvent e) { 
                image = null; 
            } 
        }); 
        setVisible(true); 
        
    } 
    
    // Anfang Ereignisprozeduren 
    public void jButtonStartActionPerformed(final ActionEvent evt) { 
        //Neuen Thread starten, ergibt Animationseffekt.
        //Über den Start-Button kann man dann auch mehrer Grafikanimationen
        //schnell hintereinander starten, die dann alle gleichzeitig laufen:
        new Thread(new Runnable() { 
            public void run() { 
                drawPicture(); 
            } 
        }).start(); 
    } 
    
    public void jButtonEndeActionPerformed(final ActionEvent evt) { 
        System.exit(0); 
    } 
    
    // Ende Ereignisprozeduren 
    
    public static void main(final String[] args) { 
        new Grafik("Grafik"); 
        
    } 
    private void clearPicture(){ 
        //g2d ist der Graphics Kontext vom image: 
        g2d.setColor(bgd); 
        g2d.fillRect(0, 0, image.getWidth(null), image.getHeight(null)); 
        g2d.setColor(fgd); 
    } 
    private void drawPicture(){ 
        //erstmal die alte Grafik löschen: 
        clearPicture(); 
        //dann die neue Grafik auf das Image zeichnen: 
        int x = 10, y = 120; 
        int sizex, sizey = 0; 
        
        while (x < drawingPanel.getWidth()-15 && y < drawingPanel.getHeight()) { 
            sizex = 4 + (int) (Math.random() * 9); 
            if (Math.random() > 0.5) { 
                y += sizey; 
                sizey = 4 + (int) (Math.random() * 6); 
            } else { 
                sizey = 4 + (int) (Math.random() * 6); 
                y -= sizey; 
            } 
            //g2d ist der Graphics Kontext vom image: 
            g2d.drawRect(x,y,sizex,sizey); 
            x += sizex; 
            drawingPanel.repaint();//ruft paintComponent(..) vom DrawingPanel auf 
            //Zeitverzögerung in Millisekunden, für Animationseffekt: 
            try{Thread.sleep(30);}catch(InterruptedException ex){} 
        } 
    } 
    class DrawingPanel extends JPanel{ 
        //paintComponent im DrawingPanel hat gegenüber paint im JFrame den Vorteil, 
        //daß jeweils nur die Grafik neu gezeichnet wird und nicht die Buttons,
        //und daß die Animation ohne Störungen läuft:
        public void paintComponent(final Graphics g) { 
            //hier muss die folgende Anweisung in der Regel immer die allererste sein, 
            //sonst können visuelle Störungen auftreten: 
            super.paintComponent(g); //das offscreen Bild erstmal bereinigen 
            
            if (image == null) {  //image neu anlegen falls nicht vorhanden: 
                image = createImage(getSize().width, getSize().height); 
                g2d = (Graphics2D)image.getGraphics(); //der Graphics Kontext vom image
                g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, 
                        RenderingHints.VALUE_ANTIALIAS_ON); 
                clearPicture(); 
            } 
            // malt die Grafik vom Image auf's Panel: 
            Rectangle r = g.getClipBounds(); 
            g.drawImage(image, r.x, r.y, r.width+r.x, r.height+r.y, 
                    r.x, r.y, r.width+r.x, r.height+r.y, null); 
        } 
    } 
}
 

tomdest

Mitglied
:toll:
Recht herzlichen Dank!


Hat mich der Hinweis auf super.paint(g) und den FAQ-Artikel gestern nacht schon sehr weit gebracht, ist für mich als Voll-Newbie das Listing natürlich extrem wertvoll :D !

Werde ich jetzt a) geistig zerlegen, um es vollständig zu verstehen und b) als Ausgangplattform für weitere Experiment rund um das Thema Graphik benutzen (die bisher benutzte Graphik war Code aus dem Internet (um Fehler zu vermeiden)).

Nochmal: Danke an Alle!

Viele Grüße,

Tom
 

André Uhres

Top Contributor
tomdest hat gesagt.:
..ist für mich als Voll-Newbie das Listing natürlich extrem wertvoll :D !
Werde ich jetzt a) geistig zerlegen, um es vollständig zu verstehen ..
Frag ruhig nach, falls du über irgendwas stolperst.
Wir beantworten alle Fragen gern (sofern wir die Anwort wissen :wink: ).
Btw: herzlich willkommen im Forum :D
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
G erste Schritte in Fenster und Grafik-Programmierung Java Basics - Anfänger-Themen 2
R Erste Schritte,erste Class,Korrekturlesen und Verbesserungen Java Basics - Anfänger-Themen 3
A erste Schritte auf dem Weg eine XML-Datei zu parsen Java Basics - Anfänger-Themen 2
F Erste Schritte in Java - Wo finde ich Antworten? Referenzbib Java Basics - Anfänger-Themen 3
E Erste Schritte - warum läuft nur das eine? Java Basics - Anfänger-Themen 2
MarvinsDepression Datentypen Generics: Erste Berührungen Java Basics - Anfänger-Themen 6
L Meine erste eigene Exception Klasse Java Basics - Anfänger-Themen 10
Zwanglos Warum wird nur die erste Zeile im while Block ausgeführt? Java Basics - Anfänger-Themen 8
3 OOP erste Versuche, OOP zu verstehen. Probleme mit gettern und settern Java Basics - Anfänger-Themen 4
F nur das erste Element mit iterator ausgeben Java Basics - Anfänger-Themen 5
J Objekt erste freie Stelle zuweisen Java Basics - Anfänger-Themen 3
Zrebna Compiler-Fehler Java-Compiler wird nach 'javac' keyword-Eingabe nicht gestartet (Erste Übung) Java Basics - Anfänger-Themen 18
Textsurfer Erste Schritte Ist es der erste Schleifendurchlauf? Java Basics - Anfänger-Themen 4
V Erste Schritte Hilfe gesucht beim einstieg in Java und erste Aufgaben aus der Berufsschule Java Basics - Anfänger-Themen 9
D String erste Zahl mit LKZ auslesen lassen Java Basics - Anfänger-Themen 36
C Erste Ziffer einer Zahl Java Basics - Anfänger-Themen 46
L Erste Schritte Erste Versuche mit Server und Client Java Basics - Anfänger-Themen 7
V Klassen Bestimmen Sie die erste und letzte Position an der ein 'c' steht? Java Basics - Anfänger-Themen 3
Crazynet jTable erste Zeile mit deffinierten Werten Java Basics - Anfänger-Themen 0
B Kreuzprodukt zweier Vektoren (Erste Java Aufgabe - Hilfestellungen und Tips erwünscht) Java Basics - Anfänger-Themen 4
Tarrew Generics: Erste gemeinse Oberklasse als Rückgabewert Java Basics - Anfänger-Themen 1
N InsertionSort sortiert erste Zahl im Array nicht mit? Java Basics - Anfänger-Themen 6
I String abschneiden erste und letzte Zeichen Java Basics - Anfänger-Themen 3
U Wie bekomme ich bei der Ausgabe das erste Komma weg Java Basics - Anfänger-Themen 8
S Erste App Java Basics - Anfänger-Themen 2
johnnydoe Erste Schritte Erster Blick - erste Fragen Java Basics - Anfänger-Themen 11
Farbenfroh Erste GUI Versuche Java Basics - Anfänger-Themen 1
R Java als erste Programmiersprache 5 Auflage Java Basics - Anfänger-Themen 0
N Erste Zeile bei BufferedReader doppelt lesen? Java Basics - Anfänger-Themen 2
L Das erste Mal GridBagLayout - wie geht das? Java Basics - Anfänger-Themen 5
O Erste Versuche eine Art "EventHandler" zu bauen.. Java Basics - Anfänger-Themen 8
H Worauf bezieht sich die erste else-Anweisung Java Basics - Anfänger-Themen 9
E nur der erste (mehrerer Strings) wird ausgegeben Java Basics - Anfänger-Themen 15
C Meine erste Funktion Java Basics - Anfänger-Themen 12
O erste Loggingversuche Java Basics - Anfänger-Themen 12
A Meine erste Bibliothek erstellen Java Basics - Anfänger-Themen 24
A Mit javac zweite Datei compilieren ohne Erste erneut zu compilieren? Java Basics - Anfänger-Themen 7
P HILFE !!! erste aufgabe beim programmieren Java Basics - Anfänger-Themen 13
T Erste Programm Java Basics - Anfänger-Themen 9
T Das erste Programm starten Java Basics - Anfänger-Themen 27
L Erste Klasse Java Basics - Anfänger-Themen 12
P Textdatei auf erste Zeichenkette Prüfen... Java Basics - Anfänger-Themen 10
R Erste und zweite Stelle einer Eingabe auslesen Java Basics - Anfänger-Themen 2
M Meine erste Java Programmierung funzt nicht :-( Java Basics - Anfänger-Themen 34
U Erste Ziffer abspalten Java Basics - Anfänger-Themen 3
J Erste und letzte Zeile in txt Java Basics - Anfänger-Themen 3
J Erste OO-Aufgabe-Probleme mit Aufgabenstellung Java Basics - Anfänger-Themen 32
J Erste Gehvesuche Java Basics - Anfänger-Themen 3
C Erste GUI - Wie auswerten? Java Basics - Anfänger-Themen 3
B Das erste Programm . Java Basics - Anfänger-Themen 4
R Meine erste Klasse: Punkt Java Basics - Anfänger-Themen 3
L beim ersten compilen schon erste probleme Java Basics - Anfänger-Themen 8
L JTabel abfragen ob es eine erste Zeile gibt? Java Basics - Anfänger-Themen 2
Q An erste Stelle in eine Queue eintragen Java Basics - Anfänger-Themen 4
C Generische Klassen, das erste Mal. Java Basics - Anfänger-Themen 8
J Neuling und erste Fragen Java Basics - Anfänger-Themen 8
D String, erste zeichen löschen Java Basics - Anfänger-Themen 6
J Threads: warten bis erste aktion ausgeführt wurde Java Basics - Anfänger-Themen 6
V Erste Ziffer aus einer dreistelligen "Zahl" heraus Java Basics - Anfänger-Themen 5
G Meine erste IF Abfrage Java Basics - Anfänger-Themen 11
D Erste und letzte 3 Buchst. eines Str. in jeweils ein Array Java Basics - Anfänger-Themen 13
H Nur die erste Zeile einer Datei auslesen Java Basics - Anfänger-Themen 3
R Nur erste Zeile wird ausgelesen Java Basics - Anfänger-Themen 4
K Wortanzahl in erste Zeile schreiben Java Basics - Anfänger-Themen 6
W warum öffnet der nur die erste datei???? Java Basics - Anfänger-Themen 5
D erste spalte eines zweidimensionales Array sortieren ??!! Java Basics - Anfänger-Themen 2
T x Schritte zählen Java Basics - Anfänger-Themen 18
K OOP Die ersten Schritte bei der Programierung Java Basics - Anfänger-Themen 1
T Anzahl der Schritte berechnen Java Basics - Anfänger-Themen 6
G Anfängerbuch geschafft - nächste Schritte? Java Basics - Anfänger-Themen 14
H Datenbank suche in kleine Schritte Java Basics - Anfänger-Themen 6
X SAX die ersten Schritte Java Basics - Anfänger-Themen 5
S ersten schritte in Java lernen! Java Basics - Anfänger-Themen 3
D BigDecimal Ausgabe sehr lang. Java Basics - Anfänger-Themen 2
X Sehr schnelle agile Entwicklung Java Basics - Anfänger-Themen 1
M (Sehr großes Problem) Listen als static in anderen Klassen verwendet Java Basics - Anfänger-Themen 12
C Verarbeitung von sehr großen Dateien Java Basics - Anfänger-Themen 52
P Erste Schritte Console - Sehr komische Ausgabe! Java Basics - Anfänger-Themen 3
B sehr lange Srings in File schreiben Java Basics - Anfänger-Themen 4
Z Sehr simpler Taschenrechner - Hilfe! Java Basics - Anfänger-Themen 10
M Suche Hilfe bei sehr kleinen Quelltexten Java Basics - Anfänger-Themen 2
M Welche externen Bibliotheken sind in Java sehr zu empfehlen? Java Basics - Anfänger-Themen 4
C Einlesen in Array von Textdatei sehr langsam Java Basics - Anfänger-Themen 7
M sehr großes Byte Array Java Basics - Anfänger-Themen 3
R OutOfmemory Exception bei sehr großer Liste (Tomcat Webservice) Java Basics - Anfänger-Themen 4
H Sehr einfache Java-Programme Java Basics - Anfänger-Themen 24
Luk10 OOP Sehr allgemeine Schnittstelle Java Basics - Anfänger-Themen 19
S Input/Output Sehr langen String in Datei schreiben Java Basics - Anfänger-Themen 8
R ArrayList sehr viel schneller als Array? Java Basics - Anfänger-Themen 2
R Sehr einfache möglichkeit ArrayList oder Array zu initialisieren? Java Basics - Anfänger-Themen 8
R Sehr kleine doubles nicht in Exponentialdarstellung ausgeben Java Basics - Anfänger-Themen 3
B ABspeichern eines sehr grossen negativen Werts Java Basics - Anfänger-Themen 6
Beckenbauer Eine anstehende (sehr simple) Applikation in UML darstellen (Klassendiagramm) Java Basics - Anfänger-Themen 20
N Name zu sehr ähnlich??? Java Basics - Anfänger-Themen 12
E Reguläre Ausdrücke mit sehr variablen Eigenschaften Java Basics - Anfänger-Themen 2
T Generic vom Generic: Zu sehr verschachtelt? Java Basics - Anfänger-Themen 6
Antoras Datei laden mit BufferedReader sehr langsam Java Basics - Anfänger-Themen 7
F Programm sehr langsam. Windows 7? Java Basics - Anfänger-Themen 23
S Eclipse .metadata ordner ist sehr gross! Java Basics - Anfänger-Themen 1
G Socket erstellen dauert sehr lange. Java Basics - Anfänger-Themen 4

Ähnliche Java Themen

Neue Themen


Oben