Проблемы с добавлением фонового изображения в JFrame в Netbeans 7.0 - PullRequest
2 голосов
/ 19 июля 2011

Это мой первый вопрос, поэтому, пожалуйста, потерпите меня.

Я работаю над приложением (которое я уже полностью разработал). Сейчас я нахожусь на этапе кодирования, и у меня возникают проблемы с размещением фонового изображения на JFrame, хотя я все еще позволяю ему играть роль Контейнера, поэтому я могу надевать на него кнопки и тому подобные вещи.

Я создал этот файл класса JFrame в Netbeans 7.0, и если бы кто-нибудь мог сказать мне, как сделать это через интерфейс Netbeans, это было бы здорово (если нет, просто код был бы в порядке).

Я уже знаю, что должен переопределить метод paintComponent (что я уже сделал, но мой файл изображения не отображается). Кроме того, у меня есть второй вопрос, я не хочу указывать полный путь к файлу изображения, у меня есть исходные файлы в пакетах, и теперь я совершенно не понимаю, куда мне поместить файлы изображений.

EDIT: initComponoents () - это метод, сгенерированный Netbeans, который определяет свойства JFrame.

public class TinyTowerOrganizerInterface extends javax.swing.JFrame {

/** Creates new form TinyTowerOrganizerInterface */
    Image backgroundImage = Toolkit.getDefaultToolkit().getImage("D:/Java/TinyTowerOrganizer/Images/Background.jpg");

public TinyTowerOrganizerInterface() throws IOException {

    initComponents(); 
    class BackgroundPanel extends javax.swing.JPanel{
        private Image image;
        public BackgroundPanel(Image image){
            this.image = image;
        }
        @Override
        public void paintComponent(Graphics g){
            super.paintComponent(g);
            g.drawImage(image, 0, 0, null);

        }

    }

}

@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {

    setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
    setTitle("Tiny Tower Organizer");
    setFont(new java.awt.Font("Pixelated", 0, 18)); // NOI18N
    setMinimumSize(new java.awt.Dimension(900, 500));
    setName("frame"); // NOI18N
    setResizable(false);
    setUndecorated(true);

    javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
    getContentPane().setLayout(layout);
    layout.setHorizontalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGap(0, 900, Short.MAX_VALUE)
    );
    layout.setVerticalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGap(0, 500, Short.MAX_VALUE)
    );

    pack();
}


public static void main(String args[]) {
    java.awt.EventQueue.invokeLater(new Runnable() {

        @Override
        public void run() {
            try {
                new TinyTowerOrganizerInterface().setVisible(true);
            } catch (IOException ex) {
                Logger.getLogger(TinyTowerOrganizerInterface.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    });
}

1 Ответ

3 голосов
/ 19 июля 2011

Я уже знаю, что должен переопределить метод paintComponent

JFrame не имеет метода paintComponent (...).

Вместо этого вы должны расширить JPanel (или JComponent) и добавить свою собственную картину в метод paintComponent (). Затем вы добавляете панель в рамку.

Кроме того, не забудьте переопределить метод getPreferredSize () панели, чтобы вернуть размер изображения.

Edit:

Прежде всего, когда вы отправляете код, отправьте SSCCE , чтобы мы могли скопировать и выполнить код. Я включил простой SSCCE ниже.

Существуют разные проблемы.

Первая проблема заключается в том, что метод getImage () считывает изображение асинхронным, поэтому при отображении фрейма изображение загружается не полностью и нечего отображать, как вы можете видеть при запуске кода. Вместо этого используйте ImageIO, чтобы прочитать изображение.

Что я даже хочу достичь

Когда вы сделаете указанное выше изменение и запустите код, вы все равно увидите только маленький кадр, даже если pack () был вызван. Это потому, что вы не добавили никаких компонентов в панель, поэтому предпочтительный размер по умолчанию (10, 10), потому что вы используете FlowLayout. Поэтому вам нужно переопределить метод getPreferredSize (), чтобы вернуть размер изображения, чтобы панель могла быть правильно упакована.

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

public class MyApplication extends javax.swing.JFrame
{

/** Creates new form MyApplication */
    Image backgroundImage = Toolkit.getDefaultToolkit().getImage("mong.jpg");

    public MyApplication() throws IOException
    {

        this.setContentPane(new JPanel()
        {

            @Override
            public void paintComponent(Graphics g)
            {
                super.paintComponent(g);
                g.drawImage(backgroundImage, 0, 0, null);
            }
        });

        pack();
        setVisible(true);
    }


    public static void main(String[] args)
        throws Exception
    {
        new MyApplication();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...