Java JPanel是';在JFrame中不可见
我知道有人问过这样的问题,但我找不到任何解决问题的办法 我正在尝试在我的JPanel中绘制一些动画,它将在JFrame中。JPanel不可见,JFrame可见,还有我放在其中的测试标签。此外,由于某些原因,我无法设置JFrame背景。下面是不起作用的代码:(构造函数在项目的另一个类中) 顺便说一句,这是另一个程序的另一个非常类似的代码,它确实有效,我不知道为什么,它真的让我震惊。。以下是一些代码:Java JPanel是';在JFrame中不可见,java,swing,jframe,jpanel,visibility,Java,Swing,Jframe,Jpanel,Visibility,我知道有人问过这样的问题,但我找不到任何解决问题的办法 我正在尝试在我的JPanel中绘制一些动画,它将在JFrame中。JPanel不可见,JFrame可见,还有我放在其中的测试标签。此外,由于某些原因,我无法设置JFrame背景。下面是不起作用的代码:(构造函数在项目的另一个类中) 顺便说一句,这是另一个程序的另一个非常类似的代码,它确实有效,我不知道为什么,它真的让我震惊。。以下是一些代码: public class ShowClass extends JPanel implements
public class ShowClass extends JPanel implements ActionListener{
int count=0;
Graphics graphics;
JFrame window;
Timer timer;
Random random = new Random();
Color generalColor = Color.BLACK;
int wHeight = 400;
int wWidth = 550;
final int MAXSIZE = 60; //Ball's Maximum Size
//BackGround colors
int randomRed = 100;
int randomGreen = 100;
int randomBlue = 100;
//Ball colors
int randomBallRed = 255;
int randomBallGreen = 255;
int randomBallBlue = 255;
public void init(){
window = new JFrame("Jumping Balls");
window.add(this);
window.setSize(wHeight, wWidth);
window.setDefaultCloseOperation(window.EXIT_ON_CLOSE);
window.setVisible(true);
timer = new Timer(100, this); //TODO
timer.start();
}
public void paintComponent(Graphics g){
super.paintComponent(g);
setBackground(new Color(randomRed,randomGreen,randomBlue));
for(Ball b : ManagerClass.balls){
//b.setBallColor(new Color(randomRed,randomGreen,randomBlue)); TODO
g.setColor(b.getBallColor());
g.fillOval((int)b.getLocation().getX(),(int)b.getLocation().getY(),b.getHeight(),b.getWidth());
}
}
谢谢大家! 默认情况下,您的窗口(特别是窗口的内容窗格)使用BorderLayout
布局管理器
BorderLayout
有五个位置-顶部、底部、左侧、右侧和中心。在向边框布局添加组件时,如果未指定位置,则默认为中心位置。每个位置只能容纳一个部件
这:
将此
添加到中心位置。然后它将标签
添加到中心位置-这将删除此
,因为只有一个组件可以位于中心位置
您可以使用不同的布局管理器(超出此答案的范围),也可以继续使用BorderLayout
并明确设置位置。后者的一个示例,假设您希望标签显示在面板上方:
window.add(this, BorderLayout.CENTER); // or just window.add(this);
window.add(label, BorderLayout.NORTH);
您希望如何在窗口中排列标签和面板?请查看此线程,关于。希望这能够为您解决问题:-)此外,避免设置属性,就像您在paintComponent(…)
方法中所做的setBackground(…)
一样。大多数布局都考虑组件的大小,在本例中,JPanel
的大小为(0,0)
,这就是它不显示的原因。尝试重写
方法(示例)我已经更改了setBackground()的位置,也更改了getPreferredSize()的位置,但仍然不起作用。。我最大的问题是,为什么这段代码不起作用,而第二段代码(几乎相同)起作用?您是否将两个类(ShowClass和WIndowClass)作为一个项目一起运行?您是否正在运行与Swing相关的代码?标签上的Swing仅用于测试,如果它是可见的。标签显示在框架的左侧,因此我假设面板占据了框架的中心。@YosefBro仅仅因为标签在大部分空间中没有显示任何内容并不意味着它没有占用该空间。标签显示一个字符串,并且它的位置在框架的左(西)侧。这让我觉得面板占据了框架的中心,但不知什么原因,它不可见。@YosefBro标签被指定占据整个框架。它只是没有任何东西显示在它的大部分BorderLayout
不关心本例中的标签“想要多大”。
window.add(this);
window.add(label);
window.add(this, BorderLayout.CENTER); // or just window.add(this);
window.add(label, BorderLayout.NORTH);