Изображение не отображается в JFrame - PullRequest
0 голосов
/ 04 июня 2018

Я пытаюсь сделать это уже час, и по какой-то причине я не могу показать свое изображение на холсте JFrame.Я погуглил много других вопросов, но ни один не может помочь.После ввода изображения в рамку мне нужно будет поместить текст поверх этого, но я могу сделать это, но я просто не могу показать изображение.Также обновлено.

import java.util.*;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import javax.swing.*;

public class Meme extends JPanel{
    public BufferedImage img;

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        Generate();
    }

    public static void Generate() {
        //Creating the frame
        JFrame mainframe = new JFrame("Meme");
        mainframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        mainframe.setSize(800, 800);
        mainframe.setVisible(true);
    }

    /**
     * @param g
     */
    @Override
    public void paint(Graphics g) {
        try {
            img = ImageIO.read(new File("pic.jpg"));
            g.drawImage(img, 50, 50, this);
        } catch (IOException e) {
        }
    }
}

1 Ответ

0 голосов
/ 05 июня 2018

Тьфу ... так много проблем в этом (коротком) единственном методе:

public void paint(Graphics g) {
    try {
        img = ImageIO.read(new File("pic.jpg"));
        g.drawImage(img, 50, 50, this);
    } catch (IOException e) {
    }
}
  1. Правильный метод для переопределения для любого JComponent (или его расширения как в JPanel)is paintComponent(Graphics).
  2. Любой переопределенный метод рисования должен немедленно вызвать супер метод, чтобы гарантировать, что BG и границы окрашены, поэтому стираются все ранее окрашенные элементы.
  3. Чтение изображения никогда не должно бытьвыполняется методом рисования, который предназначен только для рисования , а не для выполнения каких-либо «длительных» задач, таких как загрузка изображения.Переместите этот код в конструктор или метод Generate (который, кстати, должен быть в нижнем регистре с первой буквой, т.е. IE generate)
  4. Ресурсы приложения (например, изображение, которое, как я предполагаю, являетсянеотъемлемая часть приложения.) станет встроенным ресурсом к моменту развертывания, поэтому имеет смысл начать доступ к ним, как если бы они были, прямо сейчас. должен быть доступен по URL, а не по файлу.Смотрите информацию.страница для встроенного ресурса о том, как сформировать URL.
  5. } catch (IOException e) { } Кто-то выше сказал, что это кажется «глупым» - потому что это так.Код игнорирует или отбрасывает эти очень удобные трассировки стека, которые могут помочь объяснить непосредственную и наиболее актуальную проблему.Измените его на } catch (IOException e) { e.printStackTrace(); } для получения дополнительной информации.

Редактировать

Я только что заметил что-то еще, что может быть "не пошло" для этого кода.Метод Generate - это единственное, что вызывается из метода main.Ни при каких условиях он не создает Meme и не добавляет его в кадр!Что, черт возьми, вы ожидали, что появится в кадре?

Редактировать 2

Переделанный выше код переработан, чтобы включить приведенные выше предложения, а также еще пару. Не устраняет все потенциальные проблемы или включает все возможные оптимизации.

Это результат:

enter image description here

import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.*;
import java.net.*;
import javax.imageio.ImageIO;
import javax.swing.*;

public class Meme extends JPanel {

    public BufferedImage img;

    Meme() {
        /* This next statement is purely for debugging. If the GUI is not red 
         inside the frame decorations, something is very wrong. */
        setBackground(Color.RED);
        try {
            //img = ImageIO.read(new File("pic.jpg"));
            img = ImageIO.read(new URL("https://i.stack.imgur.com/7bI1Y.jpg"));
            generate();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        new Meme();
    }

    public void generate() {
        //Creating the frame
        JFrame mainframe = new JFrame("Meme");
        mainframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        mainframe.add(this);
        mainframe.setSize(600, 500);
        mainframe.setVisible(true);
    }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawImage(img, 50, 50, this);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...