添加一个 JInternalFrame 到一个 JTabbedPane 持有一个 JScrollPane 持有一个 JPanel 与 Gridbaglayout

Adding a JInternalFrame to a JTabbedPane holding a JScrollPane holding a JPanel with Gridbag layout

无法弄清楚为什么这行不通,我的 gridbag 面板中添加了一个空白面板。 我在要添加的帧之间添加了一个 JLabel("test") 只是为了查看添加的内容,它只是不可见?

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Graphics2D;
import java.awt.GridLayout;
import java.awt.Image;
import java.awt.Label;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTabbedPane;

public class Workspace extends JTabbedPane {
      static JFrame frame = new JFrame();
      private JPanel grid;
      private String text = new String("testing.");
    Workspace() {
        this.addTab("title", growPanel());
    }

    public static void main(String[] args) throws IOException {
          createAndShowGUI();
    }

  private JPanel growPanel() {
    JPanel gp = new JPanel(false);
    gp.setPreferredSize(new Dimension(800,600));

    //Add a button that adds my frame
    JButton addComponentBtn = new JButton("Add Component");
    addComponentBtn.addActionListener(e-> {
        try {
            addComponent();
        } catch (IOException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
    });
    gp.add(addComponentBtn, BorderLayout.PAGE_START);

    grid = new JPanel(new GridLayout(0, 2, 10, 10)); //any number of rows, 2 columns, H and V gap
    JScrollPane sp = new JScrollPane(grid);
    sp.setPreferredSize(new Dimension(800,600));
    gp.add(sp, BorderLayout.CENTER);
    this.setVisible(true);
    return gp;
  }  

  void addComponent() throws IOException {
    System.out.println("adding");
    grid.add(new JLabel("test"));
      grid.add(new intf());
      this.repaint();
      frame.pack();
  } 

  private static  void createAndShowGUI() throws IOException {
      //Create and set up the window.
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

      //Add content to the window.
      frame.add(new Workspace(), BorderLayout.CENTER);

      //Display the window.
      frame.pack();
      frame.setVisible(true);
  }  
}

intf.java class 为 JInternalFrame:

import javax.swing.JInternalFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class intf extends JInternalFrame {
    public intf () {
        super("Document", 
                  true, //resizable
                  true, //closable
                  true, //maximizable
                  true);//iconifiable

        JPanel jp = new JPanel();
        JLabel jl = new JLabel("Hi I'm a label");
        jp.add(jl);
        this.add(jp);
        this.pack();
        this.repaint();
    }
}

编辑: JPanel 用于保存 Layout,我不认为我可以将一个分配给 TabbedPane? 用户将加载显示在 GridLayout 左侧的图像(我将其升级为 GridBag)。在所述图像上选择区域后,图表将出现在右侧。这也是我们使用 scrollPane 的原因,这样加载的图像数量就没有限制了。如果用户加载了太多图像,TabbedPane 将用于拆分负载(这不在此处显示的演示代码中,与问题无关)。 我发布的代码是为了测试为什么 JInternalFrame 没有显示,所以它只显示与让它工作相关的内容。

谢谢大家的意见。 事实证明这是一个简单的错误,没有必要 .setVisible(true)addComponent()的方法下,我替换成

的时候问题就解决了

grid.add(new intf());

intf a = new intf(); a.setVisible(true); grid.add(a);