Domanda

dettagli:

metodo Repaint del mio oggetto JPanel non funziona quando viene chiamato dall'interno actionPerformed caso di mia classe principale. Funziona all'interno del metodo ImageViewer ImageViewer della classe principale, ma non funziona inide il metodo actionPerformed di questa classe.

Queste sono le parti essenziali del mio codice che non funzionano correttamente (parte riverniciatura):

Main Class:

/**
 * @(#)NeatImageViewer.java
 *
 * NeatImageViewer application
 *
 * @author
 * @version 1.00 2010/11/1
 */

import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import java.io.*;
import javax.imageio.*;
import javax.swing.*;


public class NeatImageViewer extends JFrame implements ActionListener {

    GraphicsPanel gp;

    NeatImageViewer() {
               //... window components ...
    }

    public static void main(String[] args) {

        NeatImageViewer niv = new NeatImageViewer();
        niv.setSize(500,500);
        niv.setLocationRelativeTo(niv);
        niv.setVisible(true);
    }

    public void actionPerformed(ActionEvent e) {
            //...
                gp = new GraphicsPanel();
                gp.img = img;
                gp.repaint(); //<!--- Not Working!
                this.add(gp);
            //...
    }

}

GraphicsPanel Classe:

/**
 * @(#)GraphicsPanel.java
 *
 *
 * @author
 * @version 1.00 2010/11/1
 */

import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import java.io.*;
import javax.imageio.*;
import javax.swing.*;


public class GraphicsPanel extends JPanel {
    BufferedImage img;

    GraphicsPanel() {
        super();
    }

    protected void paintComponent(Graphics g) {
        //paint method isn't executed???
        super.paintComponent(g);
        System.out.println("Paint!");
    }

}
È stato utile?

Soluzione

In altalena non si utilizza una tela. Non personalizzato pittura su un JPanel o JComponent e sovrascrivere il metodo paintComponent (...) come già detto. Leggi il tutorial Swing on personalizzato Pittura per ulteriori informazioni ed esempi di lavoro .

Inoltre, con swing non v'è alcuna necessità di creare un componenti personalizzati per mostrare un'immagine. Basta usare un JLabel con un'ImageIcon. Leggere la sezione "Come usare le icone".

Contrassegna il tutorial per tutte le basi Swing.

Modifica:

Quando si aggiunge un componente a una GUI visibile il codice di base dovrebbe essere:

panel.add( ... );
panel.revalidate();
panel.repaint();

Altri suggerimenti

Si deve ignorare paintComponent(Graphics g) invece di paint(Graphics g).
Così, il metodo che hai postato dovrebbe essere rinominato paintComponent.

EDIT:? Hai pack()'ed la cornice quando la vostra inizializzazione viene fatto

Modifica Il metodo repaint() non fa nulla quando il componente non è visibile. Quindi, si deve aggiungere che prima alla JFrame, pack() il telaio. Dopo imballaggio esso, riverniciatura non è più necessaria.

(Sono Skyfe ma da un altro IP in modo non è "collegato" e non poteva commento)

Mi dispiace, ma non ottengo quello che è il problema ???

ho offerto il mio codice e non è l'esecuzione della funzione paintComponent su chiamando riverniciare dal metodo actionPerformed. Basta copiare incollare il mio codice e compilarlo con un compilatore Java e non esegue il metodo paintComponent su esecuzione di un'azione che posso dire perché ho usato un metodo System.out.println () all'interno del metodo paint. E no che non dipinge nulla perché sto solo cercando di verificare se si chiama il metodo di vernice a tutti perché ho messo un output di sistema all'interno del metodo paintComponent che non viene eseguito quando si utilizza riverniciare. E 'stato solo un test e non ha funzionato.

Che cosa si intende per cui è lo SSCCE, questo è tutto il codice che ho. Ho compilato esattamente il codice che ho postato nel mio post principale e il problema con esso è che non mostra alcun output di sistema quando è stata eseguita l'azione (e l'evento è stato chiamato repaint). Non riesco a vedere ciò che manca nel mio post?

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