我有一个框架和多个面板,它们实现了绘图操作。我想在它们之间切换。我正在使用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);
}
}
它不起作用。请帮忙。
答案 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,以便我们更好地了解您的计划可能出现的问题。