Как вставить фотографию на jpanel [duplicate]

Добавить TRUE в json_decode () возможно, но он будет обрабатывать все.

Вам нужно изменить доступ к переменным.

, если ваш json выглядит это:

$return = '{"status":"ok","message":"","code":"200","data":{"1234":{"sid":1,"name":"foo"},"4321":{"sid":2,"name":"bar"}}}';

on:

$json_data = json_decode($return, true);
$data = $json_data['data'];

вы можете закодировать данные $ и получить доступ к значениям в виде массива: $ data [0] ['name']. ..

on:

$json_data = json_decode($return);
$data = (array) $json_data->data;

вы можете закодировать $ data и получить доступ к значениям как объекты: $ data [0] -> name ...

315
задан nachokk 9 January 2014 в 17:21
поделиться

13 ответов

Вот как я это делаю (немного больше информации о том, как загрузить изображение):

import java.awt.Graphics;
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.JPanel;

public class ImagePanel extends JPanel{

    private BufferedImage image;

    public ImagePanel() {
       try {                
          image = ImageIO.read(new File("image name and path"));
       } catch (IOException ex) {
            // handle exception...
       }
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawImage(image, 0, 0, this); // see javadoc for more info on the parameters            
    }

}
237
ответ дан Andrew Thompson 25 August 2018 в 04:24
поделиться

Вы можете полностью откатить свой собственный подкласс Component, используя класс JXImagePanel из бесплатных библиотек SwingX .

Загрузить

19
ответ дан bobndrew 25 August 2018 в 04:24
поделиться

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

31
ответ дан CoderTim 25 August 2018 в 04:24
поделиться

Этот ответ является дополнением к ответу @ shawalli ...

Я тоже хотел ссылаться на изображение в моей баночке, но вместо того, чтобы иметь BufferedImage, я просто сделал это:

 JPanel jPanel = new JPanel();      
 jPanel.add(new JLabel(new ImageIcon(getClass().getClassLoader().getResource("resource/images/polygon.jpg"))));
3
ответ дан Filipe de Lima Brito 25 August 2018 в 04:24
поделиться

Я могу видеть много ответов, не говоря уже о трех вопросах OP.

1) Слово о производительности: байт-массивы, скорее всего, неэффективны, если вы не можете использовать точный порядок байтов в пикселях, который соответствует текущее разрешение дисплея и глубина цвета.

Чтобы добиться наилучшего результата рисования, просто преобразуйте изображение в BufferedImage, который генерируется с типом, соответствующим вашей текущей графической конфигурации. См. CreateCompatibleImage в https://docs.oracle.com/javase/tutorial/2d/images/drawonimage.html

Эти изображения будут автоматически кэшироваться в памяти карты памяти после рисуя несколько раз без каких-либо усилий по программированию (это стандартно в Swing с Java 6), и поэтому фактический чертеж займет незначительное количество времени - , если вы не изменили изображение.

Изменение изображения будет сопровождаться дополнительной передачей памяти между основной памятью и памятью графического процессора - это медленно. Избегайте «перерисовывать» изображение в BufferedImage, поэтому избегайте делать getPixel и setPixel всеми способами.

Например, если вы разрабатываете игру, вместо того, чтобы рисовать всех участников игры в BufferedImage, а затем в JPanel, намного быстрее загружать всех участников как меньшие BufferedImages и нарисовать их по одному в вашем коде JPanel в правильном положении - таким образом, нет дополнительной передачи данных между основной памятью и памятью GPU, кроме начальной передачи изображений для кеширования.

ImageIcon будет использовать BufferedImage в капот - но в основном выделение BufferedImage с надлежащим графическим режимом является ключом, и нет никаких усилий, чтобы сделать это правильно.

2) Обычный способ сделать это для рисования BufferedImage в переопределенном методе paintComponent JPanel. Хотя Java поддерживает большое количество дополнительных преимуществ, таких как буферные цепочки, контролирующие VolatileImages, кэшированные в памяти GPU, нет необходимости использовать какие-либо из них, так как Java 6, которая делает достаточно хорошую работу, не подвергая все эти детали ускорения GPU.

Обратите внимание, что ускорение GPU может не работать для определенных операций, таких как растягивание полупрозрачных изображений.

3) Не добавлять. Просто нарисуйте его, как указано выше:

@Override
protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    g.drawImage(image, 0, 0, this); 
}

«Добавление» имеет смысл, если изображение является частью макета. Если вам нужно это в качестве фона или переднего плана, заполняющего JPanel, просто нарисуйте paintComponent. Если вы предпочитаете заваривать общий компонент Swing, который может показывать ваше изображение, то это одна и та же история (вы можете использовать JComponent и переопределить свой метод paintComponent), а затем добавить этот в макет компонентов GUI .

4) Как преобразовать массив в Bufferedimage

Преобразование байт-массивов в PNG, а затем загрузка его довольно ресурсоемкая. Лучше всего преобразовать существующий массив байтов в BufferedImage.

Для этого: не использовать для циклов и копировать пиксели. Это очень медленно. Вместо этого:

  • узнает предпочтительную структуру байтов BufferedImage (в настоящее время можно предположить, что RGB или RGBA, что составляет 4 байта на пиксель)
  • изучают строку сканирования и просматривают (например, у вас может быть изображение шириной 142 пикселя, но в реальной жизни, которое будет храниться в виде массива с байтами шириной 256 пикселей, поскольку это быстрее обрабатывать и маскировать неиспользуемые пиксели аппаратным обеспечением GPU)
  • , после того как вы создали массив в соответствии с этими принципами, метод массива setRGB BufferedImage может скопировать ваш массив в BufferedImage.
0
ответ дан Gee Bee 25 August 2018 в 04:24
поделиться

Вы можете подклассировать JPanel - вот выдержка из моего ImagePanel, которая помещает изображение в любое из 5 местоположений: верхнее / левое, верхнее / правое, среднее / среднее, нижнее / левое или нижнее / правое:

protected void paintComponent(Graphics gc) {
    super.paintComponent(gc);

    Dimension                           cs=getSize();                           // component size

    gc=gc.create();
    gc.clipRect(insets.left,insets.top,(cs.width-insets.left-insets.right),(cs.height-insets.top-insets.bottom));
    if(mmImage!=null) { gc.drawImage(mmImage,(((cs.width-mmSize.width)/2)       +mmHrzShift),(((cs.height-mmSize.height)/2)        +mmVrtShift),null); }
    if(tlImage!=null) { gc.drawImage(tlImage,(insets.left                       +tlHrzShift),(insets.top                           +tlVrtShift),null); }
    if(trImage!=null) { gc.drawImage(trImage,(cs.width-insets.right-trSize.width+trHrzShift),(insets.top                           +trVrtShift),null); }
    if(blImage!=null) { gc.drawImage(blImage,(insets.left                       +blHrzShift),(cs.height-insets.bottom-blSize.height+blVrtShift),null); }
    if(brImage!=null) { gc.drawImage(brImage,(cs.width-insets.right-brSize.width+brHrzShift),(cs.height-insets.bottom-brSize.height+brVrtShift),null); }
    }
6
ответ дан Lawrence Dol 25 August 2018 в 04:24
поделиться

Дорога Фреда Хаслама отлично работает. У меня были проблемы с файловой дорогой, хотя, поскольку я хочу ссылаться на изображение в моей банке. Для этого я использовал:

BufferedImage wPic = ImageIO.read(this.getClass().getResource("snow.png"));
JLabel wIcon = new JLabel(new ImageIcon(wPic));

Так как у меня есть только конечное число (около 10) изображений, которые мне нужно загрузить с использованием этого метода, он работает достаточно хорошо. Он получает файл без необходимости иметь правильный относительный путь к файлу.

32
ответ дан Lutske 25 August 2018 в 04:24
поделиться
  1. Не должно быть никаких проблем (кроме общих проблем, которые могут возникнуть с очень большими изображениями).
  2. Если вы говорите о добавлении нескольких изображений в одну панель, я будет использовать ImageIcon s. Для одного изображения я бы подумал о создании пользовательского подкласса JPanel и переопределения его метода paintComponent для рисования изображения.
  3. (см. 2)
7
ответ дан Michael Myers 25 August 2018 в 04:24
поделиться

Вы можете избежать использования собственных Component s и SwingX-библиотеки и класса ImageIO:

File f = new File("hello.jpg");
JLabel imgLabel = new JLabel(new ImageIcon(file.getName()));
0
ответ дан Muskovets 25 August 2018 в 04:24
поделиться

Если вы используете JPanels, то, вероятно, работают с Swing. Попробуйте следующее:

BufferedImage myPicture = ImageIO.read(new File("path-to-file"));
JLabel picLabel = new JLabel(new ImageIcon(myPicture));
add(picLabel);

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

495
ответ дан Pavel 25 August 2018 в 04:24
поделиться

Я делаю что-то очень похожее в частном проекте, над которым я работаю. До сих пор я сгенерировал изображения до 1024x1024 без каких-либо проблем (кроме памяти) и может отображать их очень быстро и без каких-либо проблем с производительностью.

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

Как я это делаю:

Class MapIcon implements Icon {...}

ИЛИ

Class MapIcon extends ImageIcon {...}

Код, который вы используете для создания изображения, будет в этом классе. Я использую BufferedImage для рисования, а затем, когда вызывается paintIcon (), используйте g.drawImvge (bufferedImage); Это уменьшает количество мигания, выполняемое во время создания изображений, и вы можете его нарезать.

Далее я расширяю JLabel:

Class MapLabel extends Scrollable, MouseMotionListener {...}

Это потому, что я хочу поместить свое изображение на панель прокрутки, I.e. отобразите часть изображения и попросите пользователя прокрутить по мере необходимости.

Итак, я использую JScrollPane для хранения MapLabel, который содержит только MapIcon.

MapIcon map = new MapIcon (); 
MapLabel mapLabel = new MapLabel (map);
JScrollPane scrollPane = new JScrollPane();

scrollPane.getViewport ().add (mapLabel);

Но для вашего сценария (просто покажите все изображение каждый раз). Вам необходимо добавить MapLabel в верхнюю часть JPanel и убедиться, что все они будут отображаться до полного размера изображения (путем переопределения GetPreferredSize ()).

5
ответ дан Thomas Jones-Low 25 August 2018 в 04:24
поделиться

JPanel почти всегда является неправильным классом для подкласса. Почему бы вам не подкласс JComponent?

Существует небольшая проблема с ImageIcon в том, что конструктор блокирует чтение изображения. Не проблема при загрузке из приложения, но может быть, если вы потенциально читаете сетевое соединение. Существует много примеров использования AWT-времени MediaTracker, ImageObserver и друзей даже в демонстрациях JDK.

5
ответ дан Tom Hawtin - tackline 25 August 2018 в 04:24
поделиться

Создайте исходную папку в каталоге проекта, в этом случае я назвал ее «Изображения».

JFrame snakeFrame = new JFrame();
snakeFrame.setBounds(100, 200, 800, 800);
snakeFrame.setVisible(true);
snakeFrame.add(new JLabel(new ImageIcon("Images/Snake.png")));
snakeFrame.pack();
3
ответ дан user 25 August 2018 в 04:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: