Announcement

Collapse
No announcement yet.

Brauche Hilfe zu SwingUtilities

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Brauche Hilfe zu SwingUtilities

    Hey,

    ich progge grad ein bissl rum und probiere das SwingUtilities aus, wie es mein Info-Lehrer zeigte. Normalerweise müsste das anonyme Runnable-Objekt parallel zur GUI laufen. Tut es aber nicht. Die GUI friert trotzdem ein und die Befehle werden klassisch nacheinander abgearbeitet:

    Mein Code:
    Code:
    import javax.swing.*;
    import java.awt.*; // Graphics
    import java.awt.event.*;
    
    public class BFCompiler extends JApplet{
    	
    	private JTextField txt;
    	private JButton btn;
    	private JButton[] btnarr;
    	private JLabel anflbl;
    	private JLabel mitlbl;
    	private JLabel endlbl;
    	private JTextArea txtarea;
    	private JScrollPane sp;
    	
    	private BFMachine bfm = new BFMachine();
    	
    	private String bftxt = "";
    	
    	private Runnable showInter;
    
    	public void init() {
    		erzeugeKomponenten();
    		registriereZuhoerer();
    		baueLayout();
    	}
    	
    	private void erzeugeKomponenten(){
    		txt = new JTextField("++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.", 20);;
    		btn = new JButton("Interpretieren");
    		btnarr = new JButton[1];
    		btnarr[0] = new JButton("0");
    		anflbl = new JLabel("Anfang");
    		mitlbl = new JLabel("Mitte");
    		endlbl = new JLabel("Ende");
    		txtarea = new JTextArea("");
    		sp = new JScrollPane(txtarea);
    	}
    	
    	private void registriereZuhoerer(){
    		btn.addActionListener(new BL());
    	}
    
    	private int getLength(){
    		int with = 1;
    		int max = 1;
    		for(int i=0; i<bftxt.length(); i++){
    			switch(bftxt.charAt(i)){
    				case '>': with++; break;
    				case '<': with--; break;
    			}
    			if(with>max){max=with;}
    		}
    		return max;
    	}
    
    
    	private void baueLayout(){
    		Container cp = getContentPane();
    		cp.removeAll();
    		cp.setLayout(new BorderLayout());
    		JPanel pN = new JPanel(new FlowLayout());
    			pN.add(txt);
    			pN.add(btn);
    		cp.add(pN, BorderLayout.NORTH);
    		JPanel pC = new JPanel(new BorderLayout());
    			btnarr = new JButton[getLength()];
    			for(int i=0; i<btnarr.length; i++){
    				btnarr[i] = new JButton("0");
    			}
    			JPanel pCN = new JPanel(new GridLayout(2, 1));
    				JPanel pB = new JPanel(new GridLayout(1, btnarr.length));
    					for(int i=0; i<btnarr.length; i++){
    						pB.add(btnarr[i]);
    					}
    				pCN.add(pB);				
    				JPanel pL = new JPanel(new FlowLayout());
    					pL.add(anflbl);
    					pL.add(mitlbl);
    					pL.add(endlbl);
    				pCN.add(pL);
    			pC.add(pCN, BorderLayout.NORTH);
    			
    			pC.add(sp, BorderLayout.CENTER);		
    		cp.add(pC, BorderLayout.CENTER);
    	}
    	
    	public class BL implements ActionListener{
    		public void actionPerformed(ActionEvent e){
    			bftxt = txt.getText();
    			Runnable showInter = new Runnable(){
    				public void run(){
    					try{
    						btnarr[0].setBackground(new Color(128, 0, 0));
    						Thread.sleep(3000);
    						btnarr[0].setBackground(new Color(255, 128, 0));
    					}catch(InterruptedException ie){
    						System.out.println(ie);
    					}
    				}
    			};
    			SwingUtilities.invokeLater(showInter);
    		}
    	}
    
    	
    	public static void main(String[] args){
    		BFCompiler dasApplet= new BFCompiler();
    		JFrame meinFrame= new JFrame("Brainfuck");
    		meinFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		meinFrame.getContentPane().add(dasApplet, BorderLayout.CENTER);
    		dasApplet.init();
    		dasApplet.start();
    			
    		meinFrame.setSize(600, 500); 
    		meinFrame.setVisible(true);
    	}
    }
    Der interessante Teil steht in der inneren Klasse Bl, welches einen ActionListener implementiert.

    Zunächst sollte der Hintergrund des einen Buttons dunkel rot und nach 3 Sekunden orange werden.
    Bei mir friert die GUI für 3 Sekunden ein und das Button wird gleich orange (optisch).

    Ich hoffe jemand kann mir so bald wie möglich helfen.

    Gruß firebird

  • #2
    Hallo,

    der Fehler liegt in der Zeile
    Thread.sleep(3000);

    SwingUtilities.invokeLater führt dazu dass ein Runnable asynchron im AWT-Event-Dispatcher-Thread (EDT) ausgeführt wird. Wenn Du nun also Thread.sleep in diesem Runnable aufrufst, führt das dazu, dass der EDT 3 Sekunden schläft - das heisst keine Komponente kann sich neu zeichnen, usw. genau das erzeugt den "Freeze"-Eindruck.

    Comment

    Working...
    X