2015-08-28 45 views
1

我试图在JFrame中添加图片和文本。使用JFrame和JLabel

当我添加图片和文字时,只有图片出现。我的猜测是文字隐藏在它后面。当我将try/catch块注释掉时,文本应该出现在中心。任何人都可以帮助我让文字出现在图片前面吗?

我删除了PIC的路径自己,这是没有错的

public class Vindu { 

    public Vindu(){ 
    JFrame F = new JFrame("name"); 
    JLabel label = new JLabel ("hello world", JLabel.CENTER); 
    label.setAlignmentX(0); 
    label.setAlignmentY(0); 
    F.add(label); 

    try{ 
     F.setContentPane(new JLabel (new ImageIcon 
     (ImageIO.readnewfile)))); 

     }catch (IOException e){ 
      System.out.print("wrong place"); 
    } 

    F.setResizable(false); 
    F.setSize(600, 400); 
    F.setVisible(true); 

    } 
} 

回答

1

首先,你添加的成分(label )到框架。到现在为止还挺好。

F.add(label); 

实际上,您将其添加到框架的内容窗格中,因为框架仅包含其内容窗格。见documentation for JFrame

为方便起见,添加,删除和这个类的setLayout的方法被覆盖,让他们委派到contentPane的相应方法的调用。例如,您可以按以下方式将子组件添加到框架:

frame.add(child); 

并且该子组件将被添加到contentPane中。

然后更换了框架的内容窗格中有一个新的组件:

F.setContentPane(...); 

这就是为什么你失去的标签。相反,将第二个标签(和图像)添加到farme。

F.add(new JLabel(new ImageIcon(...))); 

您还想了解layout managers以控制布局。

0

这里是你如何可以在图像上获得的JLabel:

JPanel panel = new JPanel(); 

try{ 
    panel.add(new JLabel (new ImageIcon 
      (ImageIO.read(new File(""))))); 

}catch (IOException e){ 
    System.out.print("wrong place"); 
} 

JLabel label = new JLabel ("hello world", JLabel.CENTER); 
label.setAlignmentX(0); 
label.setAlignmentY(0); 
panel.add(label); 

JFrame F = new JFrame("name"); 
F.add(panel); 

F.setResizable(false); 
F.setSize(600, 400); 
F.setVisible(true); 
+0

这有效,因为我得到的文字和图片,但文本是在右边,而不是在中心。 – mynameishi

+0

上面的代码片段与Java 6一起工作良好。你的环境是什么?你运行的确切代码片段也会有所帮助。 – dimplex

1

你可以通过阅读JFrame documentation找到你的问题的答案。从文档:

...你可以添加子组件的框架如下:

frame.add(child); 

那孩子将被添加到contentPane。

因此,您拨打F.add(label)的电话与F.getContentPane().add(label)完全相同。当然,你的代码所做的下一件事是完全替换contentPane。

由于默认的contentPane使用BorderLayout的(如JFrame的文档中描述的),你可能只是离开这个contentPane的到位,并申请BorderLayout的约束每个组件:

F.add(label, BorderLayout.PAGE_START); 
F.add(new JLabel(ImageIO.read(file)), BorderLayout.CENTER); 

一些小的便笺:

  • 在Java中,变量应该总是以小写字母开头,按照惯例。所以你的JFrame变量应该是fframeprimaryFrame。这些约定完整描述here
  • 异常对解释为什么出现问题非常有用。至少,您应该在catch块中使用e.printStackTrace(),这样异常信息不会丢失。 (如果遇到问题,堆栈跟踪也很有用,并且您希望问Stack Overflow以帮助您解决问题。)
0

您可以将Icon和文本添加到同一个JLabel,并显示以图标:

JLabel label = new JLabel("Center Text"); 
label.setIcon(new ImageIcon("...")); 
label.setHorizontalTextPosition(JLabel.CENTER); 
label.setVerticalTextPosition(JLabel.CENTER); 
frame.add(label);