2013-09-23 147 views
-1

有人可以幫助我的評論行,除了它要求刪除的東西。謝謝!線程幫助。油漆

public class ex1011c extends JApplet implements ActionListener 
{ 
     // get rid of all winkbutton code 

    JButton winkbutton = new JButton("Wink At You"); 
    boolean wink = false, first = true; 
    Container c; 

    public void init() 
    { 
     c = getContentPane(); 
     c.setLayout(new FlowLayout()); 
     c.setBackground(Color.blue); 
     winkbutton.setForeground(Color.cyan); 
     c.add(winkbutton); 
     winkbutton.addActionListener(this); 
    } 

     // get rid of actionPerformed 

    public void actionPerformed(ActionEvent e) 
    { 
     wink = !wink; 
     repaint(); 
    } 

    public void paint(Graphics g) 
    { 
     /* if first time, draw the face and non winking eye, 
      set first to false */ 

     super.paint(g); 
     g.setColor(Color.yellow); 
     g.fillOval(50, 50, 100, 100); 
     g.setColor(Color.black); 
     g.fillOval(85, 80, 10, 20); 

     /* cover just the eye that winks (if winking or not, but do not 
     cover anything else), switch the wink boolean */ 

     // draw the full eye or winking eye 

     if (wink) 
      g.fillOval(105, 88, 10, 5); 
     else 
      g.fillOval(105, 80, 10, 20); 

     // go to sleep for a second 

     // call repaint 
    } 

     // override update to lesson flicker 

} 
+2

什麼問題? – raffian

+0

不要在繪畫事件中放置邏輯。相反,使用計時器並存儲狀態。 – SLaks

+0

@raffian整個代碼中都有註釋行。我困在他們身上。我會很感激任何幫助 – user2805435

回答

2

簡單,不要睡覺/暫停/阻止或以其他方式阻止事件調度線程。

EDT是負責處理繪畫請求的東西,任何阻止其運行的東西(如Thread.sleep)都會阻止它更新屏幕。

請記住,僅僅因爲您將某些東西繪製到Graphics上下文中,並不意味着它會呈現給輸出。

相反,使用javax.swing.Timer

Concurrency in SwingPerforming Custom PaintingPainting in AWT and Swing看看更多的細節。

我還強烈建議您不要重寫頂級容器的任何paint方法,如JApplet。相反,使用類似JPanel的東西,並改寫它的paintComponent方法。

除了飲用性,您將獲得其中頂層容器沒有雙緩衝的好處...

例如...

隨着簡單示例

enter image description here

import java.awt.BorderLayout; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.Timer; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class Blinky { 

    public static void main(String[] args) { 
     new Blinky(); 
    } 

    public Blinky() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
       } 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setLayout(new BorderLayout()); 
       frame.add(new BlinkPane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class BlinkPane extends JPanel { 

     private boolean wink; 

     public BlinkPane() { 
      Timer timer = new Timer(1000, new ActionListener() { 
       @Override 
       public void actionPerformed(ActionEvent e) { 
        wink = !wink; 
        repaint(); 
       } 
      }); 
      timer.start(); 
     } 

     @Override 
     public Dimension getPreferredSize() { 
      return new Dimension(200, 200); 
     } 

     @Override 
     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      Graphics2D g2d = (Graphics2D) g.create(); 
      int x = (getWidth() - 10)/2; 
      int eyeHeight = 20; 
      if (wink) { 
       eyeHeight = 5; 
      } 
      int y = (getWidth() - eyeHeight)/2; 
      g.fillOval(x, y, 10, eyeHeight); 
      g2d.dispose(); 
     } 
    } 
} 
+0

我將如何減少閃爍? – user2805435

+0

使用'JPanel'(覆蓋它的'paintComponent'方法,你有自定義繪畫那裏),將它添加到你的小程序,閃爍不見了... – MadProgrammer