Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Добавление картинки на JFrame 
:(
    Опции темы
batigoal
Дата 8.6.2006, 09:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нелетучий Мыш
****


Профиль
Группа: Участник Клуба
Сообщений: 6423
Регистрация: 28.12.2004
Где: Санктъ-Петербургъ

Репутация: 24
Всего: 151



Добавление картинки на JFrame.

Задача программиста заключается не только в создании эффективной, но и элегантной и понятной пользователю программы. Не мало важную роль при этом несет графический интерфейс. Не для кого не секрет, что человек усваивает графическую информацию быстрее чем текстовую. Рисунки на форме помогают украсить интерфейс программы. А также сделать его более понятным. Данная статья посвящена добавлению рисунков на фрёйм с компонентами.

Способ 1.  Добавление картинки с использованием JLabel.

Это вероятно самый простой способ, но в тоже время не самый гибкий, поскольку все управление за отображение рисунком возлагается  на плечи JLabel.

Чтобы добавить рисунок на JLabel существуют следующие методы.
    setIcon(Icon image); 
Конструкторы
    JLabel(Icon image);
    JLabel(Icon image, int horizontalAlignment);
    JLabel(String text, Icon icon, int horizontalAlignment);
 
здесь: 
Icon image - добавляемая картинка. Она может быть без труда создана например след. образом: new javax.swing.ImageIcon("C:\\Documents and Settings\\All Users\\Документы\\Мои рисунки\\Образцы рисунков\\Водяные лилии.jpg");
String text - текст метки.
int horizontalAlignment - тип горизонтального выравнивания. Может принимать след. значения:
javax.swing.SwingConstants.CENTER - по центру,
javax.swing.SwingConstants.LEFT - по левому краю,
javax.swing.SwingConstants.RIGHT - по правому краю.

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

Пример использования: 
Код

public class LablePictureFrame extends javax.swing.JFrame {
    
    public LablePictureFrame() {
        initComponents();
    }
    
    private void initComponents() {
        jLabel1 = new javax.swing.JLabel();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        jLabel1.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        jLabel1.setIcon(new javax.swing.ImageIcon(getClass().getResource("/MoonCat.gif")));
        jLabel1.setText("Foreign Cat!!!");
        jLabel1.setBorder(new javax.swing.border.LineBorder(new java.awt.Color(102, 102, 102), 1, true));
        getContentPane().add(jLabel1, java.awt.BorderLayout.CENTER);

        pack();
    }
    
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new LablePictureFrame().setVisible(true);
            }
        });
    }
    
    private javax.swing.JLabel jLabel1;
}


Способ 2. Создание JPanel c возможностью добавления картинки в качестве фона.

Этот способ более гибкий, и практически ограничивается только нашей фантазией. Он заключается в том, что мы напишем подкласс для класса JPanel и переопределим его метод public void paint(Graphics g). Реализация нашего метода будет производить прорисовку картинки на панели. Более того, мы будем управлять размерами изображения, и подстраивать (вписывать) его под размеры JPanel. Но и это еще не все: Мы оставим возможность добавления дочерних компонентов на эту панель, и у нас получится что-то компоненты размещаются на "красивом" фоне. 

Вот пример такой панели: 
Код

import java.awt.Graphics;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;

public class PicturePanel extends javax.swing.JPanel {
    // Храним 2 изображения: оригинальное и текущее.
    // Оригинальное используется для получения текущего в зависимости от размеров панели.
    // Текущее непосредственно прорисовывается на панели.
    private BufferedImage originalImage = null;
    private Image image = null;

    public PicturePanel() {
        initComponents();
    }
    
    private void initComponents() {
        setLayout(null);
        addComponentListener(new java.awt.event.ComponentAdapter() {
            public void componentResized(java.awt.event.ComponentEvent evt) {
                formComponentResized(evt);
            }
        });

    }
    
    // Реакция на изменение размеров панели - изменение размера изображения.
    private void formComponentResized(java.awt.event.ComponentEvent evt) {
        int w = this.getWidth();
        int h = this.getHeight();
        if ((originalImage != null) && (w > 0) && (h > 0)) {
            image = originalImage.getScaledInstance(w, h, Image.SCALE_DEFAULT);
            this.repaint();
        }
    }

    // Берем прорисовку в свои руки.
    public void paint(Graphics g) {
        // Рисуем картинку
        if (image != null) {
            g.drawImage(image, 0, 0, null);
        }
       
        // Рисуем подкомпоненты.
        super.paintChildren(g);
        // Рисуем рамку        
        super.paintBorder(g);
    }
    
    // Методы для настройки картинки.
    public BufferedImage getImage() {
        return originalImage;
    }
    
    public void setImage(BufferedImage image) {
        this.image = image;
    }

    public void setImageFile(File imageFile) {
        try {
            if (imageFile == null) {
                originalImage = null;
            }
            BufferedImage bi = ImageIO.read(imageFile);
            originalImage = bi;
        } catch (IOException ex) {
            System.err.println("Неудалось загрузить картинку!");
            ex.printStackTrace();
        }
        repaint();
    }
}


А вот пример её использования:

Код

public class PanelPictureFrame extends javax.swing.JFrame {
    
    public PanelPictureFrame() {
        initComponents();
    }
    
     private void initComponents() {
        picturePanel1 = new PicturePanel();
        jPanel1 = new javax.swing.JPanel();
        jLabel1 = new javax.swing.JLabel();
        jButton1 = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        picturePanel1.setLayout(new java.awt.BorderLayout());

        picturePanel1.setImageFile(new java.io.File("C:\\Documents and Settings\\All Users\\Документы\\Мои рисунки\\Образцы рисунков\\Зима.jpg"));
        jPanel1.setLayout(new java.awt.GridLayout());

        jPanel1.setOpaque(false);
        jLabel1.setFont(new java.awt.Font("Tahoma", 0, 24));
        jLabel1.setForeground(new java.awt.Color(255, 0, 0));
        jLabel1.setText("\u042d\u0442\u043e JLabel");
        jPanel1.add(jLabel1);

        jButton1.setText("\u0410 \u044d\u0442\u043e \u043a\u043d\u043e\u043f\u043a\u0430!");
        jPanel1.add(jButton1);

        picturePanel1.add(jPanel1, java.awt.BorderLayout.NORTH);

        getContentPane().add(picturePanel1, java.awt.BorderLayout.CENTER);

        pack();
    }
    
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new PanelPictureFrame().setVisible(true);
            }
        });
    }

    private javax.swing.JButton jButton1;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JPanel jPanel1;
    private PicturePanel picturePanel1;
}


Надеюсь что данная статья будет Вам полезна. На все вопросы постараюсь ответить.
С Уважением MoonCat. 




--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
LSD
Дата 23.4.2008, 11:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15717
Регистрация: 24.3.2004
Где: Dublin

Репутация: 209
Всего: 537



Спасибо SoulKeeper за дополнение.

В результате тестов с использованием картинки размером 1024x768 и увеличении панели до 10000x10000 панелька №2 требовала не много не мало, 438 мб памяти smile В это же время IntelliJ IDEA открывала эту картинку и делала максимальный зум без значительного потребления памяти. Что заставило задуматся над эфективностью алгоритма.

В результате, как всегда, все оказалось проще простого smile

Панелька:
Код

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

public class ImagePanel extends JPanel {

    private Image image;

    public Image getImage() {
        return image;
    }

    public void setImage(Image image) {
        this.image = image;
    }

    public void paintComponent(Graphics g) {
        super.paintComponent(g);

        if(image != null){
            g.drawImage(image, 0, 0, getWidth(), getHeight(), null);
        }
    }
}



Тест панельки:
Код

import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.io.File;
import java.io.IOException;

public class TestPicture {

    public static void main(String[] args) {

        JFrame f = new JFrame();
        f.setTitle("My Panel");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        ImagePanel pp = new ImagePanel();
        pp.setLayout(new BorderLayout());
        try {
            pp.setImage(ImageIO.read(new File("picture.jpg")));
        } catch (IOException e) {
            e.printStackTrace();
        }


        JPanel panel = new JPanel();
        panel.setLayout(new java.awt.GridLayout());
        panel.setOpaque(false);

        JLabel label = new JLabel();
        label.setFont(new java.awt.Font("Tahoma", 0, 24));
        label.setForeground(new java.awt.Color(255, 0, 0));
        label.setText("\u042d\u0442\u043e JLabel");
        panel.add(label);

        JButton button = new JButton();

        button.setText("\u0410 \u044d\u0442\u043e \u043a\u043d\u043e\u043f\u043a\u0430!");
        panel.add(button);

        pp.add(panel, java.awt.BorderLayout.NORTH);


        pp.setPreferredSize(new Dimension(10000, 10000));
        f.add(new JScrollPane(pp));

        f.pack();
        f.setSize(800, 600);
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }
}



--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0637 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.