Home > Software engineering >  JComponent not appearing
JComponent not appearing

Time:07-14

I'm trying to create a super simple component, and it's not appearing.

Component class:

import java.awt.Color;
import java.awt.Graphics;

import javax.swing.JComponent;

public class Player extends JComponent{
    
    public Player() 
    {
    
    }
   
    public void paint(Graphics g)
    {  
        g.setColor(Color.green);  
        g.fillRect(40,40,150,150);  
    }  

   
}

Panel Class im adding it to:

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Rectangle;

import javax.swing.JPanel;

public class Game extends JPanel{

    public Game() 
    {
        this.setBackground(Color.yellow);
        this.setPreferredSize(new Dimension(500,500));
        Player p = new Player();
        
        this.add(p);
        
    }
    
}

And the JFrame:

import javax.swing.JFrame;

public class Launcher {

    public static void main(String[] args) {
        
        JFrame frame = new JFrame("Key Collector Demo");
        
        frame.add(new Game());
        frame.pack();
        
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
        frame.setDefaultCloseOperation(frame.EXIT_ON_CLOSE);
        
    }

}

The only thing showing up is the yellow background. JFrame and JPanel are working fine; this problem consistently happens to me when building jcomponents. What am I missing?

Any help would be greatly appreciated!

CodePudding user response:

Coordinates that you are using to draw a component are defined in the space of that component.

If you do this:

public void paint(Graphics g)
{
    g.setColor(Color.green);
    System.out.println(getSize());
    g.fillRect(40,40,150,150);
}

You will see that at the moment it is attempted to get drawn its size is 1x1. So drawing it from 40,40 obviously takes it out of the visible area of the component.

Now change the method to:

public void paint(Graphics g)
{
    g.setColor(Color.green);
    System.out.println(getSize());
    setSize(45, 45);
    g.fillRect(40,40,150,150);
}

Now you can see small filled rectangle. This is because you forced the size to be 45x45 and now there are 5 pixels to show in the space of the component while the remaining part is still out of the area.

CodePudding user response:

Do not assume the Player panel to have a fixed size. For a first test your paint method could look like this:

public void paint(Graphics g) {  
    g.setColor(Color.green);  
    g.fillRect(0,0,getWidth(),getHeight());  
}  

The next problem is that the component probably has no size or position. Add a LayoutManager to your panel and add the component:

public Game() {
    this.setBackground(Color.yellow);
    this.setPreferredSize(new Dimension(500,500));
    this.setLayout(new BorderLayout());

    Player p = new Player();
    this.add(p, BorderLayout.CENTER);
}

With that, your player might take the full space and you see green instead of yellow. Play around with the LayoutManager and the player's preferredSize.

  • Related