Java 基于玩家X,Y切换JPanel?

Java 基于玩家X,Y切换JPanel?,java,swing,jframe,jpanel,Java,Swing,Jframe,Jpanel,我有以下代码。。。(加上一个不包括getX、getY、setX、setY、render()、tick()等的通用播放器类) 我想让播放器在ViewB中加载,当它到达边缘时。。我希望ViewB关闭并被ViewA或ViewC替换(取决于是左边缘命中还是右边缘)。。。我似乎无法完成这件事,我不知道我做错了什么。。。。玩家类是在MainGameThread.java中创建的。。。并传递到新的JPanel上,因此我仍在使用创建的原始播放器对象/精灵。。 System.out.println(“应将此处的屏

我有以下代码。。。(加上一个不包括getX、getY、setX、setY、render()、tick()等的通用播放器类)

我想让播放器在ViewB中加载,当它到达边缘时。。我希望ViewB关闭并被ViewA或ViewC替换(取决于是左边缘命中还是右边缘)。。。我似乎无法完成这件事,我不知道我做错了什么。。。。玩家类是在MainGameThread.java中创建的。。。并传递到新的JPanel上,因此我仍在使用创建的原始播放器对象/精灵。。
System.out.println(“应将此处的屏幕更改为ViewA”)命令在到达边缘时似乎不会触发。。我在这里做错了什么????我要修什么课

MainGameThread类:

import java.util.LinkedList;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class MainGameThread extends JFrame {

    private LinkedList<JPanel> screens = new LinkedList<JPanel>();
    private ViewA va;
    private ViewB vb;
    private ViewC vc;
    private ViewD vd;
    private Player player;

    public MainGameThread() {
        player = new Player();
        // load player settings from server
        //  ..
        //
        //  va = new ViewA(player);
        //vc = new ViewC(player);
        //vd = new ViewD(Player)

        vb = new ViewB(player);

        screens.add(0,ViewB);
        screens.add(1,ViewA);
        screens.add(2,ViewB);
        screens.add(3,ViewC);

        add(screens.get(0)); // starting from view B

        //go to end of view B (x=0), change to View A, close view B

        if(player.getX()<=5){
            System.out.println("Should change screens here to ViewA");
            vb = null;
            va = new ViewA(player);
            remove(screens.get(0)); 

            add(screens.get(1));
        } 

        if(player.getX()>=615){
            System.out.println("Should change screens here to ViewC");
            vb = null;
            vc = new ViewC(player);
            remove(screens.get(0)); 

            add(screens.get(2));
        } 
        setSize(652, 480);
        setLocationRelativeTo(null);
        setTitle("GAME");
        setResizable(false);
        setVisible(true);
    }

    public static void main(String[] args) {
        new MainGameThread();
    }
}
  • 用于在视图(ViewA、ViewB、ViewC、ViewD)之间切换,否则您必须为
    JFrame
    调用
    (重新)验证
    repaint
    (在对已经可见的Swing GUI执行所有更改后,作为最后一行代码)

  • 自定义绘制由
    paintComponent()
    而不是
    paint()

  • 删除void
    public void addNotify(){
    而不是覆盖此void,则
    JPanel
    中对象的所有坐标都基于
    getWeight/Height


“删除void public void addNotify(){而不是此void来覆盖getPreferredSize,那么JPanel中对象的所有坐标都基于getWeight/Height”--所以将addNotify()全部删除?或者执行此
public void addNotify(){super.addNotify();B_WIDTH=getWidth();B_Height=getHeight();super.setPreferredSize(新尺寸(B_宽度,B_高度));}
删除整个代码块,没有任何原因需要通知,请尝试通过鼠标单击链接代码到getPreferredSize,然后您可以进行比较,顺便说一句,在此处搜索paintComponent+getPreferredSize,按最新顺序排序,然后您可以看到一些奇迹
import java.awt.Color;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.ArrayList;

import javax.swing.JPanel;
import javax.swing.Timer;


public class ViewA extends JPanel implements ActionListener {

    private Player player;
    private Timer timer;
    private int B_WIDTH;
    private int B_HEIGHT;
    private boolean ingame;

    public ViewA(Player player) {   
        this.player = player;

        addKeyListener(new TAdapter());
        setFocusable(true);
        setBackground(Color.RED);
        setDoubleBuffered(true);
        setSize(652, 480);
        ingame = true;


        timer = new Timer(5, this);
        timer.start();
    }

    public void addNotify() {
        super.addNotify();
        B_WIDTH = getWidth();
        B_HEIGHT = getHeight();   

    }

    public void paint(Graphics g) {
        super.paint(g);

        if (ingame) {

            Graphics2D g2d = (Graphics2D)g;

            if (player.isVisible())
                g2d.drawImage(player.getImage()
                    , player.getX(), player.getY(), this);

            g2d.setColor(Color.BLACK);
            g2d.drawString("ViewA: ", 5, 15);           
        } 

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

    @Override
    public void actionPerformed(ActionEvent e) {

        player.move();
        checkCollisions();
        repaint();  
    }

    public void checkCollisions() {
    }

    private class TAdapter extends KeyAdapter {
        public void keyReleased(KeyEvent e) {
            player.keyReleased(e);
        }

        public void keyPressed(KeyEvent e) {
            player.keyPressed(e);
        }
    }
}