2015-08-26 2 views
0

Я пытаюсь построить окно с одним изображением, которое закрывает экран. Изображение представляет собой JLabel, а окно - JFrame. Пробовав бесчисленные способы и несколько раз просматривая несколько руководств, я не понял, как это сделать. Я согласен, это очень простой вопрос, но я просто не понимаю, как я могу подойти к этой проблеме. Вот мой код, я попытался (я заметил некоторые вещи, которые я проделывали ранее):Ошибка при построении простого окна?

package Buttons; 

import java.awt.event.*; 
import javax.swing.*; 
import java.awt.*; 
import java.awt.GridLayout; 

public class Mewindow extends JFrame { 

private JFrame mewindow; 
private JLabel mepic = new JLabel(new ImageIcon("me.png")); 

public Mewindow() { 

    super("Here is a picture of ME!"); 

    mewindow.setLayout(new GridLayout(1, 0, 0, 0)); 

    // Icon me = new ImageIcon(getClass().getResource("me.png")); 

    add(mepic); 

    mewindow.setVisible(true); 
    mewindow.setSize(250, 250); 
    mewindow.setDefaultCloseOperation(DISPOSE_ON_CLOSE); 
} 

} 

Большое вам спасибо за время, вы принимаете для чтения этого, я действительно ценю усилия, которые вы ставите в помощь один программист!

ответ

2

Проблема № 1 ...

У вас нет основного метода, так что если вы создаёте класс от другого класса, он не будет работать ...

public static void main(String[] args) { 
    EventQueue.invokeLater(new Runnable() { 
     @Override 
     public void run() { 
      try { 
       UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
      } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
       ex.printStackTrace(); 
      } 

      Mewindow frame = new Mewindow(); 
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      frame.pack(); 
      frame.setLocationRelativeTo(null); 
      frame.setVisible(true); 
     } 
    }); 
} 

Проблема № 2 ...

Теперь вы столкнетесь с NullPointerException, потому что mewindow не инициализирован, но вам это действительно не нужно, потому что вы используете значения внутри конструктора класса, так что вы закончите с StackOverflowException, если вы попытались установить интуицию это ... но это не имеет смысла в любом случае использовать ...

public class Mewindow extends JFrame { 

    private JLabel mepic 
    public Mewindow() { 

     super("Here is a picture of ME!"); 

     setLayout(new GridLayout(1, 0, 0, 0)); 

     mepic = new JLabel(new ImageIcon(getClass().getResource("me.png"))); 
     add(mepic); 

     setVisible(true); 
     setSize(250, 250); 
     setDefaultCloseOperation(DISPOSE_ON_CLOSE); 
    } 
} 

Теперь ваш код предполагает, что me.png хранится в том же пакете, что и Mewindow, только остерегайтесь этого.

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

MeWindow

Предложения ...

Не распространяется непосредственно от JFrame, используйте JPanel вместо, а затем добавить что в случае с JFrame ваш код будет более повторно использован

+0

Спасибо, это было очень хорошо объяснено. Думаю, я должен был прямо поместить изображение в JLabel! Что вы подразумеваете под «Не распространяетесь прямо из JFrame, вместо этого используйте JPanel, а затем добавляете это в экземпляр JFrame, ваш код будет более повторно использоваться»? Кроме того, мое изображение не заполняет все окно, почему? Это может быть сам образ, хотя ...? –

+0

Обычно не рекомендуется распространяться из контейнера верхнего уровня, поскольку он блокирует вас в одном случае, и вы не добавляете никаких новых функций в класс. Он также включает в себя множество других проблем управления, которые лучше всего оставить для реализации. 'JLabel' не масштабирует изображение, на самом деле, ни один компонент Swing, вместо этого вам нужно реализовать свои функции самостоятельно. – MadProgrammer

+0

Посмотрите на [этот пример] (http://stackoverflow.com/questions/14548808/scale-the-imageicon-автоматически-to-label-size/14553003 # 14553003) и [этот пример] (http://stackoverflow.com/questions/11959758/java-maintaining-aspect-ratio-of-jpanel-background -image/11959928 # 11959928) и [этот пример] (http://stackoverflow.com/questions/14115950/quality-of-image-after-resize-very-low-java/14116752#14116752) – MadProgrammer

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