NOVINKA! E-learningové kurzy umělé inteligence. Nyní AI za nejlepší ceny. Zjisti více:
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

Diskuze: Pomoc s drawImage na JPanel

V předchozím kvízu, Online test znalostí Java, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
qwasyx0
Člen
Avatar
qwasyx0:16.1.2017 0:15

Zdravím,

snažím se naprogramovat Button na načtení obrázku pomocí JFileChooseru aby se zobrazil na JPanelu. Program mi ale hází NullPointerEx­ception.

 private void jButtonZmenitObrazekActionPerformed(java.awt.event.ActionEvent evt) {
         JFileChooser jfch = new JFileChooser();
        jfch.showOpenDialog(null);
        try {
         obrazek = ImageIO.read(jfch.getSelectedFile());
          paintComponent(g);
        } catch (IOException ex) {
            Logger.getLogger(JDialogKniha.class.getName()).log(Level.SEVERE, null, ex);
        }
}

public void paintComponent(Graphics g)
  {
    g.drawImage(obrazek, 0, 0, null);
    repaint();
  }

Chápu kde je problém - atribut obrazek který je na začátku nastaven na null je i po vybrání souboru stále null. Jak udělám, aby se mi obrazek nastavil na obrázek, který jsem vybral v JFileChooseru?

 
Odpovědět
16.1.2017 0:15
Avatar
wgamez101
Člen
Avatar
Odpovídá na qwasyx0
wgamez101:16.1.2017 7:56

Ahoj, problém bude asi v tom že ty načítavaš obrázok až po stlačení tlačidla, ale Swing volá metódú paintComponent už predtým (vlastne tú metódu volá kedy potrebuje, napr. pri zmenení veľkosti okna a pod.) čiže obrazek je null. Stačí ak pridáš podmienku ktorá kontroluje či je null. A to repaint by si na konci paintComponent nemal volať, a ani paintComponent by si nemal volať priamo ale namiesto neho použiť repaint na prekreslenie.

 private void jButtonZmenitObrazekActionPerformed(java.awt.event.ActionEvent evt) {
     JFileChooser jfch = new JFileChooser();
     jfch.showOpenDialog(null);
     try {
         obrazek = ImageIO.read(jfch.getSelectedFile());
         repaint();
     } catch (IOException ex) {
         Logger.getLogger(JDialogKniha.class.getName()).log(Level.SEVERE, null, ex);
     }
}

public void paintComponent(Graphics g) {
    if (obrazek != null)
        g.drawImage(obrazek, 0, 0, null);
}
Nahoru Odpovědět
16.1.2017 7:56
There are only two kinds of programming languages: those people always bitch about and those nobody uses. -- Bjarne...
Avatar
qwasyx0
Člen
Avatar
qwasyx0:16.1.2017 13:46

Opravil jsem to a už to nehází chybu, ale pořád mi to ten obrázek nenakreslí.
zkusil jsem i jPanelObrazek­.repaint(); (můj jPanel pro vykreslení obrázku) ale pořád je prázdný...

 
Nahoru Odpovědět
16.1.2017 13:46
Avatar
qwasyx0
Člen
Avatar
qwasyx0:16.1.2017 14:39

Moje třída JPanelObrazek, kterou jsem Drag-and-dropnul do JDialogKniha

public class JPanelObrazek extends javax.swing.JPanel {
    Image obrazek;

    /**
     * Creates new form PanelObrazek
     */
    public JPanelObrazek() {
initComponents();


    }

    public void setObrazek(Image img) {
        this.obrazek = obrazek;
    }

    public Image getObrazek() {
        return obrazek;
    }

JDialogKniha

 
Nahoru Odpovědět
16.1.2017 14:39
Avatar
qwasyx0
Člen
Avatar
qwasyx0:16.1.2017 15:47

Celý projekt

 
Nahoru Odpovědět
16.1.2017 15:47
Avatar
wgamez101
Člen
Avatar
Odpovídá na qwasyx0
wgamez101:16.1.2017 16:07

JDialog nemá paintComponent metódu, takže na vykreslenie použi metódu paint nejako takto:

public void paint(Graphics g)  {
    super.paint(g);     // aby sa vykreslilo aj samotne okno
    if (obrazek != null)
        g.drawImage(obrazek, 0, 0, null);
}
Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
Nahoru Odpovědět
16.1.2017 16:07
There are only two kinds of programming languages: those people always bitch about and those nobody uses. -- Bjarne...
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 6 zpráv z 6.