JMenuBar sowie Buttons nach repaint auf JPanel

Status
Nicht offen für weitere Antworten.

Bootenks

Mitglied
Schönen guten Tag an euch alle!

Ich habe ein Problem mit meiner kleinen Ampelanimation.

Erklärung:

Ich habe 3 Threads die jeweils eine Ampel simulieren sollen. Jede Ampel ist ein JPanel und wird mit dieser Klasse instanziert:

Code:
package Control;

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

public class Ampel extends JPanel implements Runnable
{
    private Color[] ampelcolors = { Color.red, Color.yellow, Color.green };
    private Color aus = new Color(64, 64, 64);
    private Color[] ampelbelegung = { aus, aus, aus };
    private Thread th;
    private int ampelid;
    private int startcolor;
    
    public Ampel(int startcolor, int id)
    {
        this.setBounds(0, 0, 450, 400);

        this.ampelid = id;
        this.startcolor = startcolor;
        ampelbelegung[startcolor] = ampelcolors[startcolor];
        
        th = new Thread(this);
        th.start();
    }

    public void run()
    {
        while ( true )
        {
            for ( int i = 0; i<3; ++i)
            {
                setColor(i);
                repaint();
                
                try
                {
                    th.sleep(1000);
                } catch ( InterruptedException e ) {}
            }
        }
    }
    
    public void setColor(int newcolor)
    {
        if ( newcolor == 0 )
        {
            ampelbelegung[0] = ampelcolors[0];
            ampelbelegung[1] = aus;
            ampelbelegung[2] = aus;
        }
        else if ( newcolor == 1 )
        {
            ampelbelegung[0] = aus;
            ampelbelegung[1] = ampelcolors[1];
            ampelbelegung[2] = aus;
        }
        else if ( newcolor == 2 )
        {
            ampelbelegung[0] = aus;
            ampelbelegung[1] = aus;
            ampelbelegung[2] = ampelcolors[2];
        }
    }
    
    public Color getColorSetting(int position)
    {
        return ampelbelegung[position];
    }

    public void paintComponent(Graphics g)
    {
        if ( this.ampelid == 0 )
        {
            g.setColor(new Color(100, 100, 100));
            g.fillRect(155, 85, 40, 20);
            g.setColor(this.getColorSetting(0));
            g.fillOval(182, 90, 10, 10);
            g.setColor(this.getColorSetting(1));
            g.fillOval(170, 90, 10, 10);
            g.setColor(this.getColorSetting(2));
            g.fillOval(158, 90, 10, 10);
        }
        else if ( this.ampelid == 1 )
        {
            g.setColor(new Color(100, 100, 100));
            g.fillRect(255, 85, 20, 40);
            g.setColor(this.getColorSetting(0));
            g.fillOval(260, 88, 10, 10);
            g.setColor(this.getColorSetting(1));
            g.fillOval(260, 100, 10, 10);
            g.setColor(this.getColorSetting(2));
            g.fillOval(260, 112, 10, 10);
        }
        else if ( this.ampelid == 2 )
        {
            g.setColor(new Color(100, 100, 100));
            g.fillRect(255, 5, 40, 20);
            g.setColor(this.getColorSetting(0));
            g.fillOval(258, 10, 10, 10);
            g.setColor(this.getColorSetting(1));
            g.fillOval(270, 10, 10, 10);
            g.setColor(this.getColorSetting(2));
            g.fillOval(282, 10, 10, 10);
        }
    }
}

Ich möchte darauf hinweisen, dass der Code keinesfalls fertig ist da die eigentlich Logik fehlt!

Diese Ampeln werden auf ein anderes JPanel gelegt welches die Kreuzung zeichnet:

Code:
package View;

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

class Kreuzung extends JPanel
{
    private Ampel autoampel1;
    private Ampel autoampel2;
    private Ampel autoampel3;
    private Image dbImage;
    private Graphics dbGraphics;
    
    public Kreuzung()
    {
        super();
        this.setBackground(Color.black);
        
        // Ampel Initialisierung
        autoampel1 = new Ampel(0, 0);
        autoampel2 = new Ampel(2, 1);
        autoampel3 = new Ampel(0, 2);
       
        setLayout(null);
        add(autoampel1);
        add(autoampel2);
        add(autoampel3);
    }
    
    public void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        if (dbImage == null)
        {
            dbImage = createImage((int) this.getSize().getWidth(), (int) this.getSize().getHeight());
            dbGraphics = dbImage.getGraphics();

            dbGraphics.setColor(getBackground());
            dbGraphics.fillRect(0,0,(int) this.getSize().getWidth(), (int) this.getSize().getWidth());
            dbGraphics.setColor(Color.gray);
            dbGraphics.fillRect(0, 30, 450, 50);
            dbGraphics.fillRect(200, 80, 50, 200);

            dbGraphics.setColor(Color.white);
            for ( int i = 0; i < 200; i += 20 )
            {
                    dbGraphics.drawLine(i, 55, i+10, 55);
            }

            for ( int i = 260; i < 440; i += 20 )
            {
                    dbGraphics.drawLine(i, 55, i+10, 55);
            }

            for ( int i = 85; i < 285; i += 20 )
            {
                    dbGraphics.drawLine(225, i, 225, i+10);
            }

            dbGraphics.drawLine(200, 55, 200, 80);
            dbGraphics.drawLine(250, 30, 250, 55);
            dbGraphics.drawLine(225, 80, 250, 80);
        }
        g.drawImage(dbImage, 0, 0, this);
    }
}

Die Kreuzung wiederum liegt auf einem JFrame, der die eigentlichen Controlelemente (Menü und Button's) beinhaltet.

Code:
package View;

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import Control.Ampel;

public class Hauptfenster extends JFrame implements ActionListener
{
    // Variablen
    private JPanel aktionsbereich;
    private JLabel erklaerung;
    private Kreuzung kreuzung;
    private JButton startbutton;
    private Ueber_uns about = null;

    public Hauptfenster()
    {
        // Frame Einstellungen
        this.setcentralLocationSize(450, 450);
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);
        this.setTitle("Hauptfenster");
       
        initComponents();
    }
    
    private void initComponents()
    {
        JMenuBar menuleiste = new JMenuBar();
        this.setJMenuBar(menuleiste);

        Container cp = this.getContentPane();
        cp.setLayout(new BorderLayout());
        cp.setBackground(Color.black);
        
        aktionsbereich = new JPanel();
        aktionsbereich.setLayout(new BorderLayout());
        aktionsbereich.setBackground(Color.black);
        
        // Kreuzungsanimation wird hinzugefügt
        kreuzung = new Kreuzung();
        
        // Sensoren initialisieren
        JButton autosensor1 = new JButton("Kfz Sensor links");
        JButton autosensor2 = new JButton("Kfz Sensor unten");
        JButton autosensor3 = new JButton("Kfz Sensor rechts");

        JButton fussgaengersensor1 = new JButton("Fg Sensor links");
        JButton fussgaengersensor2 = new JButton("Fg Sensor unten");
        JButton fussgaengersensor3 = new JButton("Fg Sensor rechts");
        
        JPanel sensorenfeld = new JPanel();
        sensorenfeld.setLayout(new GridLayout(2, 3, 2, 2));
        sensorenfeld.setBackground(Color.black);
        
        sensorenfeld.add(autosensor1);
        sensorenfeld.add(autosensor2);
        sensorenfeld.add(autosensor3);
        sensorenfeld.add(fussgaengersensor1);
        sensorenfeld.add(fussgaengersensor2);
        sensorenfeld.add(fussgaengersensor3);
        
        // obere Elemente werden dem Aktionsbereich hinzugefügt
        aktionsbereich.add(kreuzung, BorderLayout.CENTER);
        aktionsbereich.add(sensorenfeld, BorderLayout.SOUTH);
        
        // kurze Erklärung wird definiert
        erklaerung = new JLabel();
        erklaerung.setText("Diese Software dient zur Ampelsimulation an einer T-Kreuzung!");
        erklaerung.setHorizontalAlignment(JLabel.CENTER);
        erklaerung.setForeground(Color.white);
        
        // Alle Elemente werden dem Hauptfenster hinzugefügt
        cp.add(aktionsbereich, BorderLayout.CENTER);
        cp.add(erklaerung, BorderLayout.SOUTH);
    }
    
    public void actionPerformed(ActionEvent e)
    {
        if ( e.getActionCommand().equals("BEENDEN") )
        {
            System.exit(0);
        }
        else if ( e.getActionCommand().equals("UEBERUNS") )
        {
            if ( about == null )
            {
                about = new Ueber_uns();
            }
            about.setVisible(true);
        }
    }
            
    public void setJMenuBar(JMenuBar jmenubar)
    {
        JMenu programm =  new JMenu("Programm");
        
        JMenuItem ueber_uns = new JMenuItem("Über uns");
        ueber_uns.setAccelerator(KeyStroke.getKeyStroke('U', InputEvent.CTRL_MASK));
        ueber_uns.setMnemonic('u');
        ueber_uns.setActionCommand("UEBERUNS");
        ueber_uns.addActionListener(this);
        
        JMenuItem beenden = new JMenuItem("Beenden");
        beenden.setAccelerator(KeyStroke.getKeyStroke('B', InputEvent.CTRL_MASK));
        beenden.setMnemonic('B');
        beenden.setActionCommand("BEENDEN");
        beenden.addActionListener(this);
        
        programm.add(ueber_uns);
        programm.addSeparator();
        programm.add(beenden);
        
        jmenubar.add(programm);
        super.setJMenuBar(jmenubar);
    }
    
    public void setcentralLocationSize(int width, int height)
    {
	int hoehe = (int) getToolkit().getScreenSize().getHeight();
	int breite = (int) getToolkit().getScreenSize().getWidth();
	hoehe = (int) ( hoehe - height ) / 2;
	breite = (int) ( breite - width ) / 2;
	setLocation(breite, hoehe);
	setSize(width, height);
    }
}

Das wärs auch schon.

Nun bekomme ich halt immer nach dem repaint der Ampelthreads im Kreuzungs-JPanel die JMenuBar mit angezeigt. (Sie ist aber korrekterweise auch im JFrame vorhanden!). Zudem sehe ich, wenn ich über einen JButton mit der Maus fahre oben links auch diesen Button in dem Kreuzungs-JPanel. Durch die falsche Menuleiste verschiebt sich die Kreuzung und die Ampellämpchen leuchten an der falschen Stelle.

Noch eine Merkwürdigkeit geschieht wenn ich ein Fenster über das Ampelfenster legen und dann ein bissel hin und herschiebe, dann verschmiert das Bild dermaßen das man kaum noch was erkennt... Das repaint versucht scheinbar noch das korrekte Bild anzuzeigen, schafft es aber nicht... Allerdings wenn ich es Minimiere und dann wieder Maximieren dann sieht alles so aus wie vor dem repaint()! Bis dann wieder das repaint() der Threads aktiv wird und das gleiche Spiel von vorne beginnt...

Woran kann das liegen? Ich hoffe ich habe es euch deutlich genug geschildert.

Vielen Dank jetzt schon einmal für eure Unterstützung. ;)
 
B

Beni

Gast
Entweder solltest du auf deinen Panels den gesammten Hintergrund zeichnen, oder du rufst im Konstruktor "setOpaque( false )" auf, um die Optimierungen abzuschalten.
 

Bootenks

Mitglied
Ja es funkioniert!! Dankeschön! ^^ Habe es in den Ampelkonstruktor gepackt und alles läuft tadelos ^^ Wegen so einer Kleinigkeit!!

Nochmal großes Dankeschön an dich BENI! ^^
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
C JMenuBar AWT, Swing, JavaFX & SWT 6
K Event Handling Über JMenuBar die diversen Panels anzeigen AWT, Swing, JavaFX & SWT 10
J Swing JMenuItem blockiert JMenuBar AWT, Swing, JavaFX & SWT 2
S JMenuBar bei sichtbarer JGlassPane AWT, Swing, JavaFX & SWT 1
R JMenuBar.setFont tut nix ? AWT, Swing, JavaFX & SWT 1
I Swing JMenuBar auch unten am JFrame? AWT, Swing, JavaFX & SWT 2
A Swing JMenuBar updaten AWT, Swing, JavaFX & SWT 2
kaoZ Swing JMenuBar, Preferences, Properties... und viele andere lustige Dinge (Best Practice) AWT, Swing, JavaFX & SWT 15
Q Designfrage zur JMenuBar AWT, Swing, JavaFX & SWT 6
S JMenuBar wiederverwenden und Eventhandling anpassen AWT, Swing, JavaFX & SWT 4
B Swing JMenuBar unten in der Frame setzen? AWT, Swing, JavaFX & SWT 15
Q Fragen zur JMenuBar & Co. AWT, Swing, JavaFX & SWT 3
M Über eine JMenuBar überprüfen ob ein JCheckBoxMenuItem selectiert ist. AWT, Swing, JavaFX & SWT 4
M JMenuBar, JMenu, JMenuItem wird nicht angezeigt AWT, Swing, JavaFX & SWT 16
G Swing JMenuBar zu weit links und oben dargestellt AWT, Swing, JavaFX & SWT 5
B Swing Dynamische JMenuBar AWT, Swing, JavaFX & SWT 2
J JMenuBar ist geaddet, aber nicht im Frame. Wo ist der Fehler? (inkl. Code) AWT, Swing, JavaFX & SWT 2
D JMenuBar - CardLayout (Klasse anzeigen) AWT, Swing, JavaFX & SWT 3
S JMenuBar Frame Abstand AWT, Swing, JavaFX & SWT 3
H jMenuBar AWT, Swing, JavaFX & SWT 13
NR_EIGHT Swing Probleme mit JMenuBar AWT, Swing, JavaFX & SWT 6
M JMenuBar im Applet und paint AWT, Swing, JavaFX & SWT 9
Madlip JMenuBar in JFrame AWT, Swing, JavaFX & SWT 5
B JFrame / JMenuBar => Anfängerprobleme AWT, Swing, JavaFX & SWT 2
R JMenuBar AWT, Swing, JavaFX & SWT 2
S JMenuBar nach 1. Klick deselectieren AWT, Swing, JavaFX & SWT 6
Z JMenuBar wird nicht in JFrame angezeigt AWT, Swing, JavaFX & SWT 2
N JMenuBar verschwindet nicht nach ComponentEvent AWT, Swing, JavaFX & SWT 6
C JMenuBar aktualisieren? AWT, Swing, JavaFX & SWT 2
A Doppelte JMenuBar AWT, Swing, JavaFX & SWT 2
X NullPointerException beim Einfügen einer JMenuBar AWT, Swing, JavaFX & SWT 4
C JMenuBar im JFrame abgehackt AWT, Swing, JavaFX & SWT 7
J Swing JFrame mit JMenuBar, allerdings ohne Erfolg AWT, Swing, JavaFX & SWT 10
K Look&Feel von JMenuBar und Subkomponenten anpassen AWT, Swing, JavaFX & SWT 6
C JMenuBar linksbündig AWT, Swing, JavaFX & SWT 6
C Größe JMenuBar AWT, Swing, JavaFX & SWT 5
KrokoDiehl Swing Actions direkt auf der JMenuBar AWT, Swing, JavaFX & SWT 6
L Swing Kommunikation zwischen JMenuBar und anderen Componenten AWT, Swing, JavaFX & SWT 2
Developer_X Swing JMenuBar Layout AWT, Swing, JavaFX & SWT 2
kniffel JMenuBar aus anderer Klasse AWT, Swing, JavaFX & SWT 10
G Dynamische JMenuBar AWT, Swing, JavaFX & SWT 2
G JMenuBar verschmälern AWT, Swing, JavaFX & SWT 2
M ALT shortcut für JMenuBar deaktivieren AWT, Swing, JavaFX & SWT 3
X JMenuBar überlappt von JPanel :( AWT, Swing, JavaFX & SWT 7
M4nuel Warum überlagert JDesktopPane mein JMenuBar? AWT, Swing, JavaFX & SWT 5
G StatusBar Optik wie JMenuBar; GUI-Erzeugung delegieren AWT, Swing, JavaFX & SWT 2
J JMenuBar in Frame einbauen AWT, Swing, JavaFX & SWT 6
D Canvas über JMenuBar AWT, Swing, JavaFX & SWT 7
P JMenuBar und JToolBar Anzeige Probleme AWT, Swing, JavaFX & SWT 5
C JLabel in JMenuBar frei platzieren AWT, Swing, JavaFX & SWT 2
B JMenubar AWT, Swing, JavaFX & SWT 5
Chris_1980 Makierungsfarbe bei JMenuBar ändern AWT, Swing, JavaFX & SWT 5
L Problem mit JMenuBar AWT, Swing, JavaFX & SWT 5
F JTextField rechts in der JMenuBar AWT, Swing, JavaFX & SWT 4
A gezeichnete Linie verschwindet, wenn ich JMenuBar öffne AWT, Swing, JavaFX & SWT 2
I JMenuBar - Menüs sortieren AWT, Swing, JavaFX & SWT 2
S JMenuBar mit Action belegen! AWT, Swing, JavaFX & SWT 5
M JMenuBar AWT, Swing, JavaFX & SWT 7
T JMenuBar ausblenden lassen aber Hotkeys sollen erhalten sein AWT, Swing, JavaFX & SWT 2
S JMenuBar + update AWT, Swing, JavaFX & SWT 3
M JMenuBar - JMenu mit Tastenkombination aufrufen / anzeigen AWT, Swing, JavaFX & SWT 8
T JMenuBar zweizeilig AWT, Swing, JavaFX & SWT 2
A JMenuBar + paint (Image) AWT, Swing, JavaFX & SWT 6
M JmenuBar wird net angezeigt :( AWT, Swing, JavaFX & SWT 6
U komplette JMenuBar deaktivieren? AWT, Swing, JavaFX & SWT 4
S Mausklick reagiert nicht im JMenuBar AWT, Swing, JavaFX & SWT 4
A JMenuBar verschieben. AWT, Swing, JavaFX & SWT 4
T JMenuBar wird nicht richtig angezeigt AWT, Swing, JavaFX & SWT 5
H JFrame, JMenuBar, ScrollBar AWT, Swing, JavaFX & SWT 3
XWing Basic JPanel mit 2 Buttons beutzen. AWT, Swing, JavaFX & SWT 10
jojoge Wie erstelle ich runde Buttons mit Farbe? AWT, Swing, JavaFX & SWT 1
berserkerdq2 Buttons und Shapes sehen ja nach Screengröße klein oder zu groß aus, jemand eine Idee, was man tun kann? AWT, Swing, JavaFX & SWT 1
H Swing Buttons erst nach Klick sichtbar AWT, Swing, JavaFX & SWT 13
volcanos SpringLayout mit zusätzlichen Buttons außerhalb des SpringLayout AWT, Swing, JavaFX & SWT 33
K Swing Buttons erst blinken lassen und dann abfragen, ob sie gedrückt worden sind AWT, Swing, JavaFX & SWT 2
Z Switch Case für Buttons AWT, Swing, JavaFX & SWT 8
O Swing JOptionPane.showOptionDialog - Wie kann ich Buttons größer machen AWT, Swing, JavaFX & SWT 10
R mehrere buttons mit forschleife kreieren und individuell bearbeiten AWT, Swing, JavaFX & SWT 1
Z Swing Kann man denn abstand zwischen zwei Buttons berechnen AWT, Swing, JavaFX & SWT 5
B JavaFX DropDown Menu mit ausführbaren Buttons AWT, Swing, JavaFX & SWT 1
VPChief Buttons Reagieren erst wenn ich Fenster minimiere AWT, Swing, JavaFX & SWT 4
ms_cikar Jbutton erzeugt neue Buttons AWT, Swing, JavaFX & SWT 2
K Buttons dynamisch erstellen (NetBeans) AWT, Swing, JavaFX & SWT 10
S Kreis vergrößern/verkleinern mit Buttons AWT, Swing, JavaFX & SWT 1
J JavaFX von einem Array aus Buttons herausfinden auf welcher geklickt wurde aus dem Array. AWT, Swing, JavaFX & SWT 1
xYurisha ActionListener Methoden Buttons zuweisen! AWT, Swing, JavaFX & SWT 16
xYurisha Aus einer Gui Buttons, Label und ProgessBars entfernen AWT, Swing, JavaFX & SWT 4
CptK Wieso wird nur ein Teil meiner Buttons angezeigt? AWT, Swing, JavaFX & SWT 1
J Ziehen eines Buttons im JPanel AWT, Swing, JavaFX & SWT 2
J Drag and Drop eines Buttons AWT, Swing, JavaFX & SWT 0
J TicTacToe Buttons AWT, Swing, JavaFX & SWT 14
J ActionListener bei Buttons AWT, Swing, JavaFX & SWT 14
DaCrazyJavaExpert Swing Extern den Text eines nicht fetsgelegten Buttons bekommen. AWT, Swing, JavaFX & SWT 12
T Swing Double Click bei Buttons in JTable AWT, Swing, JavaFX & SWT 9
C Buttons funtionieren nicht AWT, Swing, JavaFX & SWT 10
S SWT neues Fenster, buttons aus alten etc... AWT, Swing, JavaFX & SWT 0
G vorgefertigte Buttons oder neue Komponente mit MouseListener? AWT, Swing, JavaFX & SWT 0
Neumi5694 Sprache der Standard-Buttons AWT, Swing, JavaFX & SWT 7
Timo_neu_in_java Buttons Erstellen AWT, Swing, JavaFX & SWT 6
H JavaFX TableCell mit Buttons AWT, Swing, JavaFX & SWT 1

Ähnliche Java Themen


Oben