2016-09-09 1 views
0

Ich möchte ein Menüfenster erstellen, das Teil einer GUI-Klasse sein wird. Die GUI-Klasse wird von einer Manager-Klasse gesteuert. Das Problem ist, dass ich, wenn ich eine Taste im Menü drücken möchte, dass die Manager-Klasse weiß, dass eine Taste gedrückt wurde. Ich habe versucht, ein Flag zu verwenden, das anzeigt, ob eine Taste gedrückt wurde, aber es funktioniert aus irgendeinem Grund nicht. Hier ist mein Code: Die gui Klasse:JFame aus einer anderen Klasse steuern

public class Gui extends JFrame implements ActionListener { 

private JFrame jframe; 
private JPanel jpanel; 
private JButton jbutton; 
public boolean jbuttonFlag = false; 
Gui(){ 

    jframe = new JFrame("Test Frame"); 

    jframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

    jpanel = new JPanel(); 

    jpanel.setBackground(Color.BLUE); 

    jbutton = new JButton("Click Me"); 

    jbutton.addActionListener(this); 

    jpanel.add(jbutton); 

    jframe.add(jpanel); 

    jframe.pack(); 

    jframe.setVisible(true); 
} 

    public void actionPerformed(ActionEvent e) { 

      if(e.getActionCommand().equals("Click Me")) 

        jbuttonFlag = true; 
    } 
} 

und die Manager-Klasse:

public class Manager{ 

    Gui g; 

    Manager(){ 

     g = new Gui(); 

    } 

    public void Start(){ 

     while(!g.jbuttonFlag); 
     System.out.println("Button Pressed"); 

    } 

} 

Wenn ich auf die Schaltfläche klicken ich es in der Konsole schreiben möchten, dass es angeklickt wurde, aber es doesn‘ t passiert. Warum ? Vielen Dank!

Antwort

0

Sie sollten sie synchronisieren, da sie separate Threads sind. Dieser arbeitete für mich:

In Manager:

public void Start(){ 

     synchronized(g){try{g.wait();}catch(Exception e){}} 
     System.out.println("Button Pressed"); 

    } 

In Gui:

public void actionPerformed(ActionEvent e) { 

      if(e.getActionCommand().equals("Click Me")){ 
       synchronized(this){ 
        this.notify(); 
       } 
      } 
    } 
+0

OK, danke! Verwenden Sie das nicht, während die Bedingung auch eine Art von Synchronisation ist, weil die while verhindert, dass sich der Manager-Thread vorwärts bewegt? – Keselme

+0

Eine andere Sache, was ist, wenn ich verschiedene Tasten habe, und ich möchte unterschiedliche Antwort für jede Taste, muss ich für jede Taste synchronisiert verwenden? – Keselme

+0

Sie können Flags oder andere Objekte synchronisieren, um festzustellen, welche Taste gedrückt wurde. Seien Sie sicher, dass, während einer der Threads es schreibt, die anderen nicht versuchen sollten, es zu lesen. Es ist zwar keine gute Lösung, da es die CPU beschäftigt, indem es beschäftigt wartet. Dies kann Ihren Aktionslistener und andere Threads blockieren. –

Verwandte Themen