【发布时间】:2013-12-23 09:25:51
【问题描述】:
我想知道如何将 JLabel 放在另一个 JLabel 之上的特定位置,在 Java 中扩展 JPanel 的类中。人们以前曾为此寻求帮助,但我发现的解决方案并不让我满意。我正在使用 GridLayout,这是我的一些代码:
//imports
public class Game extends JPanel implements MouseListener {
Icon background = new ImageIcon(getClass().getResource("/background.jpg"));
Icon foreground = new ImageIcon(getClass().getResource("/foreground.jpg"));
JLabel backgr = new JLabel(background);
JLabel foregr = new JLabel(foreground);
JFrame frame = new JFrame("Game");
public Game() {
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new GridBagLayout());
backgr.addMouseListener(this);
frame.setLayout(new FlowLayout());
frame.setPreferredSize(new Dimension(200,200));
frame.pack();
frame.setVisible(true);
frame.addMouseListener(this);
backgr.setLayout(new BorderLayout());
frame.add(backgr);
backgr.add(foreground);
}
}
(我在这个类中还有很多其他的方法,比如一些鼠标的东西,但我在这里不包括它们,因为它们与这个问题无关。)
目前代码几乎可以按我的意愿工作,前景图片显示在背景的顶部,就在它的中间。但我希望前景图片显示在背景图片的特定坐标处。我想如果我想在坐标 (50, 50) 处显示前景,我可以说 backgr.add(foreground, 50,50),这样可以编译,但在运行程序时会返回错误。有什么建议吗?将不胜感激。
编辑:我发现通过说 backgr.setLayout(null)、backgr.add(foregr) 和 foregr.setLocation(50,50),我们可以做我想要的。但由于不鼓励不使用布局管理器,我正在寻找更好的解决方案,以便我可以使用 backgr Icon 上的坐标。
【问题讨论】:
-
返回什么错误?
-
@Prasad "线程 "AWT-EventQueue-0" java.lang.IllegalArgumentException 中的异常:组件位置非法。"无论我选择哪个坐标,我都认为这是错误的方法
-
读取API,此方法不用于指定X/Y坐标。
-
@camickr 你是对的。那用什么方法呢?
-
“将 JLabel 放在 JLabel 之上” 我在另一个答案中忘了提及,有时直接进行自定义绘画更简单,甚至如果渲染组件。例如。在这种情况下,您可以将两个标签渲染为单独的图像,然后知道它们的宽度和高度,然后将两者渲染到“画布”以向用户显示。画布可能是自定义绘制的
JPanel(就像我使用渐变绘制一样),也可能是另一个图像,显示在JLabel中。对于任何不可调整大小的东西,我更喜欢第二种方法。比较简单,不需要...
标签: java swing layout jframe jlabel