SwingでgetContentPaneのエラーです、お願いします

このQ&Aのポイント
  • java勉強中の方が、「型JFrameから非staticメソッドgetContentPane()にstatic参照することは出来ません」というエラーが発生しました。
  • コンテナの取得やパネルの追加、フレームの設定など、Swingを使用したプログラムで発生しています。
  • このエラーの原因を特定することができず、教えていただきたいと思っています。
回答を見る
  • ベストアンサー

SwingでgetContentPaneのエラーです、お願いします

 今晩は、java勉強中のものです、宜しくお願いします。  下のようなプログラムを組んでみましたが、「型JFrameから非staticメソッドgetContentPane()にstatic参照 することは出来ません」というエラーコードです。  原因が良く分かりません、どなたか教えて下さい。  いくら考えても原因がよく分かりません、宜しくお願いします。 ================================================================ public class Panel_train extends JFrame{ public static void main(String[] args) { Container cnt = getContentPane(); JPanel jpanel = new JPanel(); JTextArea jtext = new JTextArea("Hello World", 100, 50); jpanel.add(jtext); cnt.add(jpanel, BorderLayout.CENTER); JFrame frame = new JFrame("テスト"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(200, 100); frame.setVisible(true); } }

  • htgo
  • お礼率33% (407/1224)
  • Java
  • 回答数3
  • ありがとう数4

質問者が選んだベストアンサー

  • ベストアンサー
  • x_jouet_x
  • ベストアンサー率68% (162/236)
回答No.3

回答させて頂く前に1つ。 http://www.javadrive.jp/start/ などのJava初心者のためのサイトや書籍で、もう1度Javaの基礎(特にクラスの部分)を習得した方がいいかも知れませんね。 私自身、Javaを書くようになって10年近く経ちますが、これぐらい長期間Javaのプログラムを触っていると「当たり前」の考え方というか概念を噛み砕いて説明することが難しいです。 私の説明不足も否めないですが・・・すみません。 さて、 > コンストラクタはデフォルトで作成される場合もあると本には書いています。 これはですね。 自分でクラスを作成するときにコンストラクタを1つも書かないとコンパイラがコンパイル時にこのデフォルトコンストラクタを自動的に作成してくれるのです。 先の回答で「自作のクラスには必ずコンストラクタが必要になります。」と書いたのは、コンストラクタを1つも書かなくてもコンパイラによってデフォルトコンストラクタが作成されるので「クラスには必ずコンストラクタが存在する」という意味で書きました。 htgoさんが書かれたソースコードですが、自分でコンストラクタを書いていなければコンパイラによってデフォルトコンストラクタが作成されます。 これはmain()メソッドがある、ないに関わらず全てのクラスで共通しています。 > mainメソッドは実行時に一番に呼び出されるメソッドであれば一番に生成され、以後他の実行文が呼び出されていくのではないでしょうか。 はい、その考えで合っています。 今回のソースコードは、 ・JFrameクラスを継承している ・main()メソッドを持っている ・main()メソッド内で自分自身のインスタンスを生成している ということが混乱を招いているような気がします。 1度、下記のようなmain()メソッドを持ったMainクラスを作成して、Mainクラスからプログラムを実行させるようにしてみて下さい。 ---------- public class Main() { public static void main(String[] args) { Panel_train frame = new Panel_train("テスト"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(200, 100); frame.setVisible(true); } } ---------- このようにMainクラスとPanel_trainクラスの2つに分けた場合、Panel_trainクラスはどのように書かないといけないか考えてみて下さい。 # Panel_trainクラスのmain()メソッドは削除して下さいね。

htgo
質問者

お礼

 x_jouet_xさん、回答有り難うございます。  確かにクラス、コンストラクタの考え方の理解が不足しています。 なかなか詳しく説明している本とか サイトが見あたらなく、理解に苦労していますが、もう少し勉強してみます。  今後とも宜しくお願いします。

その他の回答 (2)

  • x_jouet_x
  • ベストアンサー率68% (162/236)
回答No.2

> "Panel_train"をインスタンス化してやったのに、何故このようなエラーが出るのでしょうか。 先の回答で私が書いたソースコードとhtgoさんが書かれているソースコードをよーく見比べてみて下さい。 Container cnt = getContentPane(); の処理を行っている場所が違いますよ。 htgoさんはpublic static void main()メソッドの中で、私はPanel_trainクラスのコンストラクタの中で書いていますよ。 「コンストラクトPanel_trainは未定義です」というエラーは、htgoさんがPanel_trainクラスの中で public Panel_train(String title) { ... } というString型の変数を引数に持つコンストラクタをまだ定義していないからです。Panel_trainクラスのような自作のクラスには必ずコンストラクタが必要になります。ただし例外として、そのクラスが下記のような引数を持たず何も処理しないコンストラクタしかない場合は何も記述する必要はありません。 /*-- 引数なし・何も処理しないコンストラクタ --*/ public Panel_train() { } なお私が書いたソースコードでは、 Panel_train frame = new Panel_train("テスト"); のようにタイトルの文字(テストのことです)を引数としてPanel_trainクラスのインスタンスを生成しているので、public Panel_train(String title)というコンストラクタを定義しています。 > "title"とはどのような意味でしょうか。 引数名自体は特に意味はありません。 単にコンストラクタpublic Panel_train(String title)の引数としているので、 public Panel_train(String title) { System.out.println(title); } のようにコンストラクタ内でその引数名で変数を使用することができます。 ちなみにJFrameクラス(それ以外のクラスもですが…)のjavadocをご覧になったことはありますか? 今回、Panel_trainクラスはJFrameクラスを継承したものなので、JFrameのjavadoc(特にコンストラクタ)をご覧になればコンストラクタpublic Panel_train(String title)で引数名をtitleとした理由が分かると思いますよ。 ・JFrameのjavadoc http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/javax/swing/JFrame.html

htgo
質問者

お礼

x_jouet_xさん、回答有難うございます。 >String型の変数を引数に持つコンストラクタをまだ定義していないからです。Panel_trainク >ラスのような自作のクラスには必ずコンストラクタが必要になります。 >ただし例外として、そのクラ>スが下記のような引数を持たず何も処理しないコンストラクタ >しかない場合は何も記述する必要はあ>りません。 >/*-- 引数なし・何も処理しないコンストラクタ --*/ >public Panel_train() { } 疑問点が2点ほどあります、宜しくお願いします。 コンストラクタはデフォルトで作成される場合もあると本には書いています。 今回の私のコードは、いきなりMainメッソドから始まっており、デフォルトコンストラクタが作成されるケースには 該当しないのでしょうか。 特段”super()”も呼び出してはいません。 (勿論コンストラクタが無ければ書くことも出来ないのですが) >自作のクラスには必ずコンストラクタが必要になります。 #この意味が良く理解できません。 また、”Container cnt = getContentPane()”は、mainメソッドの中で書いています、この違いがわかりません。 私の考えは、mainメソッドは実行時に一番に呼び出されるメソッドであれば一番に生成され、以後他の実行文 が呼び出されていくのではないでしょうか。 以上宜しくお願いします。

  • x_jouet_x
  • ベストアンサー率68% (162/236)
回答No.1

簡潔に言うと、staticメソッド(この場合は、public static void main())の中でJFrameクラスのインスタンス(非static)メソッドであるgetContentPane()を使用しているために出るエラーなのですが…。 ソースコードを拝見すると、JFrameを継承したクラス(Panel_train)でJTextAreaを表示したいようですね。 このような場合は一番手っ取り早い方法は、下記のようにPanel_trainクラスのコンストラクタの中にやりたい処理を書いてしまうことです。 ---------- public class Panel_train extends JFrame { public Panel_train(String title) throws HeadlessException { super(title); Container cnt = getContentPane(); JPanel jpanel = new JPanel(); JTextArea jtext = new JTextArea("Hello World", 100, 50); jpanel.add(jtext); cnt.add(jpanel, BorderLayout.CENTER); } public static void main(String[] args) { Panel_train frame = new Panel_train("テスト"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(200, 100); frame.setVisible(true); } } ---------- ただ、この方法だとやりたい処理が多くなってきた場合、コンストラクタの中がどんどん長くなってしまうので、Panel_trainクラスのprivateメソッドでやりたい処理を書いてコンストラクタの中でそのメソッドを呼び出すような作りにするとよりスマートなソースになります。 また、public static void main()メソッドは上記のようにJFrame(またはJFrameを継承したもの)を表示する処理だけ書きます。 ちなみに質問で挙げられていたソースだと、public static void main()メソッド内で新たにJFrameクラスのインスタンスを生成していますので、このままだと「テスト」というタイトルが付いた空のJFrameが表示されるだけですよ。 折角Panel_trainクラスを作ったんですから、Panel_trainクラスのインスタンスを生成しましょうね。 こういったソースを書くためには他人が作ったソースコードを見てみるのも勉強になりますよ。 頑張って勉強して下さい。

htgo
質問者

お礼

 x_jouet_xさん、有り難う御座います。  ところで、"JFrame frame = new JFrame("テスト")"を"Panel_train frame = new Panel_train("テスト")"に 変更してやりましたが、やはり「型JFrameから非staticメソッドgetContentPane()にstatic参照 することは出来ません」と、"Panel_train frame = new Panel_train("テスト")"の箇所で「コンスト ラクトPanel_trainは未定義です」というエラーコードです。 "Panel_train"をインスタンス化 してやったのに、何故このようなエラーが出るのでしょうか。  また、"public Panel_train(String title)"の"title"とはどのような意味でしょうか。 ====================================== public class Panel_train extends JFrame{ public static void main(String[] args) { Container cnt = getContentPane(); JPanel jpanel = new JPanel(); JTextArea jtext = new JTextArea("Hello World", 100, 50); jpanel.add(jtext); cnt.add(jpanel, BorderLayout.CENTER); Panel_train frame = new Panel_train("テスト"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(200, 100); frame.setVisible(true); } }

関連するQ&A

  • swingのJframeについて

    JFrameについて質問があるのですが import javax.swing.*; public class JFrameTest extends JFrame{ public static void main(String[] args){ JFrameTest frame = new JFrameTest(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setBounds(10, 10, 300, 200); frame.setTitle("タイトル"); frame.setVisible(true); } JFrameTest(){ JPanel p = new JPanel();   Container contentPane = getContentPane(); ContentPane.add(p);   pack(); } } このプログラムと import javax.swing.*; public class JFrameTest{ public static void main(String[] args){ JFrame frame = new JFrame("フレームのタイトル"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setBounds( 10, 10, 300, 200); frame.setVisible(true); JPanel p = new JPanel();   Container contentPane = frame.getContentPane(); frame.ContentPane.add(p);   frame.pack(); } } このプログラムは何が違うのでしょう? やってることはまったく一緒だと思ってたのですが、全然違うみたいです。 上のプログラムの JFrameTest(){ はコンストラクタと呼ばれるものなのでしょうか? しょぼい質問で申し訳ないのですが誰か教えていただけないでしょうか。

    • ベストアンサー
    • Java
  • JFrameのエラーの原因が分かりません。

     java初心者です、宜しくお願いします。  JFrameのコードを下記のように書いてやりましたが、「サーバーにデプロイするものが見つかり ません。」というエラーが出ます。   色々と参考書を見ながら勉強していますが、エラーの原因がさっぱりわかりません。    どなたか宜しくお願いします。 ============================================================================ public class JF4 extends JFrame { public void init() { Container cnt = getContentPane(); setBackground(Color.RED); setSize(400,400); setTitle("title"); setVisible(true); } } ================================================================================= public class JF4 extends JFrame { public void init() { Container cnt = getContentPane(); JPanel panel = new JPanel(); panel.setBackground(Color.RED); getContentPane().add(panel); setSize(400,400); setTitle("title"); setVisible(true); } }

  • JavaのSwingのレイアウト

    Swingを学習中ですが、うまくレイアウトできません。 添付した画像のようなレイアウトにしたいです。 作ってみたものは以下です。 import java.awt.BorderLayout; import java.awt.Color; import javax.swing.*; public class LayoutTest { public static void main(String[] args) { JFrame frame = new JFrame(); JPanel panel = new JPanel(); JTextField searchFiled = new JTextField("テキスト"); String[] comboboxString = {"C", "C++", "Java"}; JComboBox comboBox = new JComboBox(comboboxString); JButton button = new JButton("ボタン"); panel.add(comboBox, BorderLayout.EAST); panel.add(searchFiled, BorderLayout.CENTER); panel.add(button, BorderLayout.WEST); frame.add(panel, BorderLayout.PAGE_START); JPanel redPanel = new JPanel(); redPanel.setBackground(Color.RED); frame.add(redPanel); frame.setSize(700, 500); frame.setLocationRelativeTo(null); frame.setVisible(true); } }

    • ベストアンサー
    • Java
  • Eclipseから実行すると画像が読み込まれない

    下記のコードをEclipseから実行すると画像が読み込まれないのですが、コマンドプロンプトから実行すると画像が読み込まれます。 コードが同じなのに不思議です…。 原因はどんなことが考えられるのでしょうか? class test extends JFrame{ public static void main(String args[]){ test frame = new test("タイトル"); frame.setVisible(true); } test(String title){ setTitle(title); setBounds(100, 100, 500, 500); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JPanel p = new JPanel(); ImageIcon icon1 = new ImageIcon("img.jpg"); JLabel label1 = new JLabel(icon1); p.add(label1); Container contentPane = getContentPane(); contentPane.add(p, BorderLayout.CENTER); } }

    • ベストアンサー
    • Java
  • Jframeの中にJframeを表示させたい

    Jframeの中にボタンを作り、ボタンを押すとJInternalFrameではなくJframeを表示させるようにしたいんですが、なかなかできません。 検索したりしてサンプル探したんですが、 Jframeを表示させ、ラベルを貼ったりしたいんですが どなたかお願いします!! public class Browser extends JFrame{ public static void main(String args[]) { Browser frame = new Browser(); frame.setTitle(""); frame.setExtendedState(JFrame.MAXIMIZED_BOTH); frame.setVisible(true); } //ボタン private JButton bt = new JButton("~~"); public Browser() { bt.addActionListener(this); JToolBar tb = new JToolBar(); tb.setFloatable(false); getContentPane().add(tb, BorderLayout.NORTH); JPanel panel2 = new JPanel(); panel2.add(bt); panel2.setLayout(new FlowLayout(FlowLayout.LEFT)); tb.add(panel2); } //↓この辺りの処理の記述で頭が混乱してきました(泣 public class actionPerformed(ActionEvent e){ if(e.getSource() == bt){ Frame FW = new Frame(); FW.setSize(500,400); FW.setVisible(true); } } class Frame extends Frame{ public Frame(){ //コンストラクタの定義 } }

    • ベストアンサー
    • Java
  • キャレットの幅を設定したい。

    キャレットの幅を設定したい。 以下のソースで色を設定するメソッドはありますが、 キャレットの幅の設定の仕方が解りませんでした。 ご存じの方がおられましたら教えてください。 import java.awt.BorderLayout; import java.awt.Color; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JTextArea; class test extends JFrame{ public static void main(String args[]){ new test(); } test(){ this.setSize(300, 250); JPanel p = new JPanel(); JTextArea area2 = new JTextArea("test", 10, 10); area2.setCaretColor(Color.RED); p.add(area2); this.add(p, BorderLayout.CENTER); this.setVisible(true); } }

    • ベストアンサー
    • Java
  • JTextAreaを持ったJInternalFrameを作りたい

    swingでメモ帳を作っているのですが、 新規作成が押されるごとに新しい JTextAreaを持ったJInternalFrameを作りたいのです。 他にもコピーやJpopupメニューなども機能として 追加しているのですがそれらの機能も新しく作った JInternalFrameで機能するようにしたいんです。 参考になるサイトなど見たりしたんですが 自力では無理でした。。どなたかお願いします☆ public class NotePad extends JFrame{ JDesktopPane desktop = new JDesktopPane(); static JTextArea editArea = new JTextArea(); static NotePad frame = new NotePad(); public static void main(String[] args){ frame.setTitle("メモ帳"); frame.setSize(500,400); frame.setVisible(true); frame.setDefaultCloseOperation(EXIT_ON_CLOSE); } public NotePad(){ JScrollPane sp = new JScrollPane(editArea, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS); NewAction newAction = new NewAction(); JMenuBar mb = new JMenuBar(); JMenu mn1 = new JMenu("ファイル"); mn1.add(newAction); mb.add(mn1); setJMenuBar(mb); getContentPane().add(sp, BorderLayout.CENTER); } class NewAction extends AbstractAction{ NewAction(){ putValue(NAME, "新規ファイル作成"); public void actionPerformed(ActionEvent e){ JInternalFrame inframe = new JInternalFrame( true, true, true, true); JTextArea ta = new JTextArea(""); JScrollPane sp2 = new JScrollPane(ta, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS); inframe.getContentPane().add(spane) desktop.add(inframe); inframe.setVisible(true); }

    • ベストアンサー
    • Java
  •  型Containerのメソッドadd(String ,Compone

     型Containerのメソッドadd(String ,Component)は引数(JPanel ,String)に適用できません。  今晩は、java初心者です、エラーの意味が理解出来ません、宜しくお願い致します。  《A》というプログラムと《B》というプログラムで、クラスを「class MyPanel extends JPanel」と「class JPanel」に変えただけで、「型Containerのメソッドadd(String ,Component)は引数(JPanel ,String)に適用できません。」というエラーがでます。  一体何が原因でしょうか。  JPanelを継承したクラス(MyPanel)を呼び出すのか、そのまま、JPanelクラスを呼び出すのかの違いだけで、内容的には何も変わるところがないはずだと思うのですが。  意味が理解出来ません。 ======================================================================== 《A》 public class Sample extends JFrame { Sample() { this.setSize(300,200); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); MyPanel panel = new MyPanel(); this.add(panel , BorderLayout.CENTER); this.setVisible(true); } public static void main(String[] args) { new Sample(); } } class MyPanel extends JPanel { public void paintComponent(Graphics g) { g.setColor(Color.red); g.fillOval(50,50,100,100); } } ============================================================ 《B》 public class Sample extends JFrame { Sample() { this.setSize(300,200); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JPanel panel = new JPanel(); this.add(panel , BorderLayout.CENTER); this.setVisible(true); } public static void main(String[] args) { new Sample(); } } class JPanel { public void paintComponent(Graphics g) { g.setColor(Color.red); g.fillOval(50,50,100,100); } } =======================================================================

    • ベストアンサー
    • Java
  • javaのswingについて

    swingを使う場合、絶対mainの中で udp u=new udp(); JFrame frame = new JFrame("チャットプログラム"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // ウィンドウを閉じたときにアプリケーションを終了する frame.setJMenuBar(u.menuBar); frame.getContentPane().add(u.sp, "North"); frame.getContentPane().add(u.buttonPanel, "Center"); frame.getContentPane().add(u.tfPanel, "South"); frame.pack(); // ウィンドウを適切な大きさにする frame.setVisible(true); // ウィンドウを可視化する などをしないといけないのでしょうか? mainのクラスからgamenといったクラスをnewするかたちにする方法はありますか? 何か良い方法はないでしょうか?

  • JComboとJCheckとJPanelについて

    勉強しているのですが、書き方が全くわからないので、質問します。 この3つを使って図のようなプログラムをつくりたいのですが、どのように書いたらいいのでしょうか? ご教授お願いいたします。 中身をどのように書いたらいいのかまったくわからないんです・・・。 import java.awt.*; import javax.swing.*; public class HaitiRensyu extends JPanel{ public HaitiRensyu(){ setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); addCheckBox(); addComboBox(); addButtons(); } private void addCheckBox(){ JPanel cboxPanel = new JPanel(); add(cboxPanel); } private void addButtons() { JPanel btnPanel = new JPanel(); add(btnPanel); } private void addComboBox() { JPanel comboPanel = new JPanel(); add(comboPanel); } public static void main(String[] args){ JFrame frame = new JFrame("JPanel"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); HaitiRensyu h = new HaitiRensyu(); frame.add(h, BorderLayout.CENTER); frame.pack(); frame.setVisible(true); } }