4

名と姓のユーザー入力を受け取り、2 つを組み合わせたウェルカム メッセージを出力するフォームを作成しようとしています。入力内容を 1 つのグリッド パネルにグループ化し、[Go] ボタンとメッセージを表示するテキスト フィールドを別のパネルにグループ化し、BorderLayout を使用して 1 つのフレーム内に両方を入れ子にしたいと考えました。

一般的なレイアウト:

(3x2 グリッド)

First Name: __________________________  
Last Name:  __________________________  
Age:        _______________

「GO BUTTON」「Welcome Mark Summers」

教授は、私の問題である 1 つの .java ファイルですべてを望んでいます。私は通常、これらのものを分離してからクラスを拡張し、問題はありません。私がやろうとしているのは、入力パネルと出力パネルをコンストラクターの下に保存してから、メインの下に作成することです

JFrame frame = new JFrame();

その後

add(new CalebBreckonHW3(320,120));

これにより、700x700 JFrame「フレーム」内に 320x120 パネルを配置します。静的コンテキストから非静的メソッド add(java.awt.Component) を参照できないというエラー メッセージが表示されます。メインを非静的に設定できないか、エラーが発生します。

誰かが私を正しい方向に向けることができますか?

import java.awt.*;
import javax.swing.*;

public class CalebBreckonHW3 extends JFrame {
    private JButton jbtGreet = new JButton("Greet Me");
    private JLabel firstOprLbl = new JLabel("First name");
    private JLabel lastOprLbl = new JLabel("Last name");
    private JLabel ageOprLbl = new JLabel("Age");
    private JTextField jtfFirst = new JTextField(10);
    private JTextField jtfLast = new JTextField(15);
    private JTextField jtfAge = new JTextField(3);
    // I'll get to the action events after I get this down
    private JTextField jtfGreet = new JTextField("Welcome firstname, lastname");

    public CalebBreckonHW3(int height, int width) {
        setLayout(new BorderLayout());
        setSize(height, width);
        JPanel inputPanel = new JPanel();
        inputPanel.setLayout(new GridLayout(3,2,0,5));
        jtfGreet.setEditable(false);
        inputPanel.add(firstOprLbl);
        inputPanel.add(jtfFirst);
        inputPanel.add(lastOprLbl);
        inputPanel.add(jtfLast);
        inputPanel.add(ageOprLbl);
        inputPanel.add(jtfAge);
    }

    public static void main(String[] args) {
        JFrame frame = new JFrame();
        frame.setTitle("Greeting App");
        frame.setSize(700,700);
        frame.setLocationRelativeTo(null);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);

        add(new CalebBreckonHW3(320,120));
    }
}

編集: add ステートメントの前にフレームを追加すると、静的エラーは解消されますが、「コンテナーにウィンドウを追加しています」というエラーが表示されます

4

1 に答える 1

7

問題はあなたextendJFrameクラスからのクラスですが、あなたはあなた自身のクラスを開始JFramemain()ます. a を拡張せず、次のようにします。add()staticadd()JFrame

public class CalebBreckonHW3  {

    public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {

        @Override
        public void run() {
        JFrame frame = new JFrame();
        frame.setTitle("Greeting App");
       // frame.setSize(700,700); //not recommened
        frame.setLocationRelativeTo(null);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

         JPanel panel=new JPanel(/*set layout if needed*/); 
         //panel.add(new JButton("Hello")); //add components to panel

        frame.getContentPane().add(panel);//why did you add your JFrame again???? so I guess you'd wanna add a JPanel or something with the components you need.

        frame.pack();
        frame.setVisible(true);
       }

    });
 }
...
}

また、常に EDT (すべての UI コンポーネントが配置されるイベント ディスパッチ スレッド) を作成SwingUtilities.invokeLater();JFrameますgetContentPane().add();。もう1つ、JframeにJframeを追加するのはなぜですか? ご覧のとおり、追加の例を示しましたJPanel

編集:

グローバル変数を作成すると、 etcJFrameを使用できます。frame.setLayout()

ただし、現在のコードを機能させたい場合は、次のようにします。

public class CalebBreckonHW3  extends JFrame{

    public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {

        @Override
        public void run() {
        new CalebBreckonHW3().createandShowUI();
       }

    });
 }
 private void createAndShowUI() {
        setTitle("Greeting App");
        //setSize(700,700); //not recommened
        setLocationRelativeTo(null);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

         JPanel panel=new JPanel(/*set layout if needed*/); 
         //panel.add(new JButton("Hello")); //add components to panel

        getContentPane().add(panel);//why did you add your JFrame again???? so I guess you'd wanna add a JPanel or something with the components you need.

        pack();//this will override setsize and use LayoutManager
        setVisible(true);     
 }
...
}

ただし、a の拡張JFrameは推奨されません

于 2012-09-14T17:00:32.897 に答える