PaintComponent wird nicht aufgerufen

Duco

Mitglied
Ich wollte etwas ausprobieren, deshalb habe ich ein neues Projekt gestartet. Aus einem mir nicht erklärlichen Grund wird die paintComponent nie aufgerufen. Ich bin schon seit Stunden daran.
Bitte um Hilfe

Java:
import javax.swing.JFrame;

/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
/**
*
* @author DuCo
*/
public class frame extends JFrame {

    public static void main(String[] args) {
        frame gameframe = new frame("Yu-Gi-Oh!");
        gameframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        gameframe.setSize(1365,765);
        gameframe.setLayout(null);
        gameframe.setVisible(true);
        gameframe.add(new yugioh());
    }

    public frame(String title) {
        super(title);
      
    }
  
}

Java:
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JPanel;
import javax.swing.Timer;

/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
/**
*
* @author DuCo
*/
public class yugioh extends JPanel implements ActionListener{
    Timer time;
    public yugioh(){
        this.setLayout(null);              
        setFocusable(true);
        time = new Timer(5,this);
        time.start();
          
}

    @Override
    public void actionPerformed(ActionEvent ae) {
        repaint();
        }
  
    @Override
    public void paintComponent(Graphics g){
        super.paintComponent(g);
        Graphics2D f2 =(Graphics2D)g;
        f2.drawString("AAAAAAAAAAAAAAAAAAA",5,5);
    }
}

MfG
Duco
 
Zuletzt bearbeitet von einem Moderator:
hi,
nun gut...
1. bitte klassen groß
2. wenns nicht sein muss nicht von jframe erben
3. null-layout vermeiden
4. solideren repaint-mechanismus wählen (z.b. externer thread, so wäre es sequentiell)
5. möglichst wenig im statischen kontext machen
6. wenn frame in Frame umbenannt wird aufpassen: so eine klasse gibt es schon in awt
7. super-aufruf im panel vergessen
8. visible setzen ganz zuletzt

dein hauptproblem: du hast ein null-layout und keine größe dem Panel zugewiesen, d.h. größe und position = undefiniert (wahrscheinlich 0)

deine erste klasse würde ich so umschreiben:
Java:
public class Gui {
    private final JFrame f;
    private final YuGiOh pane;

    public static void main(String[] args) {
        Gui ui = new Gui("Yu-Gi-Oh!");
    }

    public Gui(String title) {
        f = new JFrame(title);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setSize(1365, 765);
        // kein aufruf setLayout --> automatisch BorderLayout
        pane = new YuGiOh();
        f.add(pane);
        f.setVisible(true);
    }
}

die zweite dann so:
Code:
public class YuGiOh extends JPanel implements Runnable {
   
    public YuGiOh() {
        super();
        setFocusable(true);          // wenn es für dich wichtig ist...
        Thread th = new Thread((Runnable) this);
        th.start();
    }

    @Override
    public void run() {
        while(true) {
            repaint();
            try {
                Thread.sleep(10);
            } catch (InterruptedException ex) {}
        }
    }
 
    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D f2 = (Graphics2D) g;
        f2.drawString("AAAAAAAAAAAAAAAAAAA", 5, 5);
    }
}

hier ist jetzt schon ein ganz einfacher ansatz zum repaint in einem anderen thread. ist nicht unbedingt sicher und man muss schon auch aufpassen von außen, ist aber besser als mit timer (glaub ich)

javampir
 
Du hast Zwei Probleme:
  1. Nur dein Canvas darf ein Null-Layout haben, also dein JPanel
  2. Der ActionListener wurde nirgends hinzugefügt
Ich hoffe ich konnte helfen.
 

Zurück
Oben