Visualizzazione dei risultati da 1 a 3 su 3

Discussione: Problemi col repaint()

  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2010
    Messaggi
    7

    Problemi col repaint()

    Salve, sto realizzando un programmino che visualizza una serie di immagini.
    Nell'applicazione ci sono 4 pulsanti:
    caricaImmagine --> carica la prima immagine dell'elenco
    prevButton --> visualizza L'immagine precedente
    nextButton --> visualizza l'immagine successiva
    playButtom --> visualizza la sequenza di immagini
    Per disegnare nel pannello ho creato una classe ImagePanel che estende JPanel e ho sovrascritto il metodo PaintComponent
    Il mio problema è che quando premo uno dei tasti non mi modifica l'immagine del pannello.
    Ho provato ad utilizzare il metodo repaint ma con scarsi risultati.
    Vi posto il codice

    Frame Principale:
    package it.unisa.adinf.tesi;

    import javax.imageio.ImageIO;
    import javax.swing.*;

    import java.awt.*;
    import java.awt.event.*;
    import java.awt.image.BufferedImage;
    import java.io.File;
    import java.io.IOException;

    public class GestioneImmagini extends javax.swing.JFrame implements Runnable {

    private static final long serialVersionUID = 1L;

    {
    //Set Look & Feel
    try {
    javax.swing.UIManager.setLookAndFeel("javax.swing. plaf.metal.MetalLookAndFeel");
    } catch(Exception e) {
    e.printStackTrace();
    }
    }

    private JButton CaricaImmagine;
    static Graphics g;
    private static ImagePanel visualizzaImmagine;
    private String[] immagini= {"1","2","3","4","5","6"};
    private JButton zoomButton;
    private JButton nextButton;
    private JButton prevButton;
    private JButton playButton;
    private int i=0; //i e j mi servono per il comando play,prev e next
    private int j=0;
    private int stato=0; // 0 --> pause
    // 1 --> play
    Thread t;
    File file=null;

    /**
    * Auto-generated main method to display this JFrame
    */
    public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {
    public void run() {
    GestioneImmagini inst = new GestioneImmagini();
    inst.setLocationRelativeTo(null);
    inst.setVisible(true);
    }
    });
    }

    public GestioneImmagini() {
    super();
    setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
    initGUI();
    }

    private void initGUI() {
    // Inserisco i componenti nel frame
    try {
    setDefaultCloseOperation(WindowConstants.DISPOSE_O N_CLOSE);
    getContentPane().setLayout(null);
    {
    zoomButton = new JButton();
    getContentPane().add(zoomButton);
    zoomButton.setText("Zoom");
    zoomButton.setBounds(260, 376, 66, 26);
    zoomButton.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent evt) {
    zoomButtonActionPerformed(evt);
    }
    });
    zoomButton.setEnabled(false);
    }
    visualizzaImmagine = new ImagePanel();
    getContentPane().add(visualizzaImmagine);
    visualizzaImmagine.setBounds(25, 50,300,300);
    {
    nextButton = new JButton();
    getContentPane().add(nextButton);
    nextButton.setText("Next");
    nextButton.setBounds(195, 376, 60, 26);
    nextButton.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent evt) {
    nextButtonActionPerformed(evt);
    }
    });
    nextButton.setEnabled(false);
    }
    {
    playButton = new JButton();
    getContentPane().add(playButton);
    playButton.setText("Play");
    playButton.setBounds(121, 376, 74, 26);
    playButton.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent evt) {
    playButtonActionPerformed(evt);
    }
    });
    playButton.setEnabled(false);
    }
    {
    prevButton = new JButton();
    getContentPane().add(prevButton);
    prevButton.setText("Prev");
    prevButton.setBounds(61, 376, 60, 26);
    prevButton.setEnabled(false);
    prevButton.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent evt) {
    prevButtonActionPerformed(evt);
    }
    });
    }

    {
    CaricaImmagine = new JButton();
    getContentPane().add(CaricaImmagine);
    CaricaImmagine.setText("Carica Immagine");
    CaricaImmagine.setBounds(17, 21, 200, 23);
    CaricaImmagine.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent evt) {
    try {
    CaricaImmagineActionPerformed(evt);
    } catch (Exception e) {
    e.printStackTrace();
    }
    }
    });
    }
    {

    }
    pack();
    this.setSize(500, 500);
    } catch (Exception e) {
    e.printStackTrace();
    }
    }

    private void CaricaImmagineActionPerformed(ActionEvent evt) {
    i=0; // devo caricare sempre la prima immagine dell'elenco
    file= new File("C:/Users/Francesco/Documents/"+immagini[i]+".gif");
    if(file!=null){
    visualizzaImmagine = new ImagePanel(file);
    visualizzaImmagine.repaint(); qui ho il problema nextButton.setEnabled(true);
    playButton.setEnabled(true);
    prevButton.setEnabled(true);
    zoomButton.setEnabled(true);
    }else{
    JOptionPane.showMessageDialog(null, "Nessun file selezionato");
    }
    }

    private void prevButtonActionPerformed(ActionEvent evt) {
    if(i!=0){
    i--;
    file= new File("C:/Users/Francesco/Documents/"+immagini[i]+".gif");
    visualizzaImmagine = new ImagePanel(file);
    visualizzaImmagine.repaint();
    qui ho il problema
    }

    }

    }
    Gli altri 2 bottoni sono uguali e quindi non li posto.
    Classe ImagePanel
    import java.awt.*;
    import java.awt.image.*;
    import java.io.*;

    import javax.swing.*;
    import javax.imageio.*;
    public class ImagePanel extends JPanel {

    private static final long serialVersionUID = 1L;
    private BufferedImage image = null;
    public ImagePanel(){

    }
    public ImagePanel(File file) {
    super();
    try {
    image = ImageIO.read(file);
    }
    catch(IOException ioe) {
    ioe.printStackTrace();
    }
    catch(IllegalArgumentException iae) {
    image = null;
    }
    }
    @Override
    public void paintComponent(Graphics g) {
    super.paintComponents(g);
    if(image != null) {
    g.drawImage(image, 0, 0, image.getWidth(), image.getHeight(), null);
    }
    else {
    g.drawString("Inserire un'immagine", 100, 100);
    }
    }
    public int getLarghezza(){
    return image.getWidth();
    }
    public int getAltezza(){
    return image.getHeight();
    }

    }

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: Problemi col repaint()

    Originariamente inviato da palopo
    codice:
               visualizzaImmagine = new ImagePanel(file);
               visualizzaImmagine.repaint();
    Questo non è sbagliato di per sé .... solo che hai appena istanziato un nuovo oggetto ImagePanel e dovresti a) aggiungerlo nel tuo "contenitore" e b) visto che non hai usato un layout manager, posizionarlo/dimensionarlo con setBounds().
    Insomma .... solo istanziarlo e invocarci sopra repaint() .... non vuol dire nulla, finché non è "dentro" qualcosa e posizionato/dimensionato!!

    Ma è tuttavia solo uno dei possibili approcci ... che tra l'altro è pure più critico. Ora domandati ... perché devi per forza istanziare ogni volta un nuovo ImagePanel?
    Appunto ... potresti riusare sempre una sola istanza mettendo in ImagePanel un bel metodo

    public void setImageFile(File file)

    che si occuperebbe di: a) caricare la immagine, b) aggiornare il suo "stato" interno (variabili di istanza) e c) invocare repaint() per aggiornare a video la immagine.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2010
    Messaggi
    7
    Grazie mille....ora funziona benissimo!!!!!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.