javaswingjpaneljtabbedpanejinternalframe

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


Can't figure out why this wont work, I get a blank panel added to my gridbag panel. I added a JLabel("test") between the frames I'm trying to add just to see that something IS getting added, it just isn't visible?

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);
  }  
}

And the intf.java class for the 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();
    }
}

Edit: The JPanel is used to hold the Layout, I don't think I can assign one to the TabbedPane? Users will load in images which will appear on the left side of the GridLayout (I will upgrade this to a GridBag). After selecting regions on said images, graphs will appear on the right side. This is also why we use a scrollPane so that there is no limit to the number of images loaded. The TabbedPane will be used to split the load if a user loads in too many images (this is all not in the demo code shown here and not relevant to the problem). The code I posted is for testing why the JInternalFrame doesn't show, so it only shows what is relevant to getting that to work.


Solution

  • Thank you all for your input. It turned out to be a simple mistake of not having a necessary .setVisible(true) Under the addComponent() method, the problem is solved when I replace

    grid.add(new intf());

    with

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