2016-02-13 32 views
0

我试图做的是一个Appled,它引发2个线程,每个线程运行一个通过无限循环增加自身的计数器 然后我在Applet的paint()方法中使用while(true),该方法不断绘制计数器,问题是我也有2个按钮,每个按钮用于停止每个线程,但paint()方法中的无限循环不会让我没有点击没有人,也没有关闭该小程序的窗口,也没有什么Applet中的paint()方法中的无限循环不允许我与显示的按钮进行交互

下面的截图,然后代码

顺便说一句我敢肯定这个问题是涂料()循环,如果我禁用LO我可以与按钮进行交互,但计数器显然没有更新,奇怪的是,我将鼠标光标放在按钮上以显示它的形式,例如当您想调整窗口的大小,但没有捕获的时候它:/

http://i.imgur.com/PJnDI4u.png

公共类MainApplet扩展小程序实现的ActionListener {

private static final long serialVersionUID = -2500043816999861110L; 
private Font fuente; 
private Button bUno, bDos; 
private HiloContador hUno, hDos; 

public void init() { 
    setBackground(Color.LIGHT_GRAY); 
    fuente = new Font("Verdana",Font.BOLD,26); 
    bUno = new Button("Parar"); 
    bUno.addActionListener(this); 
    bDos = new Button("Parar"); 
    bDos.addActionListener(this); 
    bUno.setSize(40,20); 
    add(bUno); 
    bDos.setSize(40,20); 
    add(bDos); 
    hUno = new HiloContador(20); 
    hUno.start(); 
    hDos = new HiloContador(40);  
    hDos.start(); 

} 

@SuppressWarnings({ "deprecation", "static-access" }) 
public void actionPerformed(ActionEvent e) { 
    if(e.getSource().equals(bUno)){ 
     hUno.parar(); 
     bUno.setLabel("1 parado"); 
    }else if (e.getSource().equals(bDos)){ 
     hDos.parar(); 
     bDos.setLabel("2 parado"); 
    }    
} 

public void paint(Graphics g) { 
    while (true){ 
     g.clearRect(1,1,getSize().width,getSize().height); //dibuja la ventana 
     g.setFont(fuente); 
     g.drawString(hUno.getContador()+"",40,60); 
     g.drawString(hDos.getContador()+"",100,60); 
     try { 
      Thread.sleep(1000); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

}

+0

'paint()'方法不应该有一个循环。相反,尝试在线程中运行更新。代码示例[here](http://www.java-examples.com/create-number-counter-applet-using-thread-example)和更多解释的示例[here](http://www.dmc.fmph .uniba.sk /的public_html/DOC /的Java/ch10.htm)。 – cxw

+0

如果你放置了一个永不结束的循环,那么你会阻塞事件分派线程(这是处理鼠标事件的线程)。 PS:看看https://docs.oracle.com/javase/7/docs/api/java/awt/EventQueue.html – Warrior

+0

不要阻塞EDT(Event Dispatch Thread)。发生这种情况时,GUI将“冻结”。有关详细信息和修补程序,请参见[Swing中的并发](https://docs.oracle.com/javase/tutorial/uiswing/concurrency/)。 –

回答

1

的情况下,它可以帮助任何人,解决了删除无限循环,并添加此方法

Timer timer = new Timer(); 
timer.schedule(new TimerTask() { 
public void run() { 
repaint();} 
}, 0, 1000);