加载包含另一个 JPanel 的 JPanel
load JPanel that contains another JPanel
我正在尝试加载一个 Class,它扩展了 JPanel 并具有来自另一个 Class 的组件,该 Class 也将 JPanel 扩展到另一个 Class。
这就是我需要实现的目标:
First.java
的例子
public class First extends JPanel{
JPanel cont = new JPanel();
public First(){
cont.setBackground(Color.YELLOW);
}
}
Second.java
的例子
public class Second extends JPanel{
JPanel cont = new JPanel();
First first_panel = new First();
public Second(){
cont.setBackground(Color.RED);
cont.add(first_panel);
}
}
Container.java
的例子
public class Container extends JFrame{
JFrame frame = new JFrame();
JPanel cont = new JPanel();
Second second_panel = new Second();
public Container(){
cont.setBackground(Color.GREEN);
cont.add(second_panel);
frame.add(cont);
frame.setVisible(true);
}
}
我能够一个一个地加载 类 但是当我尝试加载包含另一个 panel.class 的面板时,GUI 没有不要展示它。逻辑有什么问题?有什么问题吗?
显示的代码中存在两个基本问题。
- 每个 class 都扩展了它所处理的组件的实例。
- 两个面板都没有任何内容可以赋予它非零大小,也没有覆盖
getPreferredSize
方法,所以它们是 0x0 像素。
看看这个MCVE的效果。
import java.awt.Color;
import javax.swing.*;
public class Container {
JFrame frame = new JFrame();
JPanel cont = new JPanel();
Second second_panel = new Second();
public Container() {
cont.setBackground(Color.GREEN);
cont.add(second_panel.getPanel());
frame.add(cont);
frame.pack();
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
}
public static void main(String[] args) {
Runnable r = new Runnable() {
@Override
public void run() {
new Container();
}
};
SwingUtilities.invokeLater(r);
}
}
class Second {
JPanel cont = new JPanel();
First first_panel = new First();
public Second() {
cont.setBackground(Color.RED);
cont.add(new JLabel("Second"));
cont.add(first_panel.getPanel());
}
public JComponent getPanel() {
return cont;
}
}
class First {
JPanel cont = new JPanel();
public First() {
cont.setBackground(Color.YELLOW);
cont.add(new JLabel("First"));
}
public JComponent getPanel() {
return cont;
}
}
我正在尝试加载一个 Class,它扩展了 JPanel 并具有来自另一个 Class 的组件,该 Class 也将 JPanel 扩展到另一个 Class。
这就是我需要实现的目标:
First.java
public class First extends JPanel{
JPanel cont = new JPanel();
public First(){
cont.setBackground(Color.YELLOW);
}
}
Second.java
public class Second extends JPanel{
JPanel cont = new JPanel();
First first_panel = new First();
public Second(){
cont.setBackground(Color.RED);
cont.add(first_panel);
}
}
Container.java
public class Container extends JFrame{
JFrame frame = new JFrame();
JPanel cont = new JPanel();
Second second_panel = new Second();
public Container(){
cont.setBackground(Color.GREEN);
cont.add(second_panel);
frame.add(cont);
frame.setVisible(true);
}
}
我能够一个一个地加载 类 但是当我尝试加载包含另一个 panel.class 的面板时,GUI 没有不要展示它。逻辑有什么问题?有什么问题吗?
显示的代码中存在两个基本问题。
- 每个 class 都扩展了它所处理的组件的实例。
- 两个面板都没有任何内容可以赋予它非零大小,也没有覆盖
getPreferredSize
方法,所以它们是 0x0 像素。
看看这个MCVE的效果。
import java.awt.Color;
import javax.swing.*;
public class Container {
JFrame frame = new JFrame();
JPanel cont = new JPanel();
Second second_panel = new Second();
public Container() {
cont.setBackground(Color.GREEN);
cont.add(second_panel.getPanel());
frame.add(cont);
frame.pack();
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
}
public static void main(String[] args) {
Runnable r = new Runnable() {
@Override
public void run() {
new Container();
}
};
SwingUtilities.invokeLater(r);
}
}
class Second {
JPanel cont = new JPanel();
First first_panel = new First();
public Second() {
cont.setBackground(Color.RED);
cont.add(new JLabel("Second"));
cont.add(first_panel.getPanel());
}
public JComponent getPanel() {
return cont;
}
}
class First {
JPanel cont = new JPanel();
public First() {
cont.setBackground(Color.YELLOW);
cont.add(new JLabel("First"));
}
public JComponent getPanel() {
return cont;
}
}