在选择器对话框中单击“打开”后,Java JFileChooser将打开

时间:2009-08-13 16:10:31

标签: java swing

当我在我正在处理的项目中使用JFileChooser时,一切正常,除了一个之外,它应该完全没有任何问题。

当您在对话框中单击“打开”时,它会更改我的背景,然后再次打开JFileChooser对话框。谁能告诉我我需要做些什么才能让它不会发生?

以下是我的所有来源..


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

1 个答案:

答案 0 :(得分:3)

只是因为每次重绘都会添加新的动作侦听器。 绘画方法仅适用于绘画而不是其他任何内容。你必须重新考虑你的策略。