-1

少し前にも似たような質問をしたので、サイトを悪用しているのかと思って申し訳ありませんが、今回の質問はちょっと違います。JFrame と JPanel を作成した Main クラスがあります。混乱を避けるために、すべての JButton を保持する「Buttons」という別のクラスを作成しました。JButton を mainPanel (私の JPanel) に追加したいのですが、ボタンのクラスから mainPanel へのアクセスを継承するのに問題があります。

ここに私のメインクラスがあります:

package main;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Main extends JPanel {
    public Main() {
        Main m = new Main();
        //The main window
        JFrame Main = new JFrame("Don't Blink");
        Main.setSize(500,500);
        Main.setResizable(false);
        Main.setVisible(true);
        Main.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        //The main window's panel
        JPanel mainPanel = new JPanel(); //I want to add buttons to this panel from the Buttons class
        mainPanel.setSize(500, 500);
        mainPanel.setVisible(true);
        Main.add(mainPanel);
    }

    public static void main(String[] args) {
         Main m = new Main();
        }
}

ボタンクラス:

package main;

import javax.swing.JButton;

public class Buttons extends Main {
    public Buttons(Main m) {
        //The button to get a job
        JButton workButton = new JButton("Get a job");
        mainPanel.add(workButton);//The mainPanel here gives me
                                      //the error "mainPanel can
                                      //not be resolved". It 
                                      //doesn't seem to recoginze
                                      //mainPanel
    }
}
4

3 に答える 3

1

ここにはいくつかの問題があります... まず第一に、これはひどい OOP 設計ですが、見てみましょう...

クラス変数として mainPanel を追加する必要があります

public class Main extends JPanel {
  JPanel mainPanel;

クラススコープに入れたいので、型を宣言しません。

this.mainPanel = new JPanel(); // I want to add buttons to this panel from the Buttons class

Buttons で呼び出そうとしていますが、Main コンストラクターでローカルに宣言しただけです。

new Main 内で new Main を呼び出しています。これは無限再帰で終わると思います。

Main m = new Main();Main コンストラクターから削除します。

Buttons で Main を継承するのは良いことではないと思いますが、本当にそれが必要な場合、Main は Buttons について知りません。とにかくメインを拡張しているので、メインクラスからメインメソッドを削除し、代わりにボタンクラスに追加します。

  public static void main(String[] args) {
    Buttons m = new Buttons();
  }

ここで、ボタンは引数として Main が必要であると主張していますが、別の Main ではなく Main を呼び出したいので奇妙です。Buttons コンストラクターから引数 Main を削除します。その場合、mainPanel がないと思うかもしれませんが、Buttons は既に Main クラスであるため、mainPanel もあります。

于 2013-10-02T18:52:25.827 に答える
0

OOP の観点からは、これはかなり奇妙で、正しくないように思えます。

私の意見では、このために別のクラスを作成するべきではなく、Mainクラス内にメソッドだけを作成し、パネルの参照をそれに渡します。

public class Main extends JPanel{

    public Main(){

        Main m = new Main();

            //The main window
            JFrame Main = new JFrame("Don't Blink");
            Main.setSize(500,500);
            Main.setResizable(false);
            Main.setVisible(true);
            Main.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

            //The main window's panel
            JPanel mainPanel = new JPanel(); //I want to add buttons to this panel from the Buttons class
            mainPanel.setSize(500, 500);
            mainPanel.setVisible(true);
            Main.add(mainPanel);

            addTheButtons(mainPanel); //this does the heavy lifting 
    }

    private addTheButtons(JPanel mainPanel){

        //The button to get a job
        JButton workButton = new JButton("Get a job");
        mainPanel.add(workButton); 

    }
}

これは、他のクラスでボタンを作成するロジックを再利用したくない限り機能しますが、私の経験では、この粒度の UI コードはあまり再利用されません...

于 2013-10-02T18:47:49.383 に答える
0

まず第一に、Main のように大文字で変数名を付けることは悪い習慣です。キャメルケースを使用します。

これには継承を使用しないでください。次のようにメソッドを定義することをお勧めします。

private Container getButtonContainer() {
    final JPanel buttonPanel = new JPanel(...);

    ...

    buttonPanel.add(button1);
    buttonPanel.add(button2);

    return buttonPanel;
}

次に、このパネルをメイン パネルに追加します。

于 2013-10-02T18:52:06.690 に答える