我正在尝试加载一个扩展 JPanel 的类,并且具有来自另一个类的组件,该类也将 JPanel 扩展为另一个类。
这就是我需要实现的目标:
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 不会显示它。逻辑有什么问题?有什么问题吗?
最佳答案
所示代码中有两个基本问题。
- 每个类都扩展并拥有它所处理的组件的实例。
- 两个面板都没有任何会赋予其非零大小的内容,也没有覆盖
getPreferredSize
方法,因此它们都是 0x0 px。
查看此 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;
}
}
关于java - 加载包含另一个 JPanel 的 JPanel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30010290/