Domanda

Ok, non so perché sta succedendo questo, ma quando si preme il pulsante di chiusura, il JOptionPane non si chiude. Si continuano ad apparire di nuovo e ho bisogno di cliccare più volte per chiuderla.

Ecco il codice 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{

        }   

        }

    });

Il codice completo

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));
    }
}

Modificato:. codice errato Pubblicato in precedenza

È stato utile?

Soluzione

Prima di tutto è sempre una grande idea di inviare un esempio di codice minima -. Soprattutto perché in molti casi si può trovare l'errore in quel modo

Ma questa volta sembra abbastanza ovvio:

Si dovrebbe aggiungere il mouseListener nel costruttore e non ogni volta paintComponent si chiama. In caso contrario, si aggiunge una nuova ogni ascoltatore il metodo paintComponent viene chiamato, che può essere un bel po 'per un componente Swing (anche perché la JOptionPane probabilmente nasconde parti del pannello, facendo clic su OK genererà una nuova chiamata paintComponent Il che significa che hai un loop infinito lì).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top