2015-06-12 3 views
-1

Я новичок в Java, и я пытаюсь создать JFrame с JPanel внутри и изображение внутри JLabel. Затем, добавив JLabel в JPanel, он должен работать правильно? Тем не менее, это так, как это сделано на docs.oracle.com ...Добавление изображения в JPanel в JLabel

Это код:

import java.awt.BorderLayout; 
    import java.awt.event.ActionEvent; 
    import java.awt.event.ActionListener; 
    import javax.swing.*; 

    public class Interface { 

     private JPanel panel; 
     private JPanel buttonPane; 
     private JLabel label; 
     private JLabel label2; 
     private JTextField textfield; 
     private JTextField textfield2; 
     private JTextField textfield3; 
     private JTextField textfield4; 
     private JTextField textfield5; 
     private JButton button; 
     private JButton button2; 
     private JButton button3; 
     private JButton button4; 
     private JButton button5; 
     private JButton button6; 

     public static void main(String[] args) { 
      new Interface(); 
     } 

     public Interface() { 
      JFrame frame = new JFrame("Vormen"); 
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      frame.setSize(600, 300); 
      frame.setLocationRelativeTo(null); 

      panel = new JPanel(); 
      buttonPane = new JPanel(); 
      button = new JButton("cirkel"); 
      button.addActionListener(new ActionListener() { 
       @Override 
       public void actionPerformed(ActionEvent e) {  
    JLabel label3 = new JLabel(new ImageIcon("images/cirkel.png")); 
      panel.add(label3); 
      panel.revalidate(); 
      panel.repaint(); 
     buttonPane.add(button); 
     buttonPane.add(button2); 
     buttonPane.add(button3); 


     frame.add(buttonPane, BorderLayout.NORTH); 
     frame.add(panel); 
     frame.setVisible(true); 

    } 
} 
+0

Мой первый думаю, что ваше приложение не может получить доступ изображения/cirkel.png файл. Используйте абсолютный путь, чтобы убедиться, что он найдет его или даже лучше найдет учебник о ресурсах и о том, как справиться с ними. Затем поместите этот файл в качестве ресурса в ваше приложение. – DejanLekic

+0

Извините, не понимал, что вы добавляете компоненты изображения в ActionListener - ваши ошибочные отступы отбросили меня (пожалуйста, исправьте это). Для этого вам лучше добавить компоненты, а именно JLabel в основной графический интерфейс в начале, а затем просто установить свой значок в ActionListener. Если вы уже знаете размер изображения при запуске приложения, часто рекомендуется установить ImageIcon с пустым изображением правильного размера при запуске приложения. –

+1

'найти учебник о ресурсах и о том, как с ними бороться.' - ответ уже был дан вчера: http://stackoverflow.com/questions/30784690/add-image-to-jpanel-within-jlabel/30784800#30784800. Это раздражает, когда ОП не читает предоставленную информацию. – camickr

ответ

1

Ваше приложение не может найти «» изображения/cirkel.png»You. есть несколько альтернатив:.

  • использовать абсолютный путь (как я в модифицированном коде ниже)
  • использование ресурсов (есть сотни хороших учебников, как это сделать)
. 0

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


import java.awt.BorderLayout; 
import java.awt.FlowLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.*; 

public class Interface { 
    private JPanel panel; 
    private JPanel buttonPane; 
    private JLabel label; 
    private JLabel label2; 
    private JTextField textfield; 
    private JTextField textfield2; 
    private JTextField textfield3; 
    private JTextField textfield4; 
    private JTextField textfield5; 
    private JButton button; 
    private JButton button2; 
    private JButton button3; 
    private JButton button4; 
    private JButton button5; 
    private JButton button6; 

    public static void main(String[] args) { 
     new Interface(); 
    } 

    public Interface() { 
     JFrame frame = new JFrame("Vormen"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setSize(600, 300); 
     frame.setLocationRelativeTo(null); 

     panel = new JPanel(new FlowLayout()); 
     buttonPane = new JPanel(); 
     button = new JButton("cirkel"); 
     button.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       // Use absolute path here: 
       JLabel label = new JLabel(new ImageIcon("/home/tyrion/circle.png")); 
       panel.add(label); 
       panel.revalidate(); 
       panel.repaint(); 

      } 
     }); 

     buttonPane.add(button); 
     // buttonPane.add(button2); 
     // buttonPane.add(button3); 

     frame.add(buttonPane, BorderLayout.NORTH); 
     frame.add(panel, BorderLayout.CENTER); 
     frame.setVisible(true); 
    } 
} 
+1

Обычно лучше использовать ресурсы, чем использовать абсолютные пути. –

+1

Я думаю, что каждый Java-программист согласился бы. Однако использование ресурсов означает тратить дополнительные файлы времени и т. Д. Использование абсолютных путей происходит быстрее, когда кто-то хочет выполнить некоторые быстрые тесты ... – DejanLekic

+0

все строки кода в 'public void actionPerformed (ActionEvent e) {' together == 'label. setIcon (IconCachedInLocalVariable) ' – mKorbel

Смежные вопросы