2

学校向けのゲームを作成する必要があり、JButton をクリックして JPanels を切り替えるのに苦労しています。CardLayout を使用したいのですが、Java を初めて使用するため、非常に困難です。私の目標は、すべてのパネルをクラス「パネル 1」、クラス「パネル 2」などの異なるクラスに配置することです (メイン (JFrame) クラスで JPanels を作成するのではなく、コードが読みやすくなります。 CardLayout コンテナを、私の JFrame を含むクラスに配置することは可能ですか? また、そのくそったれの ActionPerformed をどこに配置すればよいでしょうか? これが私のコードです。

メイン (JFrame) クラス

    package invers;

    import java.awt.CardLayout;
    import java.awt.Color;
    import java.awt.Container;
    import java.awt.Dimension;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JPanel;

    public class InversMain extends JFrame implements ActionListener

     {

public CardLayout cardlayout;
public Container contentPane = this.getContentPane();
public InversMain()
{


JFrame frame = new JFrame();
frame.setLayout(cardlayout);
frame.setSize(1366,768);
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setTitle("Invers");
frame.setResizable(true);
frame.setVisible(true);

contentPane.setPreferredSize(new Dimension(600, 400));
    contentPane.add(new InversMainPaneel(), "Panel 1");
    contentPane.add(new InstellingenPaneel(), "Panel 2");

    settingsButton.addActionListener(new ActionListener() {

    public void actionPerformed(ActionEvent e) {
        cardlayout.show(contentPane, "Panel 1");
    }
});}


public static void main ( String [] args)
{
    new InversMain();
}
}

settingsButton は PANEL 1 クラスのボタンであることに注意してください。メインクラスで作成されていないため、エラーが発生します。メインクラス内から、PANEL 1 クラスの settingsButton を参照したいと思います。これは可能ですか?

パネル 1、ボタンを含むパネル、これが私のメイン メニュー ページです

    package invers;

    import java.awt.Color;
    import java.awt.Font;
    import javax.swing.JButton;
    import javax.swing.JPanel;

    public class InversMainPaneel extends JPanel

    {

private JButton nieuwSpelKnop = new JButton("Nieuw spel");
private JButton laadSpelKnop = new JButton("Laad Spel");
private JButton settingsButton = new JButton("Settings");
private JButton handleidingKnop = new JButton("Handleiding");

public InversMainPaneel()
{

    this.setLayout(null);

    nieuwSpelKnop.setSize(300,40);
    nieuwSpelKnop.setFont(new Font("Arial", Font.BOLD, 25));
    nieuwSpelKnop.setLocation(520,250);
    nieuwSpelKnop.setVisible(true);


    laadSpelKnop.setSize(300,40);
    laadSpelKnop.setFont(new Font("Arial", Font.BOLD, 25));
    laadSpelKnop.setLocation(520,350);
    laadSpelKnop.setVisible(true);

    settingsButton.setSize(300,40);
    settingsButton.setFont(new Font("Arial", Font.BOLD, 25));
    settingsButton.setLocation(520,450);
    settingsButton.setVisible(true);

    handleidingKnop.setSize(300,40);
    handleidingKnop.setFont(new Font("Arial", Font.BOLD, 25));
    handleidingKnop.setLocation(520,550);
    handleidingKnop.setVisible(true);


    this.add(nieuwSpelKnop);
    this.add(laadSpelKnop);
    this.add(settingsButton);
    this.add(handleidingKnop);

    this.setBackground(new Color(178,143,79));
}
    }
    }

パネル 2、カードレイアウトが機能したかどうかのテスト用

    package invers;
    import java.awt.Color;
    import javax.swing.JPanel;

    public class InstellingenPaneel extends JPanel
    {
public InstellingenPaneel()
{
    this.setBackground(new Color(178,143,79));
}
    }
4

2 に答える 2

0

setContentPaneメソッドを使用して JFrame contentpane を設定しようとしました か?

JFrame と contentpane オブジェクトを宣言していることがわかりますが、それを設定したり、パネルで設定したりしていません。

于 2013-04-22T15:08:53.557 に答える
0

settingsButton は PANEL 1 クラスのボタンであることに注意してください。メインクラスで作成されていないため、エラーが発生します。

あなたが得ているエラーはcardlayout、内部クラスで参照されているため、最終的にする必要があることを示していると思います。この問題を解決するにfinalは、cardlayout の作成時にキーワードを挿入するだけです。

2 つ目 - はい、パネル タイプを個別のクラスで定義し、それらのクラスのインスタンスを作成して JFrame に配置することは、まったく問題ありません (ベスト プラクティスに沿っています)。

3 番目に、適切な場所 (つまり、ActionListener 内部クラスのメソッドとして) に「あのひどい actionPerformed」があるように見えますが、それに@Override注釈を追加する必要があります。それが何を意味するか知っていますか?

最後に、別のクラスから settingsButton を参照する場合は、いくつかのオプションがあります。settingsButton を JFrame クラスのインスタンス変数として宣言し、JFrame への参照を InversMainPanel クラスのコンストラクターに渡すことをお勧めします。

public InversMainPanel(InversMain im) {
    ...
    im.settingsButton.  //do something with the settings button.

次のようなクラスInversMainPanelからを作成しました。InversMain

   InversMainPanel imp = new InversMainPanel(this)

呼び出し元のインスタンスをthis参照します。InversMain

これについてさらに説明できることがあれば教えてください。

PS: Java 命名規則に関するこのチュートリアルを確認してください。

于 2013-04-22T15:04:03.173 に答える