2015-01-05 4 views
-1

Я прошел несколько уроков и задавался вопросом, почему мой JLabel не создает изображение? Я думал, что у меня есть все, где я должен быть, чтобы изображение отображалось. Возможно ли, что другие графики в моей программе вмешиваются? Есть ли какая-либо система нисходящего слоя, используемая java для определения того, какие изображения находятся друг на друге, если у вас несколько разных друг на друга?Почему мой JLabel не создает изображение?

package scratch; 

import java.awt.Font; 
import javax.swing.*; 
import javax.swing.event.*; 
import java.awt.*; 
import java.awt.event.*; 
import java.awt.Graphics; 
import java.awt.Rectangle; 

import javax.swing.JFrame; 
import javax.swing.JLabel; 

//import statements 
//Check if window closes automatically. Otherwise add suitable code 
public class okay extends JFrame { 

    JPanel jp = new JPanel(); 
    JLabel jl = new JLabel(); 

    public okay(){ 

     jl.setIcon(new ImageIcon("C:\\Users\\ShawnK\\Desktop\\cat.png")); 
     jp.add(jl); 
     add(jp); 
     validate(); 
    } 

    public static void main(String args[]) { 

     JFrame window = new JFrame(); 

     okay t1 = new okay(); 

     window.setSize(640,800); 
     window.setTitle("lets do this"); 
     window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     window.setVisible(true); 


     drawingComponent DC = new drawingComponent(); 


     ai enemy = new ai(); 
     window.add(DC); 
     window.add(t1); 

    } 

} 
+0

Насколько я знаю, 'ImageIcon' не создает исключения, если он не может загрузить изображение. Поэтому попробуйте 'new ImageIcon (ImageIO.read (..))' вместо этого. – Tom

+0

Знаете ли вы, что такое экземпляр? – immibis

ответ

6

Вы просто создать простой ванили JFrame:

JFrame window = new JFrame(); 

и вы никогда не создать new okay() объект. Поймите, что он не создаст себя по волшебству, и если вы хотите его отобразить, вы должны сделать это в коде.

Как и в сторону, я понятия не имею, в создании какой drawingComponent является:

drawingComponent DC = new drawingComponent(); 

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


Также

  • Учиться и следовать Java именования, как делать это поможет другим (нас !!) лучше понять ваш код. Имена переменных должны начинаться с буквы нижнего регистра, а имена классов - с буквой в верхнем регистре.
  • Избегайте расширения JFrame. Хотя это может быть хорошо для таких тривиальных программ, как это, он не масштабируется хорошо, а это означает, что ваш код становится более сложным и рисует вас в углу даже в немного больших или более сложных программах.
  • Вместо этого передайте свой GUI в сторону создания JPanels, панели, которые затем могут быть помещены в JFrames, если это необходимо, или JDialogs, или JOptionPanes, или другие JPanels. Это придаст вашему коду гораздо большую гибкость.
  • Опять же, не вызывайте setVisible(true) на JFrame, пока не будут добавлены все исходные компоненты.
  • Да, вам лучше получить изображение как BufferedImage с помощью ImageIO.read(...), а затем поместить его в свой ImageIcon. Это немного безопаснее и (I думаю) позволяет лучше кэшировать изображения.
+1

plain vanilla JFrame lol –

+0

Я обновил основные аргументы, чтобы назвать new okay(); который еще не создал изображение – howevermanyitakes

+1

@howevermanyitakes: вы создаете хороший объект, но все еще не отображаете его. Где вы назовете 'setVisible (true)' на нем? Почему вы создаете его ** и ** отдельный JFrame? Избавьтесь от JFrame и используйте только хороший объект. Назначьте его переменной, а затем установите ее видимой. Также ваша схема именования Java (имена классов, начинающиеся с букв в нижнем регистре) предполагает, что, хотя вы, возможно, прошли некоторые обучающие программы Swing, вы еще не ознакомились с некоторыми инструкциями по Java, и это делает все наоборот. Сначала начните с основ, так как они необходимы для Swing и всего другого Java-кодирования. –