【问题标题】:nested swing containers not displaying嵌套的摆动容器不显示
【发布时间】: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


【解决方案1】:

“默认情况下,分层窗格没有布局管理器。” — How to Use Layered Panes

为您的标签设置边界,它就会出现。例如:

label1.setBounds(20, 20, 200, 100);

请记住,您这样做是出于分配目的,并且实际上您可能不会设置组件的边界,除非您故意使用绝对布局。


编辑:
正如 MadProgrammer 指出的那样,您还可以为分层窗格设置布局管理器,在这种情况下,您无需设置标签边界。例如:

mainScreen.setLayout(new BorderLayout());

【讨论】:

  • 哇,感谢您的快速回答,我担心它会更复杂。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多