【问题标题】:Switch between panels using cardLayout?使用cardLayout在面板之间切换?
【发布时间】:2015-08-11 11:55:38
【问题描述】:

我有一个框架和多个面板,它们实现了绘制操作。我想在它们之间切换。我正在使用 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);
    }
}

它不起作用。请帮忙。

【问题讨论】:

  • 有AudioSink GamePanel ObjectIntf 的实现吗??

标签: java swing jpanel cardlayout


【解决方案1】:

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

话虽如此,我的回答只是一个猜测,因为您当前的代码 sn-ps 无法让我们完全理解您的问题可能是什么,这阻碍了您获得体面的答案。如果我的建议没有帮助,请帮助我们更好地了解到底发生了什么。我们不想看到您的所有代码,但我们确实希望看到一个小程序,它是您的代码的整合并为我们演示了您的问题,mcve


编辑:
我现在在您的代码中看到您拥有:

Menu m = new Menu(g1,g3,g2,this);

您将this 或当前的 MyFrame 实例传递到您的 Menu 类中,这让我的上述猜测成为了哈迪斯。换句话说,我上面的猜测很可能是错误的,对不起。请张贴mcve,以便我们更好地了解您的程序可能出现的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-01
    • 2015-10-08
    • 1970-01-01
    • 2013-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多