2017-08-26 2 views
0

私はこのゲームを作成し始めました。最初に問題が発生しました。オブジェクトをインスタンス化していることと、パネル表示を行っていることを示していますが、ビジュアルには何の効果もありません。カードレイアウトはプロセスの作業後にパネルを変更しません

コードは次の通りである:フレームを変更

オリジナルクラス

public class Parking_Mania { 

public static void main(String []args)throws Exception 
{ 
    new GameFrame("Paking Mania"); 
} 
} 

ゲームフレームクラス

public class GameFrame extends JFrame{ 

public GameFrame(String name) 
{ 
    this.setTitle(name); 
    this.setSize(640,510); 
    this.setLocationRelativeTo(null); 
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    this.setResizable(false); 
    this.setVisible(true); 

    Frames frame=new Frames(); 
    this.add(frame); 
    frame.panel.show(frame, "opening"); 

} 
} 

パネル

public class Frames extends JPanel{ 

CardLayout panel= new CardLayout(); 

public Frames() 
{ 
    this.setLayout(panel); 
    System.out.println("hello"); 
    Opening op=new Opening(); 
    nxtframe nf= new nxtframe(); 
    this.add(op, "opening"); 
    this.add(nf, "nt"); 
    } 

public void nxtf() 
{ 

    panel.show(this, "nt"); 
} 
} 

第パネル

public class Opening extends JPanel{ 



JButton but=new JButton(); 

public Opening(){ 

    this.setLayout(null); 
    this.setBackground(Color.BLACK); 
    add(but); 
    but.setText("next frame"); 
    but.setBounds(0, 0, 110, 120); 
    but.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent e) 
      {     
       Frames f=new Frames(); 
       f.nxtf(); 
      } 
     }); 
} 

public void paint(Graphics g) 
{ 
    g.fillRect(110, 120, 110, 120); 
} 


} 

第二パネル

public class nxtframe extends JPanel{ 

JButton but=new JButton(); 

public nxtframe(){ 

    System.out.println("hello"); 
    this.setLayout(null); 
    add(but); 
    but.setText("next frame"); 
    but.setBounds(0, 0, 110, 120); 
    but.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent e) 
      { 

      } 
     }); 
} 

public void paint(Graphics g) 
{ 
    g.setColor(Color.BLUE); 
    g.fillOval(110, 120, 110, 120); 
} 


} 

PS:私はそれは自明であると仮定して、私はコメントを追加する気にしませんでした。コメントを追加する必要がある場合はすぐに追加してください。

+0

回答は編集を参照してください。質問があれば質問してください。 –

+0

はあなたの助けを借りて非常にうまくいっています。 –

答えて

2

批判的に考えてみましょう:これは何と思いますか?new Frames(); ActionListener内ですか?

回答:それはフレームオブジェクトNEW(単語 "新しい" にアクセント)を作成します。新しい、まったく新しい、別個のものでオリジナルとは無関係なもの。このFramesオブジェクトのビューを変更すると、現在表示されているFramesオブジェクトには何の効果もありません。問題を解決するには、実際に表示されているオブジェクトへの参照を取得し、その上にカードを変更するメソッドを呼び出します。

一つの解決策は、例えば、

Opening op=new Opening(); 

に変更、コンストラクタPARAMTERて言う開口部に可視化フレームの参照を渡すことです:参照その

Opening op = new Opening(this); // pass in the current Frames reference 

そしてコンストラクタのグラブを開くにし、それを使用してください:

public class Opening extends JPanel{ 
    private JButton but=new JButton(); 
    private Frames f; 

    public Opening(final Frames f){ 
     this.f = f; 
     this.setLayout(null); // !!!! no don't do this!!! 
     this.setBackground(Color.BLACK); 
     add(but); 
     but.setText("next frame"); 
     but.setBounds(0, 0, 110, 120); // and don't do this! 
     but.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent e) { 
       // !!Frames f=new Frames(); 
       f.nxtf(); 
      } 
     }); 
    } 

    public void paint(Graphics g) { 
     g.fillRect(110, 120, 110, 120); 
    } 
} 

他の関係のない問題:

  • nullレイアウトは使用しないでください。それらを使用すると、あなたのGUIは硬く、柔軟性がなく、保守が難しく、他のプラットフォームでは機能しないことがあります。
  • paintControlをオーバーライドしないで、paintComponentを呼び出すと、オーバーライドでsuperのメソッドを呼び出します。Lesson: Performing Custom Painting
+0

多くのことを私に説明してくれてありがとう。クイックメモなぜ私はnullレイアウトを維持している理由は、私は別のゲームからの背景イメージを使用するようになるので、特定の位置にボタンが欲しいので、私は私に提供されたグラフィックイメージに応じてボタンを整列する必要があります別の方法がある場合は、私にそれもリンクしてくださいできますか? PS:あなたは何度も私を助けてくれました。ありがとうございました –

+0

駐車場のゲームを作っているときに、私は車でやるべきことを示唆しました。ペイントコンポーネントを使用するといいでしょうか、古典的なJLabelを車として使って、 jラベル? –

関連する問題