Paint-Methode in anderer Klasse funktioniert nicht

Werschon

Mitglied
Hallo Leute,
ich weiß echt nicht weiter. Ich habe eine Klasse mit dem Namen Hauptfenster. In ihr wird ein JFrame mit einer Menubar erstellt.
Über diese Menubar wird, wenn man auf "Neu" klickt, das Objekt grafische_Oberflaeche der Klasse Grafische_Oberflaeche erzeugt.
Damit will ich ein JPanel erzeugen um auf diesem später verschiedene grafische Elemente darzustellen. Zunächst soll jedoch nur ein rotes Rechteck abgebildet werden, um zu testen ob alles klappt. Doch es klappt nicht...
Das JPanel wird wie geplant erstellt, dass sehe ich daran, dass sich die Hintergrundfarbe ändert, wenn ich .setBackground verwende.
Aber irgendwas stimmt mit der paint-Methode nicht. Das Rechteck erscheint einfach nicht.
Sie müsste eigentlich richtig geschrieben sein, weil wenn ich sie in meine Hauptfenster-Klasse einfüge,
wird das rote Rechteck problemlos gezeichnet. Könnte es vielleicht daran liegen, dass ich die paint_Methode nicht in der Hauptklasse stehen habe? Sonst fällt mir nichts ein.

Wäre nett, wenn sich das mal jemand anschauen könnte und vielen Dank im Voraus.

Mein Code:
Java:
package Main;

import TileMap.Grafische_Oberflaeche;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.WindowConstants;




public class Hauptfenster extends javax.swing.JApplet {


    private static final long serialVersionUID = 1L;
    private JMenuBar jTop_Menu;
    private JMenu jMenu1;
    private JMenuItem jNeu_item;
    protected static JFrame j_frame;
    public static JLabel cursorHF;
    public static JPanel grafische_Oberflaeche;
    public static JFrame hauptfenster;
    public static Hauptfenster komponenten;
    
    
    public static void main(String[] args) {
        
                hauptfenster = new JFrame();
                komponenten = new Hauptfenster();
            
                
                hauptfenster.getContentPane().add(komponenten);
                hauptfenster.pack();
                
                hauptfenster.setExtendedState(JFrame.MAXIMIZED_BOTH);
                hauptfenster.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
                hauptfenster.setVisible(true);
            }
    




    
    public Hauptfenster() {
        
            getContentPane().setLayout(null);
            
            {
            cursorHF = new JLabel();
            getContentPane().add(cursorHF);
            cursorHF.setLocation(1,1);
            cursorHF.setVisible(false);
            cursorHF.setSize(10,10);
            }
            {
                jTop_Menu = new JMenuBar();
                setJMenuBar(jTop_Menu);
                {
                    jMenu1 = new JMenu();
                    jTop_Menu.add(jMenu1);
                    jMenu1.setText("Datei");
                    {
                        jNeu_item = new JMenuItem();
                        jMenu1.add(jNeu_item);
                        jNeu_item.setText("Neu");
                        jNeu_item.addActionListener(new ActionListener() {
                            public void actionPerformed(ActionEvent evt) {
                                jNeu_itemActionPerformed(evt);
                            }
                        });
                    }
                }
            }
    }        
    
            
            
    private void jNeu_itemActionPerformed(ActionEvent evt) {
        
        Grafische_Oberflaeche grafische_Oberflaeche = new Grafische_Oberflaeche();
        
    }    
}

Java:
package TileMap;

import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JPanel;
import Engine.Hauptfenster;
import Neu.Hauptfenster_Neu_3;


public class Grafische_Oberflaeche extends JPanel{
    
    private static final long serialVersionUID = 1L;
    JPanel panel;

  
    public Grafische_Oberflaeche(){    
    panel = new JPanel();
    Hauptfenster.komponenten.add(panel);
    panel.setBounds(1, 2, Hauptfenster.hauptfenster.getWidth(), Hauptfenster.hauptfenster.getHeight());
    panel.setBackground(Color.yellow);
    panel.setLayout(null);
    panel.setVisible(true);
    }
    @Override
    public void paint(Graphics g){            
        super.paint(g);
        g.setColor(Color.red);
        g.fillRect(1, 1, 500, 500);
        }
    
}


Hab noch vergessen zu erwähnen, dass keine Fehlermeldung angezeigt wird
 
Zuletzt bearbeitet:

Major_Sauce

Bekanntes Mitglied
Mal ne ganz dumme Frage: Von wo wird der repaint denn gesteuert ?
Wenn du das ding nicht repainten lässt dann wird da auch nichts passieren, denke ich ?

mfg Major
 

Harry Kane

Top Contributor
Krass....
Eine Klasse HauptFenster die JApplet erweitert, und darin eine Variable mit Namen hauptfenster, die aber vom Typ JFrame ist, und ausserdem eine Variable vom Typ Hauptfenster die den Namen komponenten hat. ZIemlich verwirrend.
Ausserdem fügst du deine Instanz von Grafische_Oberflaeche nirgendwo hinzu, soweit ich das sehen kann. Deswegen würde es dir auch nix nützen, ihre paintComponent zu überschreiben, weil diese nicht aufgrufen wird, solanage die Instanz nicht in einer Elternkomponente steckt.
 

Werschon

Mitglied
Ersteinmal, danke für die Hilfe.
Der komische Aufbau kommt von Jigloo. Ich hab mein Programm zuerst mit Jigloo aufgebaut, weil ich mich damals noch nicht so gut mit JFrames auskannte. Mit der Zeit habe ich aber dazugelernt und hab dann gemerkt, dass ich Jigloo nicht mehr brauche und hab versucht,
das Programm einfacher zu gestalten, weil Jigloo das ganze immer so merkwürdig aufbaut.

Naja, ich hab jetzt versucht, das Programm noch weiter zu vereinfachen und habe dadurch das Problem, sagen wir mal, zur Hälfte gelöst.
Das JPanel wird mit dem roten Rechteck gezeichnet (also die Paint-Methode funktioniert), aber irgendwie lässt sich die Größe des JPanels nicht mehr einstellen.
Ich hab sie mal mit .setBounds auf 1000x1000 Pixel gestellt, aber trotzdem ist das JPanel immer genauso groß wie die Box, die unter der MenuBar erscheint, in der die MenuItems stehen.
Ich hab allerdings beobachtet, wenn ich den ganzen Block:
Java:
 grafische_Oberflaeche = new Grafische_Oberflaeche();
        hauptfenster.getContentPane().add(grafische_Oberflaeche);
aus dem Actionlistener rauspacke und dafür in die Main-Methode einsetze, funktioniert plötzlich alles.
Also das JPanel hat dann die richtige Größe. Aber wieso klappt es nicht, wenn ich es erst später im Actionlistener einfüge?



Hauptfenster-Klasse:

Java:
package Engine;

import TileMap.Grafische_Oberflaeche;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.WindowConstants;




public class Hauptfenster extends JFrame {


    private static final long serialVersionUID = 1L;
    private static JMenuBar jTop_Menu;
    private static JMenu jMenu1;
    private static JMenuItem jNeu_item;
    protected static JFrame j_frame;
    public static JLabel cursorHF;
    public static JPanel grafische_Oberflaeche;
    public static JFrame hauptfenster;
    
    
    
    public static void main(String[] args) {
        
                hauptfenster = new JFrame();
                
                hauptfenster.setExtendedState(JFrame.MAXIMIZED_BOTH);
                hauptfenster.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
                hauptfenster.setVisible(true);
                hauptfenster.getContentPane().setLayout(null);
                
                cursorHF = new JLabel();
                hauptfenster.getContentPane().add(cursorHF);
                cursorHF.setLocation(1,1);
                cursorHF.setVisible(false);
                cursorHF.setSize(10,10);
                
                
            
                jTop_Menu = new JMenuBar();
                hauptfenster.setJMenuBar(jTop_Menu);
                {
                    jMenu1 = new JMenu();
                    jTop_Menu.add(jMenu1);
                    jMenu1.setText("Datei");
                    {
                        jNeu_item = new JMenuItem();
                        jMenu1.add(jNeu_item);
                        jNeu_item.setText("Neu");
                        jNeu_item.addActionListener(new ActionListener() {
                            public void actionPerformed(ActionEvent evt) {
                                jNeu_itemActionPerformed(evt);
                            }
                        });
                    }
                }
            
    }        
    
            

    private static void jNeu_itemActionPerformed(ActionEvent evt) {
        
        System.out.println("jNeu_item.actionPerformed, event="+evt);
        
        grafische_Oberflaeche = new Grafische_Oberflaeche();
        hauptfenster.getContentPane().add(grafische_Oberflaeche);
       }
    }
    
}


Grafische_Oberflaeche-Klasse:

Java:
package TileMap;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import javax.swing.JPanel;
import Engine.Hauptfenster;


public class Grafische_Oberflaeche extends JPanel{
    
    private static final long serialVersionUID = 1L;
       
    public Grafische_Oberflaeche(){    
    
    
    setBounds(1, 1, 1000,1000);
    setBackground(Color.yellow);
    setLayout(null);
    setVisible(true);
    }
    
@Override
    public void paint(Graphics g){            
        super.paint(g);
        g.setColor(Color.red);
        g.fillRect(1, 1, 500, 500);
        }
   
}
 

Werschon

Mitglied
Hab das Problem selbst gelöst, war ein blöder Fehler :oops:

Ich hab das JPanel falsch hinzugefügt. Ich musste diese Zeile in die Klasse Grafische_Oberflaeche einfügen:
Java:
Hauptfenster.hauptfenster.add(this);
Trotzdem danke, für die Hilfe
 

Harry Kane

Top Contributor
Ich habs zwar nicht laufen gelassen, aber spontan würde ich sagen, daß es schnurz ist, ob du auf Hauptfenster.hauptfenster von innerhalb der Klasse Hauptfenster zugreifst (dann reicht hauptfenster. getContentPane()) oder von ausserhalb (dann muss es Hauptfenster.hauptfenster.getContentPane() sein). Die Instanz hauptfenster sollte in beide Fällen dieselbe sein.
Deine "Lösung" widerspricht gaz klar dem Prinzip der Kapselung.
Un warum muss deine Hauptfenster-Klasse überhaupt JFrame erweitern? Wo verwendest du es als JFrame?
Ich würde dir dringend raten, die ganzen statics in deinem Code zu eliminieren, und wie oben gesagt, die Namensgebung etwas leserfreundlicher gestalten. Und ausserdem wird, wie oben schon gesagt, bei selbstgestrickten JComponents paintComponent() überschrieben.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
G paint() Methode aus anderer klasse aufrufen? AWT, Swing, JavaFX & SWT 6
krgewb 2D-Grafik paint-Methode wird zu oft ausgeführt AWT, Swing, JavaFX & SWT 5
S Zeichen ohne paint-Methode AWT, Swing, JavaFX & SWT 2
J Swing Wann brauche ich @Override vor der paint()-Methode? AWT, Swing, JavaFX & SWT 1
G Eine paint-Methode, 2 Welten? AWT, Swing, JavaFX & SWT 3
A paint-Methode aufrufen AWT, Swing, JavaFX & SWT 13
S Grafik: Programm kommt nicht zur paint()-Methode AWT, Swing, JavaFX & SWT 6
F 2D-Grafik Was ruft die Paint - Methode auf ? AWT, Swing, JavaFX & SWT 2
S JButton u. Label auf paint-Methode AWT, Swing, JavaFX & SWT 1
S Paint Methode ohne implements JPanel AWT, Swing, JavaFX & SWT 1
S Farbe ändern bei der paint-Methode AWT, Swing, JavaFX & SWT 5
J ActionListener soll auf paint() Methode zugreifen AWT, Swing, JavaFX & SWT 1
J Problem mit der paint Methode AWT, Swing, JavaFX & SWT 0
Junb 2D-Grafik paint() Methode bugt? AWT, Swing, JavaFX & SWT 2
I Paint-Methode von nicht statischen Objekten aufrufen AWT, Swing, JavaFX & SWT 3
D JSlider "laggt" nach überschreiben der paint methode AWT, Swing, JavaFX & SWT 2
A Paint Methode externer auruf AWT, Swing, JavaFX & SWT 5
J AWT Methode paint() AWT, Swing, JavaFX & SWT 4
X Bild via FileChooser in paint-Methode laden AWT, Swing, JavaFX & SWT 2
G paint-Methode kopiert GUI AWT, Swing, JavaFX & SWT 14
F AWT Probleme mit der paint() methode AWT, Swing, JavaFX & SWT 2
C Unterschiedlicher Aufruf der paint() Methode ? (AWT/Swing) AWT, Swing, JavaFX & SWT 2
L Problem mit paint Methode und Bild AWT, Swing, JavaFX & SWT 7
F paint-Methode des JComboboxEditorComponent AWT, Swing, JavaFX & SWT 2
hdi Swing JLabel & paint-Methode gemixt - wie schlimm wirklich? AWT, Swing, JavaFX & SWT 5
N Paint methode anhalten und neustarten AWT, Swing, JavaFX & SWT 5
R [gelöst]Fenster schließen - trotz Endlosschleife in der Paint-Methode? AWT, Swing, JavaFX & SWT 3
M Allgemeines zur paint Methode AWT, Swing, JavaFX & SWT 5
A paint()-Methode für Videoexport nutzen AWT, Swing, JavaFX & SWT 2
D Paint() Methode aus einer anderen Klasse aufrufen AWT, Swing, JavaFX & SWT 6
L Dynamisches Ändern der Größe in JPanel mit paint()-Methode AWT, Swing, JavaFX & SWT 8
C paint-Methode überschreiben AWT, Swing, JavaFX & SWT 19
hdi meine paint-methode macht faxen? AWT, Swing, JavaFX & SWT 21
G Frage zur paint-Methode (AWT) AWT, Swing, JavaFX & SWT 9
N paint Methode im JFrame AWT, Swing, JavaFX & SWT 3
T Paint-Methode geht nicht AWT, Swing, JavaFX & SWT 5
F Paint-Methode Überschreiben macht Refresh-Fehler ? AWT, Swing, JavaFX & SWT 8
B paint methode wiederholen AWT, Swing, JavaFX & SWT 6
G Problem mit paint Methode und Buttons AWT, Swing, JavaFX & SWT 10
T JPanel - paint Methode?, aber wie AWT, Swing, JavaFX & SWT 13
K paint-Methode überschrieben - trotzdem JComponenten zeichnen AWT, Swing, JavaFX & SWT 5
bummerland paint Methode AWT, Swing, JavaFX & SWT 2
H 2D-Grafik Problem mit Paint AWT, Swing, JavaFX & SWT 1
frager2345 Warum paintComponent hier und nicht paint AWT, Swing, JavaFX & SWT 2
U Was ist der Unterschied von paint und paincomponent? AWT, Swing, JavaFX & SWT 3
L 2D-Grafik Swing paint|paintComponent AWT, Swing, JavaFX & SWT 2
H Swing + Paint: Mehrere Objekte zeichnen lassen AWT, Swing, JavaFX & SWT 3
Xanny 2D-Grafik Beginner! Probleme mit Swing, Gprahics class und paint AWT, Swing, JavaFX & SWT 13
L Berechnungen in paint AWT, Swing, JavaFX & SWT 8
S 2 Paint-Methoden in einer Klasse ? AWT, Swing, JavaFX & SWT 2
J zwei Paint methoden in einer Klasse AWT, Swing, JavaFX & SWT 3
P Paint und paintComponent AWT, Swing, JavaFX & SWT 12
S 2 paint-Methoden in einer Klasse ? AWT, Swing, JavaFX & SWT 2
C JFrame paint ohne hintergrund nutzen AWT, Swing, JavaFX & SWT 6
A Swing Paint mit Button Clear den Hintergrund säubern um wieder zeichnen zu können AWT, Swing, JavaFX & SWT 2
K 2D-Grafik Paint - Wie binde ich repaint ein? AWT, Swing, JavaFX & SWT 8
S paint() verzögern AWT, Swing, JavaFX & SWT 9
K AWT begrenzte anzahl paint aufrufe AWT, Swing, JavaFX & SWT 6
B Infolabel Probleme mit Paint() ? AWT, Swing, JavaFX & SWT 8
L AWT paint mit ArrayList und Iterator AWT, Swing, JavaFX & SWT 3
Furtano AWT paint braucht ein Graphics Objekt ? AWT, Swing, JavaFX & SWT 2
L Swing 64bit Problem mit paint/paintComponent AWT, Swing, JavaFX & SWT 7
T JFrame und paint() AWT, Swing, JavaFX & SWT 5
B Ablauf der paint-Methoden von JComponents AWT, Swing, JavaFX & SWT 20
F 2D-Grafik Hostkomponentengröße in paint AWT, Swing, JavaFX & SWT 2
L JFrame an Paint-Inhalt anpassen AWT, Swing, JavaFX & SWT 6
E Warum übermalt paint das ganze Fenster? AWT, Swing, JavaFX & SWT 15
T paint() wird nicht aufgerufen AWT, Swing, JavaFX & SWT 8
M JMenuBar im Applet und paint AWT, Swing, JavaFX & SWT 9
H paint überlappend AWT, Swing, JavaFX & SWT 5
E paint AWT, Swing, JavaFX & SWT 3
H Swing paint() von JPanel wird nicht aufgerufen AWT, Swing, JavaFX & SWT 10
L AWT Paint(g) im Listener aufrufen AWT, Swing, JavaFX & SWT 2
S JCheckBox Paint AWT, Swing, JavaFX & SWT 7
F Swing Paint mit Canvas Element AWT, Swing, JavaFX & SWT 35
K AWT paint wird nicht aufgerufen AWT, Swing, JavaFX & SWT 7
R LayoutManager Image Paint + Text Panel AWT, Swing, JavaFX & SWT 10
S Threads in einen Frame zeichnen lassen (Paint()?!) AWT, Swing, JavaFX & SWT 5
radiac Swing JFrame - paint(g) - FrameObjects bei activeRendering AWT, Swing, JavaFX & SWT 3
I AWT paint() in MouseEvent aufrufen klappt nicht AWT, Swing, JavaFX & SWT 8
T paint() wird zweimal ausgeführt AWT, Swing, JavaFX & SWT 6
H AWT Wann ist paint() fertig? AWT, Swing, JavaFX & SWT 7
W Steuerelemente und paint() in einem JPanel AWT, Swing, JavaFX & SWT 3
M AWT Component/Canvas erzeugt unerwünschten Rahmen bei paint AWT, Swing, JavaFX & SWT 3
T Dialog ohne Frame, direktes paint in graphics AWT, Swing, JavaFX & SWT 5
G Probleme mit repaint / paint AWT, Swing, JavaFX & SWT 6
K repaint() ruft paint() nicht auf AWT, Swing, JavaFX & SWT 14
J Canvas / paint() AWT, Swing, JavaFX & SWT 2
bugmenot paint() verzögert ausgeführt? AWT, Swing, JavaFX & SWT 4
S paint() in anderen Methoden AWT, Swing, JavaFX & SWT 5
J getFontMetrics außerhalb von paint(Graphics g) AWT, Swing, JavaFX & SWT 8
H paint verwenden AWT, Swing, JavaFX & SWT 3
S java.awt.Component und paint() AWT, Swing, JavaFX & SWT 4
A Paint funktioniert nicht richtig AWT, Swing, JavaFX & SWT 7
G JScrollPane mit "paint" scrollt nicht AWT, Swing, JavaFX & SWT 2
T Variable Menge an Bildern außerhalb paint() zeichnen? AWT, Swing, JavaFX & SWT 2
G Paint und Buttons AWT, Swing, JavaFX & SWT 8
G JFrame JPanel und Paint(Image)? AWT, Swing, JavaFX & SWT 6
S Programm aufgrund von paint() zu langsam AWT, Swing, JavaFX & SWT 18
G paint() wird aufgerufen, aber nicht angezeigt AWT, Swing, JavaFX & SWT 10

Ähnliche Java Themen

Neue Themen


Oben