Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Für mich nicht nachvollziehbar, nur wenn ich die paint Methode unten auskommentiere wird der Hintergrund des Panels schwarz (will zum zeichnen JPanel anstatt Canvas verwenden). Wenn ich die paint Methode jedoch einfüge wird setBackground irgendwie ignoriert, bzw übersprungen, kA...
Code:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class CGrafik {
public static void main(String[] args){
CFenster fenster = new CFenster("Zeichnen");
fenster.pack();
fenster.setSize(450,350);
fenster.setResizable(true);
fenster.setVisible(true);
}
}
class CFenster extends JFrame {
CFenster (String titel) {
super(titel);
setLayout(new FlowLayout());
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
CJPanel panel = new CJPanel();
add(panel);
}
}
class CJPanel extends JPanel{
CJPanel() {
setBackground(Color.black);
setForeground(Color.blue);
}
public Dimension getMinimumSize() {
return new Dimension(300,300);
}
public Dimension getPreferredSize() {
return getMinimumSize();
}
/*public void paint(Graphics g) {
g.translate(150,150);
g.setColor(Color.green);
g.drawLine(-100,-100,100,100);
}*/
}
Bei Swing überschreibt man paintComponent (super.paintComponent nicht vergessen), und nicht paint. Paint ist unter anderem für das Zeichnen des Hintergrunds zuständig, weshalb setBackgroundColor in deinem Fall natürlich ziemlich nutzlos ist...
class CJPanel extends JPanel{
public Dimension getMinimumSize() {
return new Dimension(300,300);
}
public Dimension getPreferredSize() {
return getMinimumSize();
}
public void paintComponent(Graphics g) {
setBackground(Color.black);
g.translate(150,150);
g.setColor(Color.green);
g.drawLine(-100,-100,100,100);
}
}
ich weiss jedoch nicht:
- wie ich super.paintComponent wo aufrufen soll (und warum)
- warum ich nicht setBackground benutzen soll (funktioniert mit der Canvas Komponente einwandfrei) und ob die einzige Alternative dann fillRect ist.
super.paintComponent sollte immer der erste Aufruf in paintComponent sein. Es sorgt unter anderem dafür das der Hintergrund der Komponente 'gesäubert' wird.
Das setBackGround musst du aus der Methode rausnehmen, da paintComponent ausschließlich zum Zeichnen da ist.
Wie realisiert man es denn in der Praxis, wenn man die Hintergrundfarbe der Zeichenfläche schwarz färben will? Erstellt man dann einfach ein Rechteck, das so groß ist wie die Zeichenfläche, oder wie handhabt man das am elegantesten?