【发布时间】:2014-12-22 00:42:54
【问题描述】:
//TbsgMain.java:
package tbsg;
import javax.swing.JFrame;
public class TbsgMain {
public static void main(String[] args) {
TbsgEngine engine = new TbsgEngine();
JFrame mainFrame = new TbsgFrame(engine);
mainFrame.setVisible(true);
}
}
//TbsgFrame.java
package tbsg;
class TbsgFrame extends JFrame {
private TbsgEngine engine;
private JLayeredPane mainScreen;
private JLabel label1;
public TbsgFrame(TbsgEngine eng) {
engine = eng;
setTitle("TBSG");
setLocation(10, 10);
setPreferredSize(new Dimension(600, 600));
setDefaultCloseOperation(EXIT_ON_CLOSE);
setLayout(new BorderLayout());
mainScreen = new JLayeredPane();
label1 = new JLabel();
label1.setIcon(new ImageIcon(new ImageIcon(getClass().getResource("imgs/hex."
+ "png")).getImage().getScaledInstance(115, 100, Image.SCALE_SMOOTH)));
mainScreen.add(label1, 0);
this.add(mainScreen);
this.pack();
}
}
我正在执行一项任务,这需要将多个不同的 Swing 容器和组件(JPanel、JLayeredPane、JLabel、JButton 等)放置在彼此之间,并最终放置在称为“mainFrame”的 JFrame 中,但使用此代码,我只得到一个空框架。到目前为止,JLabels 中的图像唯一一次出现是我直接将其添加到 JFrame 时,如下所示:
//TbsgFrame.java
package tbsg;
class TbsgFrame extends JFrame {
private TbsgEngine engine;
private JLabel label1;
public TbsgFrame(TbsgEngine eng) {
engine = eng;
setTitle("TBSG");
setLocation(10, 10);
setPreferredSize(new Dimension(600, 600));
setDefaultCloseOperation(EXIT_ON_CLOSE);
setLayout(new BorderLayout());
label1 = new JLabel();
label1.setIcon(new ImageIcon(new ImageIcon(getClass().getResource("imgs/"
+ "hex.png")).getImage().getScaledInstance(115, 100, Image.SCALE_SMOOTH)));
this.add(label1);
this.pack();
}
}
我怎样才能让 JPanel(以及后来的其他组件)出现?任何帮助将不胜感激。
【问题讨论】:
-
Nest JComponents 确实有效。我一直都这样做。我将快速查看您的代码,但与此同时您确实需要执行 all Swing code on the Event Dispatch Thread. 从该更改开始。
-
JLaywredPane 默认没有 LayoutManager,除非您提供一个,否则您需要设置添加到其中的组件的大小
标签: java swing user-interface jcomponent