简体   繁体   中英

java paint method not being called

I make a game in java and I can't seem to call the paintComponent() method in my game. here's the code :

public class TwinMoonTowers extends JPanel implements ActionListener{

    private class TMTMenu extends MouseAdapter{
        private Icon start, shop, quit;
        private Icon main_bg;

        public TMTMenu (){
            System.out.println("starting menu...");

            start = new Icon(TMTConstant.START_SOURCE,
                        TMTConstant.START_COORD_X, TMTConstant.START_COORD_Y);

            shop = new Icon (TMTConstant.SHOP_SOURCE,
                        TMTConstant.SHOP_COORD_X, TMTConstant.SHOP_COORD_Y);

            quit = new Icon (TMTConstant.EXIT_SOURCE,
                        TMTConstant.EXIT_COORD_X, TMTConstant.EXIT_COORD_Y);

            main_bg = new Icon (TMTConstant.MAIN_MENU_BG, 0, 0);
        }

        @Override
        public void mousePressed(MouseEvent me){

            int x = me.getX();
            int y = me.getY();

            System.out.println("coord: "+x+","+y);

            if (me.getButton() == MouseEvent.BUTTON1){
                if (x > start.x && x < start.x + start.getIcon().getWidth(null)
                        && y > start.y && y < start.y + start.getIcon().getHeight(null)){
                    curState = TMTConstant.MODE_STATE;
                }
                else if (x > quit.x && x < quit.x + quit.getIcon().getWidth(null)
                        && y > quit.y && y < quit.y + quit.getIcon().getHeight(null)){
                    curState = TMTConstant.EXIT_STATE;
                }
                else if (x > shop.x && x < shop.x + shop.getIcon().getWidth(null)
                        && y > shop.y && y < shop.y + shop.getIcon().getHeight(null)){
                    curState = TMTConstant.SHOP_STATE;
                }
            }

        }
    }

    private class TMTModeSelector extends MouseAdapter{
        private Icon TwinTower, TripleTower, back;

        public TMTModeSelector(){

        }

        @Override
        public void mousePressed(MouseEvent e){

        }
    }

    private String testDebug;
    private int curState;
    private TMTMenu menu;

    public TwinMoonTowers (){
        menu = new TMTMenu();
        curState = TMTConstant.MAIN_MENU_STATE;

        System.out.println("creating panel..");

        this.setVisible(true);
        this.setDoubleBuffered(true);
        this.setSize(TMTConstant.WINDOW_WIDTH, TMTConstant.WINDOW_HEIGHT);
        this.addMouseListener(menu);
    }

    @Override
    public void actionPerformed(ActionEvent arg0) {
        // TODO Auto-generated method stub
        this.repaint();

    }
    @Override
    public void paintComponent (Graphics g){
        super.paintComponent(g);
        Graphics2D g2d = (Graphics2D) g;

        System.out.println("preparing canvas..");

        switch(curState){
            case TMTConstant.MAIN_MENU_STATE :
                g2d.drawImage(menu.main_bg.getIcon(), menu.main_bg.x, menu.main_bg.y, this);
                g2d.drawImage(menu.start.getIcon(), menu.start.x, menu.start.y, null);
                g2d.drawImage(menu.quit.getIcon(), menu.quit.x, menu.quit.y, null);
                g2d.drawImage(menu.shop.getIcon(), menu.shop.x, menu.shop.y, null);
                break;
            case TMTConstant.GAME_STATE :
                break;
            case TMTConstant.SHOP_STATE :
                break;
            case TMTConstant.MODE_STATE :
                break;
        }

        System.out.print("render image...");

        Toolkit.getDefaultToolkit().sync();
        g.dispose();

    }
}

while class Icon is this:

public class Icon{

private Image pic;
public int x, y;

public Icon (String path, int x, int y){

    ImageIcon ii = new ImageIcon (path);
    pic = ii.getImage();

    this.x = x;
    this.y = y;
}

public Image getIcon() {return pic;}
}

the basics here is to draw a menu containing 3 buttons (start, shop, exit)

but, the paintComponent method is not called (the system.out.println not showing)

Toolkit.getDefaultToolkit().sync();
g.dispose();

These lines are unnecessary (might even be wrong), remove them.

The problem is most likely not in the code you posted. Where do you add the panel to a top level window (frame/applet)? What layout do you use for its content pane? My guess is the size is (0,0) so the panel won't be painted.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM