2015-08-11 5 views
-3

У меня есть одна рама и несколько панелей, которые реализуют операцию рисования. Я хочу переключиться между ними. Я использую 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:

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

Не работает. Пожалуйста помоги .

+0

У вас есть реализация AudioSink GamePanel ObjectIntf ?? –

ответ

1

Моя догадка - что ваш f.c1.show(f.pp, "4"); работает с неправильным экземпляром MyFrame. Вы объявляете и создаете визуализированный экземпляр MyFrame в основном методе, и, делая это, его область действия ограничивается только этим основным методом. A bad Решение заключается в создании поля MyFrame f static. Лучшим решением является предоставление MyFrame собственного метода show(String key), который вызывает внутри себя c1.show(this, key), я бы удостоверился, что мое меню или класс «Контроллер» имеет правильную ссылку на визуализированный экземпляр MyFrame, чтобы он мог вызвать его общедоступный метод show(String key).

Сказав это, мой ответ - это просто предположение, поскольку ваши текущие фрагменты кода не позволяют нам полностью понять, какова может быть ваша проблема, и это мешает вам получать достойные ответы. Если мои предложения не помогут, пожалуйста, помогите нам лучше понять, что происходит. Мы не хотим видеть весь ваш код, но мы хотим увидеть небольшую программу, которая является консолидацией вашего кода и демонстрирует вашу проблему для нас, mcve.


Edit:
теперь я вижу в вашем коде, что у вас есть:

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

, что вы передаете this или текущий экземпляр MyFrame в классе меню, какой тип побегов моя выше догадаться до хадеса. Другими словами, по всей вероятности, мое предположение неправильно, извините. Пожалуйста, напишите, что mcve, чтобы мы могли лучше понять, что может быть неправильно с вашей программой.

 Смежные вопросы

  • Нет связанных вопросов^_^