Добавление JInternalFrame к JTabbedPane с JScrollPane с JPanel с макетом Gridbag - PullRequest
0 голосов
/ 06 марта 2020

Не могу понять, почему это не сработает, я добавляю пустую панель на панель сетки. Я добавил 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 для 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 используется для хранения макета, я не думаю, что могу назначить один на TabbedPane? Пользователи будут загружать изображения, которые будут отображаться в левой части GridLayout (я обновлю его до GridBag). После выбора областей на указанных изображениях графики появятся с правой стороны. По этой же причине мы используем scrollPane, чтобы не ограничивать количество загружаемых изображений. TabbedPane будет использоваться для разделения нагрузки, если пользователь загружает слишком много изображений (это не относится к демонстрационному коду, показанному здесь, и не имеет отношения к проблеме). Выложенный мною код предназначен для проверки того, почему JInternalFrame не отображается, поэтому он показывает только то, что имеет отношение к тому, чтобы заставить это работать.

1 Ответ

0 голосов
/ 09 марта 2020

Спасибо всем за ваш вклад. Оказалось простой ошибкой отсутствие необходимого .setVisible(true) При методе addComponent() проблема решается, когда я заменяю

grid.add(new intf());

на

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

...