添加一个 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);
无法弄清楚为什么这行不通,我的 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);