Odrysowanie obrazka w JPanel

0

Witam, piszę prostą przeglądarkę plików graficznych, jak na razie coś tam chodzi, jednak problem pojawił się w odrysowaniu kolejnych obrazków. Plik do wczytania wybieram poprzez komponent JFileChooser (który jest częścią mojej klasy FileChooser), następnie plik ten jest przekazywany do klasy LoadImage (rysuje ona ten obrazek), a następnie obrazek ten jest wyświetlany w klasie Viewer (główna klasa). Problem w tym, że po uruchomieniu programu tylko za pierwszym razem jak wybieram plik to jest on wczytywany do JPanelu, każdy następny obrazek nic nie zmienia. Używam metody repaint(), jednak może w złym miejscu? Oto kody poszczególnych klas. Pozdrawiam !

Klasa FileChooser:

public class FileChooser extends JDialog //implements ActionListener {
{
    private JFileChooser fc;
    private File file;    

    public FileChooser(JFrame frame) {   
        fc = new JFileChooser();
        int returnVal = fc.showDialog(FileChooser.this, "Otwórz");
        
        if (returnVal == JFileChooser.APPROVE_OPTION) {
            file = fc.getSelectedFile();
            } 
    }

    public File getFile(){ return file; }
}  

Klasa LoadImage:

 

public class LoadImage extends JComponent {
    BufferedImage img;
    File file;
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawImage(img, 0, 0, 700, 550, null);
    }

    public LoadImage(File file) {
        if (file == null) { return; }
        try { img = ImageIO.read(file); }
        catch (IOException e) { e.printStackTrace(); }
    }
} 

Fragment klasy Viewer, odpowiedzialny za wyświetlanie obrazka:

 
menuFileOpen.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent event) {
    fc = new FileChooser(frame);
    fileImage = fc.getFile();
    image = new LoadImage(fileImage);
    infoArea.setText(fileImage.getName());
    mainPanel.add(image);
    mainPanel.repaint();
    }
 });   
menuFile.add(menuFileOpen); 
0

Jakieś pomysły?

0

Może użyj Canvas i rysuj na nim "z zewnątrz", albo użyj JLabel i zmieniaj w nim parametr "icon".

0

Ani wielkiego doświadczenia ani umiejętności w programowaniu nie posiadam, ale wydaje mi się, że błąd tkwi w tym, że za każdym razem tworzysz nowy obiekt typu LoadImage do panela i odrysowujesz panel. Przypuszczam, że po kilku wczytaniach masz w swoim panelu kilka obiektów LoadImage, tyle że widać tylko ten pierwszy, a reszta jest gdzieś z boku poza obszarem widoczności. Zamiast tworzyć nowe obiekty LoadImage powinieneś tylko odrysować ten pierwszy z nowym obrazkiem, czyli repaint() wywołaj dla obiektu LoadImage.

0

Problem rozwiązany, wystarczyło dopisac do klasy LoadImage metodę podmieniającą nazwę wczytywanego pliku, a w klasie Viewer wywoływać tą metodę z plikiem zwrócenoym przez klase FileChooser, a następnie wywołać repaint na mainPanel.
Dzięki za wszystkie odpowiedzi, pozdrawiam !

1 użytkowników online, w tym zalogowanych: 0, gości: 1