2011-09-04 113 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