JPFnel在JFrame中不可见

时间:2015-02-14 09:02:03

标签: java swing jframe jpanel visibility

我知道这些问题已经被问到,但我找不到解决问题的方法。

我正在尝试在我的JPanel中绘制一些动画,它将在JFrame中。 JPanel不可见,JFrame是可见的,也是我放入的测试标签。另外,由于某种原因,我无法设置JFrame背景。这是不起作用的代码:(构造函数在项目的另一个类中)。

public class WindowClass extends JPanel implements ActionListener{

Graphics graphics;
JFrame window;
Timer timer;

private JLabel label = new JLabel("Best Label Around");
private int height;
private int width;
private Color bgColor;


public void init(){

    window = new JFrame("Jumping Balls");
    window.add(this);
    window.add(label);
    this.setSize(150,150);
    window.setSize(500, 300);
    window.setDefaultCloseOperation(window.EXIT_ON_CLOSE);
    window.setVisible(true);
    setVisible(true);
    //timer = new Timer(100, this); //TODO
    //timer.start();

}

public void paintComponent(Graphics g){
    super.paintComponent(g);
    setBackground(Color.BLUE);
}
BTW - 这是另一个非常相似的另一个程序的代码,它确实有用,我不知道为什么,它真的让我大吃一惊......以下是他的一些代码:

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());
    }

}

谢谢!

1 个答案:

答案 0 :(得分:2)

默认情况下,您的窗口(特别是窗口的内容窗格)使用BorderLayout布局管理器。

BorderLayout有五个位置 - 顶部,底部,左侧,右侧和中间。当add组件到BorderLayout时,如果您未指定位置,则默认为中心。每个职位只能容纳一个部分。

此:

window.add(this);
window.add(label);

this添加到中心位置。然后它将label添加到中心位置 - 这会删除this,因为只有一个组件可以位于中心。

您可以使用其他布局管理器(超出此答案的范围),也可以继续使用BorderLayout并明确设置位置。假设您希望标签出现在面板上方的后一个示例:

window.add(this, BorderLayout.CENTER); // or just window.add(this);
window.add(label, BorderLayout.NORTH);