【问题标题】:java paint method not being calledjava paint方法没有被调用
【发布时间】:2012-05-04 10:10:01
【问题描述】:

我用 java 制作了一个游戏,但我似乎无法在我的游戏中调用 paintComponent() 方法。这是代码:

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

    }
}

虽然类图标是这样的:

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

这里的基础是绘制一个包含 3 个按钮(开始、购物、退出)的菜单

但是,paintComponent 方法没有被调用(system.out.println 没有显示)

【问题讨论】:

  • 这里的 TMTConstant 是什么? ...
  • TMTConstant 是一个具有常量的类...如窗口宽度、高度等。
  • 请注意,@ShaikMd 不会收到您的评论通知(最好将其编辑到问题中),除非您在评论中添加“@他们的姓名”(无空格)。
  • 如需尽快获得更好的帮助,请发帖SSCCE
  • 这是我上传的 java 项目mediafire.com/?hj9k4s003zr4nga 挣扎了一个小时但没有结果

标签: java swing graphics repaint paintcomponent


【解决方案1】:
Toolkit.getDefaultToolkit().sync();
g.dispose();

这些行是不必要的(甚至可能是错误的),删除它们。

问题很可能不在您发布的代码中。您在哪里将面板添加到顶级窗口(框架/小程序)?您对其内容窗格使用什么布局?我的猜测是大小为 (0,0),因此不会绘制面板。

【讨论】:

  • 我将面板添加到 jframe... 但我还没有设置布局(可能是空布局)。框架的大小与面板的大小相同
  • 这是一个奇怪的问题。每当我移动框架直到它通过我的笔记本电脑屏幕时,它都会呈现......但只有笔记本电脑屏幕切割的部分......我已经检查了你的解决方案并删除了代码,但它仍然是一样的
猜你喜欢
  • 2012-08-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-01
  • 2012-03-13
  • 1970-01-01
  • 2017-10-31
相关资源
最近更新 更多