有人可以告诉我为什么组合框不显示吗?我有一个控制器:
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.html" target="_blank">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)。还有其他解决方案吗?
setVisible(true)
之前 , 请勿调用JFrame pack()
。例如,
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在评论中询问:
‘几乎从不’?在哪种情况下,您会使用[null布局]?
我很少使用它,例如当我想通过动画或使用MouseListener来移动组件时,但是即使如此,许多人还是建议您创建自己的布局来处理它,例如Rob
Camick的Drag Layout。
有人能说出为什么组合框没有显示?我有一个控制器: 和视图 由于TestController中的setLayout(null),我看不到组合框。如果我将add(cgview.comboBox)添加到我的TestContoller()中,使其看起来如下所示: 比我能看到的还要多。有人能说出原因吗? 所以我的解决方案是始终在TestController中添加组件,或者将TestController作为a
我直接从书上抄了这些例子。代码应该在JFrame上绘制一些东西,但没有显示任何东西(除了JFrame),这里是带有main方法的类 下面是JPanel的一个子类
问题内容: 我有一个JFrame根据您单击的MenuItem显示JPanels。它可以工作,但是现在我需要在将JPanel添加到框架中并显示 它之后调用一个方法(因为我在该面板内使用JFreeChart,并且必须在可见JPanel时调用): 看起来还好吗?是被真出?似乎不是: 这是不工作(被 抛出异常)。这意味着 在调用repaint时,JPanel不可见,我已经测试了以下内容: 现在它可以正常工
我知道同样的问题已经被问过很多次了,但是我似乎真的没有在我的代码中发现阻碍JPanel类型的对象显示在JFrame中的错误。下面是扩展JFrame的类的构造函数: 当我运行main方法(这里没有显示)时,它只显示框架和按钮。如果有人能在这方面给点提示,我会非常感谢的。
问题内容: 我正在为我的学生编写MathQuiz,包括用于渲染的JLatexMath和用于蜂鸣器的jinput。问题是,有时(像每四次一样)当我启动程序时,所有组件都不可见。它们在调整JFrame大小后出现。首先,我想到了jinput或jlatexMath库中的Bug,但是即使使用最小的代码,我也会遇到相同的错误: 代码有什么问题? 问题答案: 首先移到构造函数的末尾。 而不是去这里… 移到这里…
这是我的代码,当我执行时,我得到的只是一个空白窗口。首先,当我尝试执行时,我得到了这个错误: “无法对非静态字段面板进行静态引用” 所以我把它放在构造器中,但什么都不会显示。