使用cardLayout在面板之间切换?

时间:2015-08-11 11:55:38

标签: java swing jpanel cardlayout

我有一个框架和多个面板,它们实现了绘图操作。我想在它们之间切换。我正在使用cardLayout,但我无法这样做。 帧码:

import java.awt.CardLayout;
import javax.swing.SwingUtilities;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;

public class MyFrame extends JFrame implements ActionListener {

    JPanel pp=new JPanel();
    GamePanel g=null;
    GamePanel1 g1=null;
    GamePanel2 g2=null;
    GamePanel3 g3=null;
    GamePanel4 g4=null;
    GamePanel5 g5=null;
    CardLayout c1=new CardLayout();
    public MyFrame()
    {
        setTitle("Deadly Combat");
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setSize(800,500);
        initComponents();
        new Timer(50,this).start();

    }
    public void initComponents()
    {
        g=new GamePanel(this);
        g1=new GamePanel1(this);
        g2=new GamePanel2(this);
        g3=new GamePanel3(this);
        g4=new GamePanel4(this);
        g5=new GamePanel5(this);
        Menu m = new Menu(g1,g3,g2,this);
        FighterChoice fc = new FighterChoice(g3,g,this);
        HelpMove hm = new HelpMove(g2,g1,this);
        Fighter1 f=new Fighter1(g,750,250);
        Fighter2 f2=new Fighter2(g,50,250);
        g3.arr.add(fc);
        g1.arr.add(m);
        g2.arr.add(hm);
        g.arr.add(f);
        g.arr.add(f2);
        addKeyListener(fc);
        addKeyListener(m);
        addKeyListener(hm);
        addKeyListener(f);
        addKeyListener(f2);
        pp.setLayout(c1);
        pp.add(g,"1");
        pp.add(g1,"2");
        pp.add(g2,"3");
        pp.add(g3,"4");
        pp.add(g4,"5");
        add(g1);
        c1.show(pp,"2");
        add(pp);
        //add(g1);

    }
    public static void main(String[] args) {
        MyFrame f=new MyFrame();
        f.setVisible(true);
        f.setResizable(false);
        //f.g1.as.playClip(0, true, 6);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
      g1.repaint();  
      g2.repaint();
      g.repaint();
      g3.repaint();

    }

}

以下是我的面板代码的样子:

import java.awt.Graphics;
import java.awt.Color;
import java.awt.Image;
import java.util.*;
import javax.swing.*;

public class GamePanel1 extends JPanel {

    Image img = null; 
    AudioSink as=null;
    List<ObjectIntf> arr=new ArrayList<ObjectIntf>();
    MyFrame f;

public GamePanel1(MyFrame f){

    this.f = f;
    img = new ImageIcon(getClass().getResource("combat3.jpg")).getImage();
    as= new AudioSink();
    as.addAudioClip("map_1_bgsound");
    as.addAudioClip("mm_spawn_sound");
}  
@Override
protected void paintComponent(Graphics g)  
{
    super.paintComponent(g);

    g.drawImage(img,0,0,800,500,null);
    arr.size();
    for(ObjectIntf o : arr)
    {
        o.draw(g);
        System.out.println(arr.size());
    }
}

以下是我想在MyFrame调用的Menu函数中切换面板的方法:

private void select() {
    if(currentChoice == 0) {
        f.c1.show(f.pp, "4");
        f.add(f.pp);
    }
}

它不起作用。请帮忙。

1 个答案:

答案 0 :(得分:1)

我的猜测 - 您的f.c1.show(f.pp, "4");正在使用错误的MyFrame实例。您在main方法中声明并创建可视化的MyFrame实例,并且通过这样做,其范围仅限于该main方法。 错误的解决方案是创建一个MyFrame f静态字段。更好的解决方案是为MyFrame提供内部调用show(String key)的{​​{1}}方法,我会确保我的菜单或“Controller”类对可视化有正确的引用MyFrame实例,以便它可以调用其公共c1.show(this, key)方法。

话虽如此,我的答案只是一个猜测,因为您当前的代码片段并不能让我们完全理解您的问题可能是什么,这会阻碍您获得合适的答案。如果我的建议没有帮助,那么请帮助我们更好地了解发生了什么。我们不希望看到您的所有代码,但我们确实希望看到一个小程序,它是您的代码的合并,并为我们展示您的问题,mcve

修改
我现在在你的代码中看到你有:

show(String key)

您正在将Menu m = new Menu(g1,g3,g2,this); 或当前的MyFrame实例传递到您的菜单类中,这种类型会将我的上述猜测发送到hades。换句话说,我的猜测很可能是错误的,对不起。请发布mcve,以便我们更好地了解您的计划可能出现的问题。