Images abwechselnd Darstellen

Status
Nicht offen für weitere Antworten.

PollerJava

Top Contributor
Hallo, ich habe eine JFrame und in dem befindet sich ein JPanel. In das JPanel habe ich ein Image hinzugefügt.
Ich möchte jetzt auf einem Teilbereich des Images einmal das Image rotor1 und einmal rotor2 darstellen.

Kann mir da jemand helfen. Ich komme nicht mehr weiter. Unten meine drei Klassen.

lg und vielen Dank
Stefan


Code:
// diese Klasse ist meine Hauptklasse, in dieser wird das hintergrundBild auf dem JPanel dargestellt

public class MainFrame extends JFrame {    
    private Image hintergrundBild;
    private Image rotor1;
    private Image rotor2;
    private JankSchalter schalter;
    private JankSchalter taster;
    private JButton button1;
    private ImageIcon buttonAus;
    private ImageIcon buttonEin; 
    private ImageIcon tasterAus;
    private ImageIcon tasterEin;
    private JLabel label;
    private JPanel p;
    private JPanel panelHMI;
    private RotorDrehung rotor;
    
    public MainFrame() 
	{
	super("MainFrame");
	hintergrundBild = getToolkit().getImage(System.getProperty("user.dir") + "\\pics\\hintergrundBild.png");
        rotor1 = getToolkit().getImage(System.getProperty("user.dir") + "\\pics\\rotor1.png");
        rotor2 = getToolkit().getImage(System.getProperty("user.dir") + "\\pics\\rotor2.png");
        buttonAus = new ImageIcon(System.getProperty("user.dir") + "\\pics\\aus.gif");
	buttonEin = new ImageIcon(System.getProperty("user.dir") + "\\pics\\ein.gif");
        tasterAus = new ImageIcon(System.getProperty("user.dir") + "\\pics\\ausbutton.gif");
	tasterEin = new ImageIcon(System.getProperty("user.dir") + "\\pics\\einbutton.gif");
	MediaTracker mt = new MediaTracker(this);
	mt.addImage(hintergrundBild, 0);
        mt.addImage(rotor1, 0);
        mt.addImage(rotor2, 0);
        try { mt.waitForAll();}  
	catch (InterruptedException e) {}
	
	panelHMI = new JPanel();
	panelHMI.setLayout(new BorderLayout());
	panelHMI.setBackground(Color.GRAY);
	panelHMI.setBounds(10, 10, hintergrundBild.getWidth(this), hintergrundBild.getHeight(this));
	panelHMI.setBorder(new javax.swing.border.SoftBevelBorder(javax.swing.border.BevelBorder.RAISED));
                p = new BildPanel(hintergrundBild, rotor2);  // hier wird das hintergrundbild dargestellt
	p.setBounds(10,10,200,200);
	
	schalter = new JankSchalter("EinAusSchalter", "Style1", buttonAus, 5, "Times New Roman", 12);
	schalter.setLocation(hintergrundBild.getWidth(this)-200, hintergrundBild.getHeight(this)-180);
	schalter.addActionListener(new GUIControl(schalter, buttonAus, buttonEin));
        
        taster = new JankSchalter("Taster", "Style1", tasterAus, 5, "Times New Roman", 12);
	taster.setLocation(hintergrundBild.getWidth(this)-300, hintergrundBild.getHeight(this)-180);
        taster.addMouseListener(new GUIControl(taster, tasterAus, tasterEin)); 
	
	button1 = new JButton("Test");
	button1.setLocation(10,10);
	button1.setSize(80, 20);
	button1.addActionListener(new GUIControl(schalter, buttonAus, buttonEin));
        Thread th = new Thread();
        th.start();
        
     	add(panelHMI);
	panelHMI.add(schalter);
        panelHMI.add(taster);
	panelHMI.add(button1);
 	panelHMI.add(p); // hier wird das hintergrundBild zu panelHMI hinzugefügt
        
        rotor = new RotorDrehung(p, rotor1, rotor2, panelHMI);  // hier möchte ich eben die Klasse                    
                                                                                          //RotorDrehung aufrufen, um den Thread für die   
                                                                                          //abwechselnde Darstellung von rotor1 und rotor2 zu 
                                                                                          //erreichen
        rotor.start();
	}
    
    public static void main(String args[]) 
	{
	MainFrame mainFrame = new MainFrame();
	mainFrame.setLocation(120, 20);
	mainFrame.setSize(800, 700);
	mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	mainFrame.setLayout(null);
	mainFrame.setAlwaysOnTop(true);
	mainFrame.setVisible(true);
	}  
}

//Klasse zum Anzeigen der Images
class BildPanel extends JPanel {
    private Image hintergrundBild;
    private Image rotor;
 
    public BildPanel(Image hintergrundBild, Image rotor)
	{
	this.hintergrundBild = hintergrundBild;
        this.rotor = rotor;
	}
     public BildPanel(Image rotor)
	{
        this.rotor = rotor;
	}
     public void setRotor(Image rotor)    
        {
         System.out.println("in setrotor");
        this.rotor = rotor; 
        repaint();
        }
    public void paintComponent(Graphics g) 
	{
        System.out.println("in paint");
        super.paintComponent(g);
	g.drawImage(hintergrundBild,0,0,getWidth(),getHeight(), this); 
        g.drawImage(rotor,288,388,this); 
	}
}

//Klasse zur abwechselden Darstellung zweier Images auf dem Panel panelHMI
class RotorDrehung extends Thread {
        private JPanel p;
        private JPanel panelHMI;
        private Image rotor1;
        private Image rotor2;
        private BildPanel bildPanel = new BildPanel(rotor2);
        
        public RotorDrehung(JPanel p, Image rotor1, Image rotor2, JPanel panelHMI)
            {
            this.p = p;
            this.panelHMI = panelHMI;
            this.rotor1 = rotor1;
            this.rotor2 = rotor2;
            }
    
        public void run() 
            {
            try {
                while (true)
                    {
                    Thread.sleep(3000);
                    bildPanel.setRotor(rotor1);  // hier soll eben irgendwie das Image rotor1 an die Klasse BildPanel gegeben werden und auf meinem panelHMI dargestellt werden -> das funktioniert aber nicht, vielleicht hat da jemand eine Idee,
                    bildPanel.repaint();
                    Thread.sleep(3000);
                    bildPanel.setRotor(rotor2); // hier dann rotor2
                    bildPanel.repaint();
                    }
                }
            catch (Exception th) 
                {
                System.out.println("Fehler: " + th);
                }
            }
}
 
In "RotorDrehung" hast du ein BildPanel erstellt. In diesem BildPanel wird das Bild geändert. Das BildPanel, das du dort erstellst, ist aber ein anderes BildPanel als das, das in der Hauptklasse erstellt (und angezeigt) wird.

Du musst das BildPanel, das du in der Hauptklasse erstellst, an RotorDrehung weiterreichen.

Sinngemäß (!) so:

Code:
// diese Klasse ist meine Hauptklasse, in dieser wird das hintergrundBild auf dem JPanel dargestellt

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


public class MainFrame2 extends JFrame {
    private Image hintergrundBild;
    private Image rotor1;
    private Image rotor2;
    private JToggleButton schalter;
    private JToggleButton taster;
    private JButton button1;
    private ImageIcon buttonAus;
    private ImageIcon buttonEin;
    private ImageIcon tasterAus;
    private ImageIcon tasterEin;
    private JLabel label;
    private BildPanel p;
    private JPanel panelHMI;
    private RotorDrehung rotor;

    public MainFrame2()
   {
   super("MainFrame");
   hintergrundBild = getToolkit().getImage("back.jpg");
        rotor1 = getToolkit().getImage("bildA.jpg");
        rotor2 = getToolkit().getImage("bildB.jpg");

        buttonAus = new ImageIcon(System.getProperty("user.dir") + "\\pics\\aus.gif");
   buttonEin = new ImageIcon(System.getProperty("user.dir") + "\\pics\\ein.gif");
        tasterAus = new ImageIcon(System.getProperty("user.dir") + "\\pics\\ausbutton.gif");
   tasterEin = new ImageIcon(System.getProperty("user.dir") + "\\pics\\einbutton.gif");

   MediaTracker mt = new MediaTracker(this);
   mt.addImage(hintergrundBild, 0);
        mt.addImage(rotor1, 0);
        mt.addImage(rotor2, 0);
        try { mt.waitForAll();}
   catch (InterruptedException e) {}

   panelHMI = new JPanel();
   panelHMI.setLayout(new BorderLayout());
   panelHMI.setBackground(Color.GRAY);
   panelHMI.setBounds(10, 10, hintergrundBild.getWidth(this), hintergrundBild.getHeight(this));
   panelHMI.setBorder(new javax.swing.border.SoftBevelBorder(javax.swing.border.BevelBorder.RAISED));
                p = new BildPanel(hintergrundBild, rotor2);  // hier wird das hintergrundbild dargestellt
   p.setBounds(10,10,200,200);

   schalter = new JToggleButton("EinAusSchalter");
   schalter.setLocation(hintergrundBild.getWidth(this)-200, hintergrundBild.getHeight(this)-180);
   //schalter.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e) {} });

        taster = new JToggleButton("Taster");
   taster.setLocation(hintergrundBild.getWidth(this)-300, hintergrundBild.getHeight(this)-180);
   //     taster.addMouseListener(new GUIControl(taster, tasterAus, tasterEin));

   button1 = new JButton("Test");
   button1.setLocation(10,10);
   button1.setSize(80, 20);
   //button1.addActionListener(new GUIControl(schalter, buttonAus, buttonEin));
        Thread th = new Thread();
        th.start();

        add(panelHMI);
   panelHMI.add(schalter);
        panelHMI.add(taster);
   panelHMI.add(button1);
   panelHMI.add(p); // hier wird das hintergrundBild zu panelHMI hinzugefügt

        rotor = new RotorDrehung(p, rotor1, rotor2, panelHMI);  // hier möchte ich eben die Klasse
                                                                                          //RotorDrehung aufrufen, um den Thread für die
                                                                                          //abwechselnde Darstellung von rotor1 und rotor2 zu
                                                                                          //erreichen
        rotor.start();
   }

    public static void main(String args[])
   {
   MainFrame2 mainFrame = new MainFrame2();
   mainFrame.setLocation(120, 20);
   mainFrame.setSize(800, 700);
   mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
   mainFrame.setLayout(null);
   mainFrame.setAlwaysOnTop(true);
   mainFrame.setVisible(true);
   }
}

//Klasse zum Anzeigen der Images
class BildPanel extends JPanel {
    private Image hintergrundBild;
    private Image rotor;

    public BildPanel(Image hintergrundBild, Image rotor)
   {
   this.hintergrundBild = hintergrundBild;
        this.rotor = rotor;
   }
     public BildPanel(Image rotor)
   {
        this.rotor = rotor;
   }
     public void setRotor(Image rotor)
        {
         System.out.println("in setrotor "+rotor);
        this.rotor = rotor;
        repaint();
        }
    public void paintComponent(Graphics g)
   {
        System.out.println("in paint");
        super.paintComponent(g);
        if (hintergrundBild != null)
        g.drawImage(hintergrundBild,0,0,getWidth(),getHeight(), this);

			if (rotor != null)        g.drawImage(rotor,288,388,this);
   }
}

//Klasse zur abwechselden Darstellung zweier Images auf dem Panel panelHMI
class RotorDrehung extends Thread {
        private BildPanel bildPanel;
        private JPanel panelHMI;
        private Image rotor1;
        private Image rotor2;


		public RotorDrehung(BildPanel p, Image rotor1, Image rotor2, JPanel panelHMI)
            {
            this.bildPanel = p;
            this.panelHMI = panelHMI;
            this.rotor1 = rotor1;
            this.rotor2 = rotor2;
            }

        public void run()
            {
            try {
                while (true)
                    {
                    Thread.sleep(300);
                    bildPanel.setRotor(rotor1);  // hier soll eben irgendwie das Image rotor1 an die Klasse BildPanel gegeben werden und auf meinem panelHMI dargestellt werden -> das funktioniert aber nicht, vielleicht hat da jemand eine Idee,
                    bildPanel.repaint();
                    Thread.sleep(300);
                    bildPanel.setRotor(rotor2); // hier dann rotor2
                    bildPanel.repaint();
                    }
                }
            catch (Exception th)
                {
                System.out.println("Fehler: " + th);
                }
            }
}
 
Hallo ,

vielen Dank Marko für deine Hilfe, jetzt dreht sich der Rotor bei mir.
Nur habe ich jetzt das Problem, dass die Button verschwinden, wenn das Image rotor1 statt dem Image rotor2 dargestellt wird und umgekehrt natürlich auch. Nur wenn ich mit der Maus drüber fahre, dann sind die Buttons wieder da, aber nur so lange, bis das das Bild wieder wechselt.
Kann ich da irgendwas machen, so dass ich das so machen kann, dass die Buttons immer sichtbar sind?

Vielen cielen Dank!!

lg Stefan
 
Schnell gesagt und schnell gemacht:
super.paintComponent(g)
erst aufrufen, nachdem alle Images gezeichnet wurden...
 
Hallo,

[Hallo Marco, ich habs erst jetzt gelesen, wo soll ich g.paintComponents() hintun? und "nachdem" alle Images gezeichnet wurden -> das ist mir auch nicht ganz klar -> ich zeichne ja immer meinen Rotor (rotor1-4)
-> vielen Dank für deine Hilfe!!!]
unten habe ich nochmal meine Code gepostet, Se funktioniert jetzt, dass rotor1 bis rotor4 abwechselnd dargestellt werden und somit wie eine Drehung aussieht.
Meine Probleme habe ich mit der darstellung der Buttons, wei oben schon geschrieben, ich hab auch probiert, wie mir oben geschrieben wurde, die JButton auf ein eigenes JPanel zu geben aber es will einfach nicht funktionieren.
Entweder es wird das hintergrundBild dargestellt oder die JButton. Das Problem, schätze ich mal, liegt in der ersten Klasse aber ich weiß nicht wie ich das Lösen kann.
Vielleicht kann mir jemand helfen, ich wäre sehr dankbar dafür

lg und vielen DANK für eure Antworten.

lg
Stefan




Code:
public class MainFrame extends JFrame  {    
    private Image hintergrundBild;
    private Image rotor1;
    private Image rotor2;
    private Image rotor3;
    private Image rotor4;
    private JankSchalter schalter;
    private JankSchalter taster;
    private JButton button1;
    private ImageIcon buttonAus;
    private ImageIcon buttonEin; 
    private ImageIcon tasterAus;
    private ImageIcon tasterEin;
    private JLabel label;
    private BildPanel p; 
    private JPanel panelHMI;
    private RotorDrehung rotor;
    
    public MainFrame() 
	{
	super("MainFrame");
	hintergrundBild = getToolkit().getImage(System.getProperty("user.dir") + "\\pics\\hintergrundBild.png");
        rotor1 = getToolkit().getImage(System.getProperty("user.dir") + "\\pics\\rotor1.png");
        rotor2 = getToolkit().getImage(System.getProperty("user.dir") + "\\pics\\rotor2.png");
        rotor3 = getToolkit().getImage(System.getProperty("user.dir") + "\\pics\\rotor3.png");
        rotor4 = getToolkit().getImage(System.getProperty("user.dir") + "\\pics\\rotor4.png");
        buttonAus = new ImageIcon(System.getProperty("user.dir") + "\\pics\\aus.gif");
	buttonEin = new ImageIcon(System.getProperty("user.dir") + "\\pics\\ein.gif");
        tasterAus = new ImageIcon(System.getProperty("user.dir") + "\\pics\\ausbutton.gif");
	tasterEin = new ImageIcon(System.getProperty("user.dir") + "\\pics\\einbutton.gif");
	MediaTracker mt = new MediaTracker(this);
	mt.addImage(hintergrundBild, 0);
        mt.addImage(rotor1, 0);
        mt.addImage(rotor2, 0);
        mt.addImage(rotor3, 0);
        try { mt.waitForAll();}  
	catch (InterruptedException e) {}
	
	panelHMI = new JPanel();
	panelHMI.setLayout(new BorderLayout());    //hier liegt wahrscheinlich das Problem
	panelHMI.setBackground(Color.GRAY);
	panelHMI.setBounds(10, 10, hintergrundBild.getWidth(this), hintergrundBild.getHeight(this));
	panelHMI.setBorder(new javax.swing.border.SoftBevelBorder(javax.swing.border.BevelBorder.RAISED));
	
	schalter = new JankSchalter("EinAusSchalter", "Style1", buttonAus, 5, "Times New Roman", 12);
	schalter.setLocation(hintergrundBild.getWidth(this)-200, hintergrundBild.getHeight(this)-180);
	schalter.addActionListener(new GUIControl(schalter, buttonAus, buttonEin));

        taster = new JankSchalter("Taster", "Style1", tasterAus, 5, "Times New Roman", 12);
	taster.setLocation(hintergrundBild.getWidth(this)-300, hintergrundBild.getHeight(this)-180);
        taster.addMouseListener(new GUIControl(taster, tasterAus, tasterEin)); 
	
	button1 = new JButton("Test");
	button1.setLocation(10,10);
	button1.setSize(80, 20);
	button1.addActionListener(new GUIControl(schalter, buttonAus, buttonEin));
        
        p = new BildPanel(hintergrundBild, rotor2);
	p.setBounds(10,10,200,200);

  	add(panelHMI);
	panelHMI.add(schalter); //hier wird der schalter auf das Panel hinzugefügt
        panelHMI.add(taster); //hier der Taster
	panelHMI.add(button1);  // hier der Button
	panelHMI.add(p);  // hier wird das Hintergrundbild hinzugefügt
        
        rotor = new RotorDrehung(p, rotor1, rotor2, rotor3, rotor4, panelHMI);   
        rotor.start();  // hier wird der Thread gestartet um den Rotor zu drehen
	}
    
    public static void main(String args[]) 
	{
	MainFrame mainFrame = new MainFrame();
	mainFrame.setLocation(120, 20);
	mainFrame.setSize(800, 700);
	mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	mainFrame.setLayout(null);
	mainFrame.setAlwaysOnTop(true);
	mainFrame.setVisible(true);
	}  
}

class BildPanel extends JPanel { 
    private Image hintergrundBild; 
    private Image rotor; 
    private JankSchalter schalter;
    private JankSchalter taster;
    private JButton button1;
    private JPanel panelHMI;

    public BildPanel(Image hintergrundBild, Image rotor) 
        { 
        this.hintergrundBild = hintergrundBild; 
        this.rotor = rotor; 
        this.schalter = schalter;
        this.taster = taster;
        this.button1 = button1;
        this.panelHMI = panelHMI;
        } 
    public BildPanel(Image rotor) 
        { 
        this.rotor = rotor; 
        } 
    public void setRotor(Image rotor) 
        { 
        this.rotor = rotor; 
        repaint(); 
        } 
    public void paintComponent(Graphics g) 
        {  
        super.paintComponent(g); 
        if (hintergrundBild != null) 
            g.drawImage(hintergrundBild,0,0,getWidth(),getHeight(), this); 
        if (rotor != null)        
            g.drawImage(rotor,288,388,this); 
        } 
} 


class RotorDrehung extends Thread { 
      private BildPanel bildPanel; 
      private JPanel panelHMI; 
      private Image rotor1; 
      private Image rotor2; 
      private Image rotor3;
      private Image rotor4;
      
      public RotorDrehung(BildPanel p, Image rotor1, Image rotor2, Image rotor3, Image rotor4, JPanel panelHMI) 
            { 
            this.bildPanel = p; 
            this.panelHMI = panelHMI; 
            this.rotor1 = rotor1; 
            this.rotor2 = rotor2;
            this.rotor3 = rotor3;
            this.rotor4 = rotor4; 
            } 

      public void run() 
         { 
         try { 
              while (true) 
                  { 
                  Thread.sleep(70); 
                  bildPanel.setRotor(rotor1);   
                  bildPanel.repaint(); 
                  Thread.sleep(70); 
                  bildPanel.setRotor(rotor3); 
                  bildPanel.repaint(); 
                  Thread.sleep(70); 
                  bildPanel.setRotor(rotor2); 
                  bildPanel.repaint();
                  Thread.sleep(70); 
                  bildPanel.setRotor(rotor4); 
                  bildPanel.repaint();
                } 
             } 
         catch (Exception th) 
             { 
             System.out.println("Fehler: " + th); 
             } 
         } 
}
 
Kann mir bei meinem Problem oben vielleicht noch jemand helfen, ich bekomms eichfach nicht hin.
Wäre euch sehr dankbar.

Vielen Dank und lg
 
Ach so ja sorry - da hatte Fatal Error dann doch eher recht. (Ich dachte, die Buttons liegen in dem panel, in dem auch die Bilder gezeichnet werden). Die Struktur (also WELCHES Panel WO Liegt) ist nicht ganz klar - soweit ich das sehe, verwendest du ein BorderLayout und gibts trotzdem irgendwelche Bounds an (nach einem Ändern der Fenstergröße sind diese Bounds hinfällig). Du mußt schon sicherstellen, dass nicht zwei Componentes an den gleichen Platz gezeichnet werden sollen.

Eine Mgöglichkeit wäre, statt des
panelHMI.setLayout(new BorderLayout()); //hier liegt wahrscheinlich das Problem
ein
panelHMI.setLayout(null);
zu verwenden - dann kannst du alle darin enthaltenen Komponenten frei Platzieren. Aber das macht meistens keinen Sinn - eigentlich sollte man das, was man erreichen will, durch ein "geschicktes" Layout erreichen können.
 
Ja das hab ich schon Probiert und ich würde auch genau das null- Layout brauchen da ich wirklich alle Elemente frei plazieren muss, nur wenn ich das NullLayout verwende, dann isn die Button nur beim Starten kurz zu sehen und dann gar nicht mehr - nicht einmal, wenn ich mit der Maus über die Buttons fahre.
Wie könnte ich das noch lösen.
Hast du da noch eine Tipp für mich?

lg und vielen DANK.

lg
 
PollerJava hat gesagt.:
ich würde auch genau das null- Layout brauchen da ich wirklich alle Elemente frei plazieren muss,
Das bezweifle ich mal :wink: Aber für einige der buttons setzt du nur die Position (Location) und nicht dir Größe. Vielleicht liegt's daran? Wenn nicht, werde ich das bei Gelegenheit mal testen - dazu aber den JankButton durch einen einfachen JToggleButton ersetzen, falls das OK ist....
 
Ja super, vielen Dank,

Ich brauch das Nulllayout da ich alle Komponenten selber positionieren will und wenn das Fenster kleiner oder größer gemacht wird (mir ist die Problematik klar), dann positionier ich die Komponenten neu.
Ich programmiere nämlich ein Panel (eben das panelHMI), welches ich dann in verschiedenen Applikationen verwenden kann.
Vielen DANK für deine Hilfe
JankButton ist eh ein Button, den ich nach meinen Vorstellungen gemacht habe.

lg
 
Naja. Wenn man nicht
bildPanel.repaint()
aufruft, sondern
panelHMI.repaint()
dann funktioniert es erstmal, aber das ist reiner Zufall. Es bewirkt nur, dass nicht nur das BildPanel neu gezeichnet wird, sondern auch der Button, der ansonsten "hinter dem neu gezeichneten BildPanel verschwindet". Welche Component man dann sieht, hängt davon ab, in welcher Reihenfolge sie hinzugefügt wurden.

Ich weiß nicht genau, was das am Ende werden soll, und was du da genau machen willst, aber wenn du es vernünftig machen willst, dann mach' es anders als jetzt!

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

public class MainFrame3 extends JFrame  {
    private Image hintergrundBild;
    private Image rotor1;
    private Image rotor2;
    private Image rotor3;
    private Image rotor4;
    private JToggleButton schalter;
    private JToggleButton taster;
    private JButton button1;
    private ImageIcon buttonAus;
    private ImageIcon buttonEin;
    private ImageIcon tasterAus;
    private ImageIcon tasterEin;
    private JLabel label;
    private BildPanel p;
    private JPanel panelHMI;
    private RotorDrehung rotor;

    public MainFrame3()
   {
   super("MainFrame");
   hintergrundBild = getToolkit().getImage("back.jpg");
        rotor1 = getToolkit().getImage("bildA.jpg");
        rotor2 = getToolkit().getImage("bildB.jpg");
        rotor3 = getToolkit().getImage("bildA.jpg");
        rotor4 = getToolkit().getImage("bildB.jpg");


        buttonAus = new ImageIcon(System.getProperty("user.dir") + "\\pics\\aus.gif");
   buttonEin = new ImageIcon(System.getProperty("user.dir") + "\\pics\\ein.gif");
        tasterAus = new ImageIcon(System.getProperty("user.dir") + "\\pics\\ausbutton.gif");
   tasterEin = new ImageIcon(System.getProperty("user.dir") + "\\pics\\einbutton.gif");
   MediaTracker mt = new MediaTracker(this);
   mt.addImage(hintergrundBild, 0);
        mt.addImage(rotor1, 0);
        mt.addImage(rotor2, 0);
        mt.addImage(rotor3, 0);
        try { mt.waitForAll();}
   catch (InterruptedException e) {}

   panelHMI = new JPanel();
   panelHMI.setLayout(null); //new BorderLayout());    //hier liegt wahrscheinlich das Problem
   panelHMI.setBackground(Color.GRAY);
   panelHMI.setBounds(10, 10, hintergrundBild.getWidth(this), hintergrundBild.getHeight(this));
   panelHMI.setBorder(new javax.swing.border.SoftBevelBorder(javax.swing.border.BevelBorder.RAISED));

   schalter = new JToggleButton("EinAusSchalter");
   schalter.setLocation(hintergrundBild.getWidth(this)-200, hintergrundBild.getHeight(this)-180);
   schalter.setSize(50,20);
   //schalter.addActionListener(new GUIControl(schalter, buttonAus, buttonEin));

        taster = new JToggleButton("Taster");
   taster.setLocation(hintergrundBild.getWidth(this)-300, hintergrundBild.getHeight(this)-180);
   taster.setSize(50,20);
        //taster.addMouseListener(new GUIControl(taster, tasterAus, tasterEin));

   button1 = new JButton("Test");
   button1.setLocation(10,10);
   button1.setSize(80, 20);
   //button1.addActionListener(new GUIControl(schalter, buttonAus, buttonEin));

        p = new BildPanel(hintergrundBild, rotor2);
   p.setBounds(10,10,800,800);

     add(panelHMI);
   panelHMI.add(schalter); //hier wird der schalter auf das Panel hinzugefügt
        panelHMI.add(taster); //hier der Taster
   panelHMI.add(button1);  // hier der Button
   panelHMI.add(p);  // hier wird das Hintergrundbild hinzugefügt

        rotor = new RotorDrehung(p, rotor1, rotor2, rotor3, rotor4, panelHMI);
        rotor.start();  // hier wird der Thread gestartet um den Rotor zu drehen
   }

    public static void main(String args[])
   {
   MainFrame3 mainFrame = new MainFrame3();
   mainFrame.setLocation(120, 20);
   mainFrame.setSize(800, 700);
   mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
   mainFrame.setLayout(new GridLayout(1,1));
   mainFrame.setAlwaysOnTop(true);
   mainFrame.setVisible(true);
   }
}

class BildPanel extends JPanel {
    private Image hintergrundBild;
    private Image rotor;
    private JToggleButton schalter;
    private JToggleButton taster;
    private JButton button1;
    private JPanel panelHMI;

    public BildPanel(Image hintergrundBild, Image rotor)
        {
        this.hintergrundBild = hintergrundBild;
        this.rotor = rotor;
        this.schalter = schalter;
        this.taster = taster;
        this.button1 = button1;
        this.panelHMI = panelHMI;
        }
    public BildPanel(Image rotor)
        {
        this.rotor = rotor;
        }
    public void setRotor(Image rotor)
        {
        this.rotor = rotor;
        repaint();
        }
    public void paintComponent(Graphics g)
        {
        super.paintComponent(g);
        if (hintergrundBild != null)
            g.drawImage(hintergrundBild,0,0,getWidth(),getHeight(), this);
        if (rotor != null)
            g.drawImage(rotor,288,388,this);
        }
}


class RotorDrehung extends Thread {
      private BildPanel bildPanel;
      private JPanel panelHMI;
      private Image rotor1;
      private Image rotor2;
      private Image rotor3;
      private Image rotor4;

      public RotorDrehung(BildPanel p, Image rotor1, Image rotor2, Image rotor3, Image rotor4, JPanel panelHMI)
            {
            this.bildPanel = p;
            this.panelHMI = panelHMI;
            this.rotor1 = rotor1;
            this.rotor2 = rotor2;
            this.rotor3 = rotor3;
            this.rotor4 = rotor4;
            }

      public void run()
         {
         try {
              while (true)
                  {
                  Thread.sleep(70);
                  bildPanel.setRotor(rotor1);
                  panelHMI.repaint();
                  Thread.sleep(70);
                  bildPanel.setRotor(rotor3);
                  panelHMI.repaint();
                  Thread.sleep(70);
                  bildPanel.setRotor(rotor2);
                  panelHMI.repaint();
                  Thread.sleep(70);
                  bildPanel.setRotor(rotor4);
                  panelHMI.repaint();
                }
             }
         catch (Exception th)
             {
             System.out.println("Fehler: " + th);
             }
         }
}
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben