同时使用JFrame和JLabel

时间:2015-08-28 12:47:05

标签: java jframe jlabel

我想在JFrame中添加图片和文字。

当我添加图片和文本时,只显示图片。我的猜测是文本隐藏在它背后。当我注释掉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);

  }
}

4 个答案:

答案 0 :(得分:1)

首先,您向框架添加了一个组件(label)。到现在为止还挺好。

F.add(label);

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

  
    

为方便起见,将重写此类的add,remove和setLayout方法,以便它们将调用委托给ContentPane的相应方法。例如,您可以按如下方式将子组件添加到框架中:

  frame.add(child);
         

孩子将被添加到contentPane。

  

然后,您使用新组件替换了框架的内容窗格:

F.setContentPane(...);

这就是你丢失标签的原因。而是将第二个标签(带图像)添加到farme。

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

您还希望在某些时候了解layout managers来控制布局。

答案 1 :(得分: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帮助您,则堆栈跟踪也很有用。)

答案 2 :(得分: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);

答案 3 :(得分:0)

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

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