Как добавить изображение к JPanel?

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

8 ответов

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

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            
    }

}
246
ответ дан Andrew Thompson 23 November 2019 в 00:39
поделиться

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

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

способ, которым я делаю это:

Class MapIcon implements Icon {...}

ИЛИ

Class MapIcon extends ImageIcon {...}

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

Следующий я расширяю JLabel:

Class MapLabel extends Scrollable, MouseMotionListener {...}

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

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

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

scrollPane.getViewport ().add (mapLabel);

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

6
ответ дан Thomas Jones-Low 23 November 2019 в 00:39
поделиться

Можно разделить 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); }
    }
7
ответ дан Lawrence Dol 23 November 2019 в 00:39
поделиться

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

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

6
ответ дан Tom Hawtin - tackline 23 November 2019 в 00:39
поделиться

Можно постараться не прокручивать собственный подкласс Компонента полностью при помощи класса JXImagePanel от свободного библиотеки SwingX.

Загрузка

20
ответ дан bobndrew 23 November 2019 в 00:39
поделиться
  1. не должно быть никакой проблемы (кроме любых общих проблем, которые Вы могли бы иметь с очень большими изображениями).
  2. , Если бы Вы говорите о добавлении повторных изображений к единственной панели, я использовал бы ImageIcon с. Для единственного изображения я думал бы о создании пользовательского подкласса JPanel и переопределение paintComponent метод рисовать изображение.
  3. (см. 2)
8
ответ дан Michael Myers 23 November 2019 в 00:39
поделиться

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

33
ответ дан 23 November 2019 в 00:39
поделиться

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

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

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

513
ответ дан 23 November 2019 в 00:39
поделиться
Другие вопросы по тегам:

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