2013-04-06 49 views
1

我做了一個框架,當我點擊它時(也是新的幾何圖形被繪製),但當我快速點擊它時,它沒有響應這麼快,它需要像半秒鐘之間點擊。我做錯了什麼?MouseListener的緩慢反應(重新繪製)

import java.awt.Frame; 
import java.awt.Graphics; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseListener; 
import java.awt.event.WindowEvent; 
import java.awt.event.WindowListener; 
import java.util.ArrayList; 

import javax.swing.JOptionPane; 


public class Okienko extends Frame implements MouseListener{ 
public static final int SIZE = 500; 
public static int mX = 0,mY = 0; 
public ArrayList<Wyrysowywalny> l; //COLLECTION OF OBJECT TO DRAW 
    Okienko(){ 
     l = new ArrayList<Wyrysowywalny>(); 
     createGUI(); 
    } 
    public void createGUI(){ 
     setSize(SIZE, SIZE); 
     setVisible(true); 
     setAlwaysOnTop(true); 
     setTitle("Zadanie 1"); 
     addWindowListener(new WindowListener() {  
      public void windowOpened(WindowEvent arg0) {}   
      public void windowIconified(WindowEvent arg0) {}   
      public void windowDeiconified(WindowEvent arg0) {}    
      public void windowDeactivated(WindowEvent arg0) {} 
      public void windowClosed(WindowEvent arg0) {} 
      @Override 
      public void windowClosing(WindowEvent arg0) { 
       JOptionPane.showConfirmDialog(null, "dziekujemy za skorzystanie z programu","",JOptionPane.PLAIN_MESSAGE); 
       System.exit(0);  
      } 
      @Override 
      public void windowActivated(WindowEvent arg0) { 
       repaint(); 

      } 
     }); 
     addMouseListener(this); 
    } 


    @Override 
    public void mouseClicked(MouseEvent e) {/// IMPORTANT! 
     System.out.println(e.getX() + " " + e.getY()); 
     mX = e.getX(); 
     mY = e.getY(); 
     int r; 

     r = (int) (Math.random() * 6); 
     switch(r){ 
      case 0: l.add(new Trojkat(mX,mY,lXY(),lXY(),lXY(),lXY()));break; // OBJECTS TO DRAW  
      case 1: l.add(new Prostokat(mX,mY,lR(),lR()));break; 
      case 2: l.add(new Kwadrat(mX,mY,lR()));break; 
      case 3: l.add(new Kolo(mX,mY,lR()));break; 
      case 4: l.add(new Elipsa(mX,mY,lR(),lR())); break; 
      case 5: l.add(new TrojkatRownoboczny(mX,mY,lR())); break; 
     }  
     repaint(); 

    } 
    @Override 
    public void mouseEntered(MouseEvent arg0) {} 
    @Override 
    public void mouseExited(MouseEvent arg0) {} 
    @Override 
    public void mousePressed(MouseEvent arg0) {} 
    @Override 
    public void mouseReleased(MouseEvent arg0) {} 

    public static int lXY(){ 
     return (int) (Math.random()*SIZE * 4d/5 + 1d/40*SIZE); 
    } 
    public static int lR(){ 
     return (int) (Math.random()*200 - 1d/40*SIZE); 
    } 
    public void paint(Graphics g){ 
     super.paint(g); 
     for(Wyrysowywalny w : l) 
      w.draw(g);//DRAW OBJECT 
    } 


    public static void main(String[] args) { 

     new Okienko(); 
    } 


} 
+0

通過deafulr mosue事件有沒有與準備對象準備是飛bysed外部resurces,沒人知道創建可見,沒有對象的任何問題,因爲一切都在'開關(R)隱藏{.. }',那麼這個問題很難回答 – mKorbel 2013-04-06 07:53:41

+0

@mKorbel在交換機中只創建由原始數據類型(字段是整數等)構成的對象沒有困難的東西。 – Yoda 2013-04-06 08:02:56

+0

發生什麼情況下,您將使用paintCompaint到JPanel而不是使用paint來繪製到JFrame – mKorbel 2013-04-06 08:35:09

回答

2

缺席一個完整的例子,我只能做一些意見:

  • 相反的mouseClicked(),當鼠標在同一組件被釋放的時候觸發,你可能想mousePressed()迴應。

  • 還考慮MouseAdapter而不是implements MouseListener

  • 如提到here,「Swing程序應該覆蓋paintComponent()而不是覆蓋paint()」。

  • Swing GUI對象應該在event dispatch thread上構建和操縱只有

  • 引用here表示沒有可感知延遲的更精細的示例。