java-setPanel(null)时,JPanel上的组件未显示
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java-setPanel(null)时,JPanel上的组件未显示,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3696字,纯文字阅读大概需要6分钟。
内容图文
![java-setPanel(null)时,JPanel上的组件未显示](/upload/InfoBanner/zyjiaocheng/695/74a40a9c0d39419995e53a6370c81173.jpg)
有人可以告诉我为什么组合框不显示吗?我有一个控制器:
public class TestController extends JPanel {
TestView cgView;
public TestController()
{
setLayout(null);
cgView=new TestView();
add(cgView);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
JFrame fr = new JFrame("testt");
fr.setSize(1200,1000);
fr.setResizable(false);
TestController cgc=new TestController();
fr.setBackground(Color.white);
fr.setVisible(true);
fr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
fr.add(cgc);
}
});
}
}
和一个观点
public class TestView extends JPanel{
private static final long serialVersionUID = 1L;
public JComboBox<String> comboBox;
public TestView() {
comboBox= new JComboBox<>(new String[] {"option1", "option2" });
comboBox.setBounds(100,500, 100, 20);
add(comboBox);
}
}
由于TestController中的setLayout(null),我看不到comboBox.如果我将add(cgView.comboBox)添加到TestContoller()中,则它看起来像这样:
public TestController()
{
setLayout(null);
cgView=new TestView();
add(cgView);
add(cgView.comboBox);
}
比我能看到的.有人可以告诉为什么吗?
因此,我的解决方案是始终将组件添加到TestController中,或者将TestController作为TestView的一个属性进行传递(因此在TestView()中,我将这样添加它们:this.parentPanel.add(comboBox).还有其他解决方案吗?
解决方法:
>几乎不要使用空布局
>而是使用嵌套在JPanels中的布局的最佳组合来为您的GUI实现令人满意的布局.
>如果您使用空布局,那么您将完全负责设置添加到该容器的所有组件的大小和位置.
>当前的问题是,您永远不会给TestView一个尺寸或位置,而是将其添加到使用空布局的容器中.
>不应将一个组件(以上是JComboBox)添加到多个容器中.
>在添加所有组件并在其上调用pack()之后,才对JFrame调用setVisible(true).
例如.,
import java.awt.*;
import javax.swing.*;
public class TestController extends JPanel {
private static final int PREF_W = 1000;
private static final int PREF_H = 800;
TestView cgView;
public TestController() {
setLayout(null);
cgView = new TestView();
cgView.setSize(getPreferredSize());
add(cgView);
}
@Override
public Dimension getPreferredSize() {
return new Dimension(PREF_W, PREF_H);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
JFrame fr = new JFrame("testt");
// fr.setSize(1200, 1000);
fr.setResizable(false);
TestController cgc = new TestController();
fr.setBackground(Color.white);
// fr.setVisible(true);
fr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
fr.add(cgc);
fr.pack(); //!! added
fr.setVisible(true); // !! moved
}
});
}
}
但是最好使用布局:
import java.awt.*;
import javax.swing.*;
public class TestController extends JPanel {
private static final int PREF_W = 1000;
private static final int PREF_H = 800;
TestView cgView;
public TestController() {
//!! setLayout(null);
cgView = new TestView();
//!! cgView.setSize(getPreferredSize());
add(cgView);
}
@Override
public Dimension getPreferredSize() {
return new Dimension(PREF_W, PREF_H);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
JFrame fr = new JFrame("testt");
// fr.setSize(1200, 1000);
fr.setResizable(false);
TestController cgc = new TestController();
fr.setBackground(Color.white);
// fr.setVisible(true);
fr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
fr.add(cgc);
fr.pack(); //!! added
fr.setVisible(true); // !! moved
}
});
}
}
class TestView extends JPanel {
private static final long serialVersionUID = 1L;
public JComboBox<String> comboBox;
public TestView() {
comboBox = new JComboBox<String>(new String[] { "option1", "option2" });
// comboBox.setBounds(100, 500, 100, 20);
add(comboBox);
}
}
编辑
OP在评论中要求:
‘Almost never’? In which cases you would use it [the null layout]?
我很少使用它,例如当我想通过动画或使用MouseListener来移动组件时,但是即使如此,许多人还是建议您创建自己的布局来处理该布局,例如Rob Camick的Drag Layout
内容总结
以上是互联网集市为您收集整理的java-setPanel(null)时,JPanel上的组件未显示全部内容,希望文章能够帮你解决java-setPanel(null)时,JPanel上的组件未显示所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。