0

私は自分のプログラム用のGUIを作成することから始めているJavaの初心者であり、私は立ち往生しJFramesていJPanelsます。私の目標はJFrame、いくつかを含むものを作成するJPanelsことであり、すべてJPanelに独自のクラスがあります。

スタートしましたが、うまくいかないようです。私のコードは次のとおりです。

これはJFrameクラスです。

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

public class TestFrame extends JFrame{

    private static final long serialVersionUID = 1L;
    private JFrame f;

    public TestFrame(){
        f = new JFrame("Test");
        f.setVisible(true);
        f.setSize(600, 400);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JPanel p = new TestPanel();
        p.setVisible(true);
        f.add(p);
    }

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

そしてこれはJPanelクラスです:

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

public class TestPanel extends JPanel {

    private static final long serialVersionUID = 1L;
    private JButton b;
    private JTextField t;

    public TestPanel(){
        b = new JButton("bla");
        t = new JTextField("blaadda");
        add(b);
        add(t);
        setVisible(true);
    }

}
4

3 に答える 3

3

コンストラクターは新しいJFrameを作成してはなりません。クラス(TestFrame)は、ウィンドウの作成に使用するものであり、JFrameクラスではありません。他のエラーが発生している可能性がありますが、最も明白なエラーは

public TestFrame(){
    f = new JFrame("Test");
    f.setVisible(true);
    f.setSize(600, 400);
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    JPanel p = new TestPanel();
    p.setVisible(true);
    f.add(p);
}

する必要があります

public TestFrame(){
    //Don't create a new JFrame, you're already creating a TestFrame!
    //call all methods on the TestFrame, not the JFrame
    setVisible(true);
    setSize(600, 400);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    JPanel p = new TestPanel();
    p.setVisible(true);
    add(p);
}

TestPanelコンストラクターは良さそうです。ただし、コンストラクターの一時変数ではなく、TestFrameフィールドにパネルを作成することをお勧めします。

次に、次のようにウィンドウを作成します。

  SwingUtilities.invokeLater(new Runnable()
  {
      public void run()
      {
          new TestFrame();
      }
  }

最後に、他のすべてが失敗した場合setEnabled(true)は、コンストラクターを呼び出してみてください。

これがお役に立てば幸いです。それ以来、SwingをOpenGLに移しましたが、それがどれほど苛立たしいことかを覚えています。

于 2012-12-28T23:24:59.847 に答える
0

コンストラクターsetVisibleの最後のメソッドとして次のようにする必要があります。TestFrame

f.setVisible(true);

JPanelまた、フレーム自体が表示されるようになると、フレームによってすべての子コンポーネントが表示されるため、これを呼び出す必要はありません。

p.setVisible(true);

したがって、この行は削除できます。


また、TestFrame拡張していJFrameます。これにより2つのフレームが作成され、そのうちの1つは表示されません。コンストラクターでフレームを作成するだけで十分です。

于 2012-12-28T23:18:18.520 に答える