2012-04-28 3 views
1

Я пытаюсь загрузить изображение в JPanel с помощью JFileChooser. Но когда я пытаюсь запустить программу и загружать выбранное изображение, ничего не происходит в JPanel. Я прилагаю фрагмент исходного кода здесь:Загрузка изображений в JPanel с помощью JFileChooser

JFileChooser fileChooser = new JFileChooser(); 
fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY); 
FileFilter filter = new FileNameExtensionFilter("Image files","jpeg","jpg"); 
fileChooser.setFileFilter(filter); 
int result = fileChooser.showOpenDialog(null);  
if(result == fileChooser.APPROVE_OPTION){ 
imgFile = fileChooser.getSelectedFile();//imgFile is File type  
try{ 
    myPicture = ImageIO.read(imgFile);//myPicture is BufferedImage 
    JLabel picLabel = new JLabel(new ImageIcon(myPicture)) ; 
    imagePanel.add(picLabel); 
    imagePanel.repaint(); 
    System.out.println("You have selected "+imgFile); 
    }catch(Exception e){ 
     e.printStackTrace(); 
    } 
    } 

} 

Может ли кто-нибудь пролить свет на это?

+0

Для лучшей помощи раньше, опубликовать [SSCCE] (http://sscce.org/). * "после того, как .. сдвинулся с места. Как ограничить это (?)" * Макеты. Больше информации. когда я вижу SSCCE. –

+0

@ user976754: Вы можете использовать приведенный ниже пример [здесь] (http://stackoverflow.com/a/10362719/230513) в качестве основы вашего [sscce] (http://sscce.org/). – trashgod

ответ

0

Почему вы не пытаетесь использовать компонент краски?

class imagePanel extends JPanel 
{ 
    BufferedImage image; 
    public void paintComponent(Graphics g) 
    { 
    super.paintComponent(g); 
    if(image != null) 
    { 
     g.drawImage(image, 0, 0, this); 
    } 
    } 
} 
+0

На самом деле imagePanel является объектом JPanel. Я могу вызвать метод paintComponent, но что будет аргументом для Graphics g в нем .... – user976754

0

Для этого может быть несколько причин. Вы можете попробовать

imagePanel.invalidate() 

перед вызовом repaint, чтобы заставить его перерисовать.

Возможно, этикетка невелика и требует изменения размера, поскольку раньше не было изображения. Вы можете попытаться вызвать

frame.pack(); 

Метод получения кадра для пересчета размеров его компонентов.

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

+0

Спасибо, оба метода работают, и я могу загрузить изображение. Но проблема в том, что я добавил две панели в свой кадр. Я хочу загрузить изображение в пределах рамки imagePanel. но здесь, после загрузки изображения, вторая панель сдвигается от своего положения, а изображениеPanel занимает наибольшее положение кадра. Как это ограничить. – user976754

+0

всегда сложно найти макеты. вы можете использовать заданный максимальный размер на одной из 1-й панели, чтобы предотвратить слишком много сдвига и поместить панель изображения внутри jscrollpane - это означало бы, если изображение станет слишком большим, это приведет к появлению полос прокрутки. Или вы можете загрузить изображение заполнителя на 1-ю панель, прежде чем пользователь отобразит изображение, чтобы gui не двигался, когда один из них выбран, и снова используйте jscrollpane, если пользователь выбирает слишком большое изображение (иначе уменьшите его, используя некоторые java-библиотеки) –

2

Проблема в том, что я добавил две панели в свой кадр.

Вы могли бы сравнить то, что вы делаете с этим полным example, который использует две панели: выбор файлов слева и индикаторную панель справа.

1

Я думаю, что это может помочь вам ...

Object selectedItem = jComboBox14.getSelectedItem(); 
ImageIcon picturetoInsert = new ImageIcon(selectedItem.toString()); 
JLabel label = new JLabel("", picturetoInsert, JLabel.CENTER); 
JPanel panel = new JPanel(new GridLayout(1, 1)); 
panel.add(label, BorderLayout.CENTER); 
jInternalFrame22.getContentPane(); 
jInternalFrame22.setContentPane(panel); 
jInternalFrame22.setVisible(true); 
Смежные вопросы