2011-09-04 104 views
1

好吧,我不知道爲什麼會發生這種情況,但是當我按下關閉按鈕時,joptionpane不會關閉。它不斷彈出,我需要多次點擊才能關閉它。JOptionPane不會關閉

下面的代碼snaphot

Point p; 
    p = onScreenLocation(0.134,0.019, eastlake); 
    btn.setBounds(p.x,p.y,128,96); 
    btn.setContentAreaFilled(false); 
    btn.setBorderPainted(false); 
    add(btn); 

    btn.addMouseListener(new MouseAdapter(){ 
     public void mouseClicked(MouseEvent me){ 
     Object[] options = {"View Info","View Place","Close"}; 
     Object[] choice ={"Close"}; 
     int response = JOptionPane.showOptionDialog(null,"Apartment Area","Message",JOptionPane.YES_NO_CANCEL_OPTION,JOptionPane.QUESTION_MESSAGE,ResidentImage,options,"Close"); 
     if(response == 0){ 
      JOptionPane.showOptionDialog(null, "Apartment Eastlake \n" + 
        "provides students with conducive room and reasonable prices ", "Message", JOptionPane.YES_NO_OPTION,JOptionPane.QUESTION_MESSAGE,ResidentImage,choice,"Close"); 
     } 
     else if(response == 1){ 
      JFrame ImageBox = new JFrame(); 
      ImageBox.setSize(300,400); 
      ImageBox.add(new JLabel(ResidentImageView,SwingConstants.CENTER)); 
      ImageBox.setVisible(true); 
     } 
     else{ 

     } 

     } 

    }); 

完整的代碼

package environment; 

import java.awt.*; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 

import javax.swing.*; 


public class Map extends JPanel{ 

    String time = null; 
    serializedObject[] humans2 = null; 
    serializedDatas input = new serializedDatas(); 
    Image eastlake,otherImage, buddyImage, clientImage, EventImage; 
    String[] buddyList; 
    String clientName; 
    JFrame frame; 

    ClassLoader cl = this.getClass().getClassLoader(); 
    ImageIcon TransparentImage = new ImageIcon(cl.getResource("image1/bnt1.png")); 

    ImageIcon TescoImageView = new ImageIcon(cl.getResource("image1/tesco.jpg")); 
    ImageIcon TescoImage = new ImageIcon(cl.getResource("image1/Tesco.png")); 



    JButton btn = new JButton(TransparentImage); 

    public Map(Image map, Image agent, Image buddy, Image other, String clientName){ 

     eastlake = map; 
     clientImage = agent; 
     otherImage = other; 
     buddyImage = buddy; 
     this.clientName = clientName; 
    } 

    protected void paintComponent(Graphics g) 
    { 
     super.paintComponents(g); 
     Graphics2D g2d = (Graphics2D) g; 
     g2d.drawImage(eastlake,0,0,null); 
     this.setPreferredSize(new Dimension(2624,1696)); 


     Font font = new Font("Helvetica", Font.BOLD, 12); 

     g2d.setFont(font); 
     g2d.setColor(Color.red); 
     if(time != null) 
      g2d.drawString(time, 10, 10); 

     Point p; 
     p = onScreenLocation(0.134,0.019, eastlake); 
     btn.setBounds(p.x,p.y,128,96); 
     btn.setContentAreaFilled(false); 
     btn.setBorderPainted(false); 
     add(btn); 

     btn.addMouseListener(new MouseAdapter(){ 
      public void mouseClicked(MouseEvent me){ 
      Object[] options = {"View Info","View Place","Close"}; 
      Object[] choice ={"Close"}; 
      int response = JOptionPane.showOptionDialog(null,"Apartment Area","Message",JOptionPane.YES_NO_CANCEL_OPTION,JOptionPane.QUESTION_MESSAGE,ResidentImage,options,"Close"); 
      if(response == 0){ 
       JOptionPane.showOptionDialog(null, "Apartment Eastlake \n" + 
         "provides students with conducive room and reasonable prices ", "Message", JOptionPane.YES_NO_OPTION,JOptionPane.QUESTION_MESSAGE,ResidentImage,choice,"Close"); 
      } 
      else if(response == 1){ 
       JFrame ImageBox = new JFrame(); 
       ImageBox.setSize(300,400); 
       ImageBox.add(new JLabel(ResidentImageView,SwingConstants.CENTER)); 
       ImageBox.setVisible(true); 
      } 
      else{ 

      } 

      } 

     }); 

    } 

    public void setTime(String time2) { 
     // TODO Auto-generated method stub 
     this.time = time2; 
    } 

    public void setBuddyList(String[] buddyList2) { 
     // TODO Auto-generated method stub 
     this.buddyList = buddyList2; 
    } 

    protected Point onScreenLocation(double x, double y, Image img) 
    { 
     return new Point((int)(img.getWidth(null)*x),(int)(img.getHeight(null)*y)); 
    } 
} 

編輯:發佈錯誤的代碼前面。

+2

首先,**將問題簡化到顯示問題的**最小**代碼示例。我打賭上面90%的代碼與手頭的問題完全無關! (見http://sscce.org/...) –

回答

7

首先,發佈最小代碼示例總是一個好主意 - 尤其是在很多情況下,您會以這種方式自己發現您的錯誤。

但這次似乎相當明顯:

您應該添加的MouseListener在構造函數而不是每一次paintComponent被調用。否則,每次調用paintComponent方法時都會添加一個新的偵聽器,這對swing組件來說可能相當多(因爲JOptionPane可能隱藏了面板的某些部分,單擊ok將生成一個新的paintComponent調用,這意味着您已經擁有了一個無盡的循環)。

+0

感謝您的解決方案! – Noble