2009-08-13 8 views
2

Lorsque j'utilise le JFileChooser dans mon projet sur lequel je travaille, tout fonctionne comme s'il était supposé fonctionner sans aucun problème, sauf un. Lorsque vous cliquez sur "Ouvrir" dans la boîte de dialogue, cela change mon arrière-plan, puis la boîte de dialogue JFileChooser s'ouvre à nouveau. Quelqu'un pourrait-il me dire ce que je dois faire pour que cela n'arrive pas?Java JFileChooser s'ouvre après avoir cliqué sur Ouvrir dans la boîte de dialogue du sélecteur

est ici toute ma source ci-dessous ..


import javax.swing.*; 
import java.awt.*; 
import java.awt.event.*; 
import java.io.*; 
import java.net.*; 
import java.util.*; 
import org.w3c.dom.*; 
import javax.xml.parsers.DocumentBuilder; 
import javax.xml.parsers.DocumentBuilderFactory; 

public class COS extends JPanel implements ActionListener{ 
    static JFrame f=new JFrame(); 
    static Image bgImage=null; 
    static String message=""; 
    JButton chbg=new JButton("change background"); 
    public COS(){ 
    } 
    public void paintComponent(Graphics g){ 
     if(bgImage!=null){ 
      g.drawImage(bgImage,0,0,this); 
      chbg.setBounds(10,10,150,25); 
      chbg.addActionListener(this); 
      add(chbg); 
     } 
     else{ 
      g.drawString(message,40,40); 
     } 
    } 
    public static void loadbg(){ 
     try{ 
      String xmlpath="background.xml"; 
      DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance(); 
      try{ 
       String fimg=""; 
       DocumentBuilder db=dbf.newDocumentBuilder(); 
       Document dom=db.parse(xmlpath); 
       dom.getDocumentElement().normalize(); 
       NodeList ndlst=dom.getElementsByTagName("background"); 
       Node firstnd=ndlst.item(0); 
       if(firstnd.getNodeType()==Node.ELEMENT_NODE){ 
        Element firstele=(Element)firstnd; 
        NodeList firstnamenodelist=firstele.getElementsByTagName("bgimage"); 
        Element firstnamele=(Element)firstnamenodelist.item(0); 
        NodeList firstname=firstnamele.getChildNodes(); 
        fimg=((Node) firstname.item(0)).getNodeValue(); 
       } 
       getFileImage(fimg); 
      } catch(Exception e){ 
      } 
     } catch(Exception e){ 
      message="File load failed: "+e.getMessage(); 
     } 
    } 
    public static void getFileImage(String filein) throws IOException, InterruptedException{ 
     FileInputStream in=new FileInputStream(filein); 
     byte[] b=new byte[in.available()]; 
     in.read(b); 
     in.close(); 
     bgImage=Toolkit.getDefaultToolkit().createImage(b); 
    } 
    public void actionPerformed(ActionEvent e){ 
     Object source=e.getSource(); 
     JFileChooser jfc=new JFileChooser(); 
     if(source==chbg){ 
      int returnVal=jfc.showOpenDialog(null); 
      if(returnVal==JFileChooser.APPROVE_OPTION){ 
       File file=jfc.getSelectedFile(); 
       String fileone=file.getName(); 
       changebg(fileone); 
      } 
     } 
    } 
    public void changebg(String filein){ 
     try{ 
      getFileImage(filein); 
      saveDefaultImage(filein); 
      repaint(); 

     } catch(IOException e){ 
     } catch(InterruptedException ie){ 
     } 
    } 
    public void saveDefaultImage(String filein){ 
     String newdefbg=filein; 
     //don't mind this method, i am still working on it... 
    } 
    public static void main(String[] args){ 
     COS newcos=new COS(); 
     loadbg(); 
     f.setSize(825,640); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.getContentPane().setLayout(null); 
     newcos.setBounds(5,5,800,600); 
     f.setLocation(10,5); 
     f.getContentPane().add(newcos); 
     f.setVisible(true); 
    } 
} 

Répondre

3

Tout simplement parce que vous ajoutez un nouveau écouteur d'action avec tous les repeindre. La méthode de peinture est seulement pour la peinture et rien d'autre. Vous devez repenser votre stratégie.

+0

qui n'a pas aidé, quand je prends repaint() de la méthode changebg le JFileChooser agit toujours le même exact. –

+2

Non, il signifie déplacer l'appel .addActionListener() vers le constructeur plutôt que vers la méthode paintComponent(). Vous continuez d'ajouter de plus en plus d'instances de 'ceci' à la liste d'écoute des actions du bouton et ainsi elles sont appelées de manière séquentielle. Ajoutez seulement l'écouteur une fois par instance. –

+0

oooh, je vois, merci =] –

Questions connexes