我想在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);
}
}
答案 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);
一些小旁注:
f
或frame
或primaryFrame
。这些约定已完整描述here。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 );