Swing Rückmeldung für JButton

steffi89

Mitglied
Hallo meine lieben

Ich hoffe Ihr könnt mir helfen.

Habe ein Panel gezeichnet mit 8 Buttons. Über das Netzwerk frage ich nun ein Gerät über seinen aktuellen Zustand ab. Je nachdem was das Gerät antwortet soll sich ein spezieller Button ändern (z. B. die Farbe). Die Abfrage sollte alle 5 Sekunden durchgeführt werden, deshalb dache ich an ca. soetwas:

Java:
public class PanelSwitcher{
   
    Dimension dPanel = new Dimension(360,120);
    Dimension dButton = new Dimension(80,35);
    Dimension dLabel = new Dimension(320,35);
    
   
    //Haptpanel
    JPanel Panel = new JPanel();

    //Buttons
    JButton bInput1 = new JButton("1");
    JButton bInput2 = new JButton("2");
    JButton bInput3 = new JButton("3");
    JButton bInput4 = new JButton("4");
    JButton bInput5 = new JButton("5");
    JButton bInput6 = new JButton("6");
    JButton bInput7 = new JButton("7");
    JButton bInput8 = new JButton("8");
    
    public JPanel init(){
                
            Panel.setPreferredSize(new Dimension(350,400));
            Panel.setBorder(new TitledBorder("Titel"));

            JLabel lTopic = new JLabel();
            JPanel InputPanel = new JPanel();
            JPanel SetPanel = new JPanel();
            JPanel InfoPanel = new JPanel();
            //Panels
            InputPanel.setBorder(new TitledBorder("Input"));
            SetPanel.setBorder(new TitledBorder("Settings"));
            InfoPanel.setBorder(new TitledBorder("Informationen"));
            
            
            
            JButton bAktuell = new JButton("Aktuallisieren");
            bInput1.setPreferredSize(dButton);
            bInput2.setPreferredSize(dButton);
            bInput3.setPreferredSize(dButton);
            bInput4.setPreferredSize(dButton); 
            bInput5.setPreferredSize(dButton);
            bInput6.setPreferredSize(dButton);
            bInput7.setPreferredSize(dButton);
            bInput8.setPreferredSize(dButton); 
            
            bAktuell.setPreferredSize(new Dimension(150,35));
            
            // RM aktuallisieren: das erste mal
            [EDIT]callButtonRm();[/EDIT]
            
            // Panelbeschreiben
            InputPanel.add(bInput1);
            InputPanel.add(bInput2);
            InputPanel.add(bInput3);
            InputPanel.add(bInput4);
            InputPanel.add(bInput5);
            InputPanel.add(bInput6);
            InputPanel.add(bInput7);
            InputPanel.add(bInput8);
            
            InputPanel.setPreferredSize(dPanel);
            SetPanel.setPreferredSize(dPanel);
            InfoPanel.setPreferredSize(dPanel);

            Panel.add(lTopic);
            Panel.add(InputPanel);
            Panel.add(SetPanel);
            Panel.add(InfoPanel);
            Panel.add(bAktuell);
            
            
            
            return Panel;		
	}
    
    
        public void callButtonRm(){
        
            // Rückmeldung Button Input
            bInput1.setForeground(Color.black);
            bInput2.setForeground(Color.black);
            bInput3.setForeground(Color.black);
            bInput4.setForeground(Color.black);
            bInput5.setForeground(Color.black);
            bInput6.setForeground(Color.black);
            bInput7.setForeground(Color.black);
            bInput8.setForeground(Color.black);
            
            switch(sw.getExtronSwitchInput()){
                case 0:
                    break;
                case 1:
                    bInput1.setForeground(Color.blue);
                    break;
                case 2:
                    bInput2.setForeground(Color.blue);
                    break;
                case 3:
                    bInput3.setForeground(Color.blue);
                    break;
                case 4:
                    bInput4.setForeground(Color.blue);
                    break;
                case 5:
                    bInput5.setForeground(Color.blue);
                    break;
                case 6:
                    bInput6.setForeground(Color.blue);
                    break;
                case 7:
                    bInput7.setForeground(Color.blue);
                    break;
                case 8:
                    bInput8.setForeground(Color.blue);
                    break;
                default:
            }
            
            
        }
}

Die Zeitabfrage passiert dann über das Hauptprogramm.

Vielleicht hat ja jemand eine Idee, wie ich das realisieren kann.

lg

Steffi
 
Natürlich musst du dein Panel noch in ein JWindow hinzufügen.
Auch würde ich das die init-Methode im Konstruktor aufrufen und die Klasse selbst das JPanel sein lassen. (also von JPanel erben)

Aber dann braucht du halt nur noch einen Thread, der nebenher läuft und alle 5sec die Abfrage an das Netzwerkgerät macht und dann deine Methode [c]callButtonRm[/c] aufruft.

z.B.
Java:
public abstract class Ticker extends Thread {

	private final int ms;
	
	public Ticker(int seconds){
		this.ms = seconds * 1000;
	}
	
	@Override
	public void run() {
		try{
			while(true){
				doOnTick();
				sleep(ms);
			}
		}catch(Exception ex){
			ex.printStackTrace();
		}
	}
	
	abstract public void doOnTick();
	
}

Aufgerufen wird das ganze dann ca so:
Java:
	public static void main(String[] args) {
		// erstelle Panel
		final PanelSwitcher switcher = new PanelSwitcher();

		new Ticker(5){
			@Override
			public void doOnTick() {
				// lade gerätestatus
				sw.getDeviceStatus();
				// aktualisiere Buttons
				switcher.callButtonRm();
			}
		}.start();
	}
 
Hallo mein Held

Danke für Deine Antwort. Sorry. Habe mich da ein wenig ungeschickt ausgedrückt. Mein Problem ist nicht die Abfrage alle x Sekunden, sondern dass sich die Buttons nicht ändern. wenn ich den Code der callButtonRm() in den Haupftteil kopiere, werden die Button richtig angezeigt. Wenn ich das ganze über den callButtonRm() mache nicht mehr.

Das Panel ist nur ein kleiner Teil einer größeren Oberfläche.

Vielen Dank für Deine Hilfe.


lg

Steffi
 
Möglich könnte sein, dass du die Methode auf ein falsches Objekt vom Typ PanelSwitcher aufrufst.
Aber ohne den Code, wo das Objekt erstellt wird und wo die Methode aufgerufen wird, ist das schwer zu sagen.
Zeig doch mal die 2 verschiedenen Varianten, wie du deine Methode aufrufen würdest.
 
Der Zustand von Swing Controls sollte nur aus dem EDT passieren.

In deinem Code geschieht das aber auch aus einem anderen Thread. Das solltest du ändern.

Ich habe zu SwingWorker, mit dem Aktionen in einem separaten Thread laufen und dennoch Swing Updates gemacht werden können, in einem Blog-Eintrag beschrieben.
 

Neue Themen


Zurück
Oben