Форум программистов, компьютерный форум, киберфорум
Java: GUI, графика
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.76/25: Рейтинг темы: голосов - 25, средняя оценка - 4.76
0 / 0 / 0
Регистрация: 22.01.2017
Сообщений: 11

Вывести изображение BufferedImage на JPanel

10.02.2017, 22:34. Показов 5064. Ответов 3
Метки java (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте! Подскажите, пожалуйста, как вывести изображение из BufferedImage на JPanel.
Написал вот такую прогу чтобы разобраться, но, увы, не получилось :-(

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JScrollPane;
 
public class TestFrame extends JFrame {
     
    public static void createGUI() {
        //**********************Меню****************************
        JFrame frame = new JFrame("Test frame");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLayout(null) ;
        frame.setVisible(true);
        Font font = new Font("Verdana", Font.PLAIN, 11);
         
        JMenuBar menuBar = new JMenuBar();
         
        JMenu fileMenu = new JMenu("Файл");
        fileMenu.setFont(font);
         
        JMenuItem newMenu = new JMenuItem("Отобразить");
        newMenu.setFont(font);
        fileMenu.add(newMenu);
       
        JMenuItem exitItem = new JMenuItem("Выход");
        exitItem.setFont(font);
        fileMenu.add(exitItem);
        
        //***************************************************
        TestFrame myPanel = new TestFrame();
        myPanel.setLayout(new BorderLayout());
        myPanel.setPreferredSize(new Dimension(600, 400));
        //***************************************************
 
        
      //**********************Нажатие кнопок****************************
        
        newMenu.addActionListener(new ActionListener() {           
            public void actionPerformed(ActionEvent e) {
                
                //Graphics g = bufferImage.getGraphics();
                //Попытался вытянуть как-нибудь из класса GetImage:
                //g.drawImage(GetImage.OutputToScrn(img), 0, 0, this);
                //Попытался "обновить" чтобы отображалось сразу:
                //revalidate();
                //repaint();
                //}           
            }           
        });
        
        exitItem.addActionListener(new ActionListener() {           
            public void actionPerformed(ActionEvent e) {
                System.exit(0);             
            }           
        });
          
        menuBar.add(fileMenu);       
        frame.setJMenuBar(menuBar);
        frame.setPreferredSize(new Dimension(650, 450));
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
 
    public static void main(String[] args) {
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createGUI();
            }
        });
    }
}

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
 
public class GetImage {
    //Здесь, для примера, записывает из файла изображения
    public static BufferedImage OutputToScrn(){
        BufferedImage img = null;
        try {
            img = ImageIO.read(new File("D:\\work\\files\\logo.jpg"));
        } catch (IOException e) {
            e.printStackTrace();
        }
        return img;
    }   
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
10.02.2017, 22:34
Ответы с готовыми решениями:

Как привести изображение созданное на JPanel через Graphics2D к BufferedImage
Второй день ломаю голову и похоже что то упускаю: На JFrame создана JPanel(сanvasPanel), на панели через Graphics2D мышкой рисую линии ...

Вывести bmp изображение в JPanel
Приведите, пожалуйста, пример кода, как выводить bmp изображение на JPanel и потом на JFrame.

Стирается изображение в jPanel
Добрый вечер. Уже долгое время не получается оставить изображение на jPanel после его свертывания или перекрытия его другими окнами....

3
 Аватар для TurboDuck
50 / 49 / 13
Регистрация: 23.11.2015
Сообщений: 401
11.02.2017, 14:31
Используй JLabel, который размести на панель, где тебе удобно. Изображение в него загрузить можно, например так:

Java
1
jLabel1.setIcon(new javax.swing.ImageIcon(getClass().getResource("/images/Help.png")));
Удобно то, что путь получается относительный. В папке src в данном случае папка images, где и лежит картинка.

Так как используешь ты по абсолютному пути
Java
1
img = ImageIO.read(new File("D:\\work\\files\\logo.jpg"));
это не правильно и у тебя будут постоянно проблемы, например при переносе твой программы на другой компьютер, где нет этого файла по тому расположению. А вот как показано выше - при компиляции, ресурсы (картинки в том числе), которые были в src автоматически будут упакованы компилятором вместе с jar.
0
0 / 0 / 0
Регистрация: 22.01.2017
Сообщений: 11
12.02.2017, 14:01  [ТС]
Спасибо, что откликнулись на мою просьбу, однако:
В примере Вы сразу передаете в JLabel изображение по относительному пути.
Необходимо же чтобы в класс TestFrame (листинг 1) из класса GetImage (листинг 2) передавалось изображение BufferedImage и размещалось на JPanel (по нажатию кнопки меню, например).
Я написал путь, просто чтобы что-то передать, по сути не важно, каким образом я получу данные в GetImage (это может быть вообще массив пикселей, генерируемый внутри проги, или форма для выбора файла как в проводнике).
Вопрос в том как передать изображение.

Сначала у меня получилось что-то вроде:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
jPanel1 = new javax.swing.JPanel(){
    private String imgFile="picture.jpg";
 
    public void changePicture(String imgFile){
         this.imgFile=imgFile;
         repaint();
    }
 
    public void paint(Graphics g) {
        super.paint(g);
        try
        {
            Image img = ImageIO.read(new File(imgFile));
            g.drawImage(img, 5, 5, null);
        }
        catch(IOException ex)
        {
            Logger.getLogger(JFrame.class.getName()).log(Level.SEVERE,null, ex); 
        }
    }
}
 
...
jPanel1.changePicture("Pic1.jpg"); 
jPanel1.changePicture("Pic2.jpg");
Но возникает вопрос, как "впихнуть" подобный код в кнопку меню?
(чтобы читал из BufferedImage, которое передается из другого класса)
И следует ли мне обратиться к данным в BufferedImage как:
Java
1
GetImage.OutputToScrn(img);
Заранее спасибо за любую посильную помощь.
0
0 / 0 / 0
Регистрация: 22.01.2017
Сообщений: 11
18.02.2017, 16:08  [ТС]
Правильный вариант в студию
Вот код (может кому пригодится):
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
 
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
 
 
@SuppressWarnings("serial")
public class MyTestFrame extends JPanel {
    static BufferedImage img;
 
    public MyTestFrame() {
        super();  
        img = MyGetImage.OutputToScrn(img);
    }
    
    public void paintComponent(Graphics g)
    {
      g.drawImage(img, 0, 0, null);
      repaint();
    }
 
    public static void createGUI() {
        final JFrame frame = new JFrame("Test frame");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
        JMenuBar menuBar = new JMenuBar();  
        JMenu fileMenu = new JMenu("Файл");
 
        JMenuItem newMenu = new JMenuItem("Отобразить");
        fileMenu.add(newMenu);
        
        JMenuItem exitItem = new JMenuItem("Выход");
        fileMenu.add(exitItem);
        
        menuBar.add(fileMenu);  
        
        frame.setJMenuBar(menuBar);
        frame.setSize(new Dimension(650, 450));
        frame.setVisible(true);
 
        newMenu.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                frame.getContentPane().add(new MyTestFrame());
                frame.setSize(img.getWidth(), img.getHeight());
                
            }           
        });
        
        exitItem.addActionListener(new ActionListener() {           
            public void actionPerformed(ActionEvent e) {
                System.exit(0);             
            }           
        });
          
    }
 
    public static void main(String[] args) {
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createGUI();
            }
        });
    }
 
}
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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 MyGetImage {
    public static BufferedImage OutputToScrn(BufferedImage img){
        BufferedImage image = null;
        try {
            image = ImageIO.read(new File("airplane.bmp"));
        } catch (IOException e) {
            e.printStackTrace();
        }
        return image;
    }
        
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
18.02.2017, 16:08
Помогаю со студенческими работами здесь

Image -> BufferedImage изменяется изображение
Есть процедура которая возвращает Image объект, в данном случае это картинка с графом, само изображение чёрно-белое. Если я рисую этот...

Добавление JPanel на JPanel, не отображаются те, которые добавлены сверху
Здравствуйте. У меня есть панель fon на которой у меня картинка с фоном и 15 панелей на которых нарисованы шарики,пытаюсь добавить панели с...

Как правильно задать размер JPanel чтобы JFrame при pack() сжимался до размеров JPanel
Подскажите как правильно задать размер JPanel чтобы JFrame при pack() сжимался до размеров JPanel, задание размеров при помощи setSize...

Удаление JPanel кнопкой на этом же JPanel
Есть JPanel объекты, которые представляют собой панельки с какой - то информацией, на них есть кнопка. Как сделать так, чтобы при нажатии...

Замена JPanel на JPanel в JFrame
У меня есть 3 класса. Первый класс Main наследуется от JFrame и в конструкторе установка размера и добавление JPanel второго класса....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru