2017-05-07 80 views
0

我遇到了一个似乎有点奇怪的问题。当我添加一个新的ImageIcon并尝试运行该程序时,它只是给我一个灰色屏幕,并且没有添加任何对象。添加图像时JFrame不起作用

public class Ctester { 

public Ctester(){ 
    Frame(); 
} 

public void Frame(){ 

    JFrame fr = new JFrame(); 
    fr.setVisible(true); 
    fr.setSize(500, 500); 
    fr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    fr.setResizable(false); 

    JPanel p = new JPanel(new GridBagLayout()); 
    ImageIcon icon = new ImageIcon(getClass().getResource("zippo.jpg")); 

    JLabel l = new JLabel(icon) 
    JButton bm1 = new JButton("hellu"); 

    p.add(l); 
    p.add(bm1); 
    fr.add(p); 


} 

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

但如果我删除行:

ImageIcon icon = new ImageIcon(getClass.getResource("zippo.jpg")); 

然后它工作完美。 我没有收到任何错误消息,我一直在寻找一段时间,但我只能发现问题可能是gridbaglayout的东西。

我该如何解决或者我必须改变布局? (这只是一个基于原始代码的简单代码,因此任何解决方案都不包括必须更改布局)高度赞赏

+0

(1)'这是在原有基础作为例子只是一个简单的代码'那么当您发布的代码应该是代码的确切的最小量你用这个来证明问题。我们没有时间猜测你可能做什么,也可能没有做什么。这是一个适当的[mcve]。 – camickr

回答

0

试试这段代码,您可能希望将第一行代码放入try catch以防万一它找不到图像。

URL iconURL = getClass().getResource("/some/package/favicon.png"); 
// iconURL is null when not found 
ImageIcon icon = new ImageIcon(iconURL); 
fr.setIconImage(icon.getImage()); 

,如果你只在Windows上使用该程序还使用.ico文件,但使用巴纽如果将是多平台

+0

几乎可以工作,现在它的开始灰色,但如果我最小化,然后再次拿起它,那么它的作品完美。所以thnx,祝我好运,试图解决新的问题:) –

1

大部分的代码是错误的:

  1. 摆动组件应在事件调度线程(EDT)上创建。

  2. 在将所有组件添加到框架之后,框架应该变为可见。

  3. 您正在尝试使用GridBagLayout,但在添加组件时没有使用任何GridBagConstraints。

  4. 方法名称(框架)不应该以大写字母开头。

阅读Swing Tutorial的Swing基础知识。

你可以找到工作的例子:

  1. 如何使用GridBagLayout的
  2. 如何使用图标

使不包括具有改变布局的任何解决方案,是高度赞赏

从工作实例开始,麦克e根据您的要求进行更改。如果你从更好的结构化代码开始,你将会遇到更少的问题。

+0

是啊,像我说的最后,所以这是不是原来的程序,我在原来使用gridbag约束。是的代码是meaby有点搞砸了,我的第三个程序:)但thnx的提示,我会尝试,如果它有帮助。 –

1

如果在窗口调整大小或最小化/最大化之后绘制正确,这是竞争条件的确定标志,因为您没有在事件分派器线程上启动GUI。你的主要问题是你要早点调用setVisible()方法,直到你将所有组件添加到顶级容器后才调用setVisible()。另一个问题是你没有在事件分派器线程上启动GUI。请固定的代码中看到的主要方法如下:

public class Ctester { 
    public Ctester() { 
     Frame(); 
    } 

    public void Frame() { 
     JFrame fr = new JFrame(); 
     fr.setSize(500, 500); 
     fr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     fr.setResizable(false); 

     JPanel p = new JPanel(new GridBagLayout()); 

     JLabel l = new JLabel("label"); 
     JButton bm1 = new JButton("hellu"); 

     p.add(l); 
     p.add(bm1); 
     fr.add(p); 

     fr.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       new Ctester(); 
      } 
     }); 
    } 
} 
+0

谢谢,它解决了我的问题,通过添加fr.setVisible(true)last –

+0

是的,但是您仍然需要确保使用SwingUtilities.invokeLater()在EDT上启动您的GUI。它会在以后避免一些潜在的问题。此外,如果它解决了您的问题,upvote或接受的答案将很好。 – Michael

+0

没有足够的信誉来upvote:/ –