• 締切済み

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するかたちにする方法はありますか? 何か良い方法はないでしょうか?

  • Java
  • 回答数4
  • ありがとう数0

みんなの回答

回答No.4

newできます。私はmainメソッドに押し込めるのが嫌いなので 引数のないデフォルトコンストラクタで書きます。例えば public class SwingSample extends JFrame{  public static void main(final String args[]) {   new SwingSample();  }  public SwingSample(){   super("チャットプログラム");   udp u=new udp();   this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);   this.setJMenuBar(u.menuBar);   this.getContentPane().add(u.sp, "North");   this.getContentPane().add(u.buttonPanel, "Center");   this.getContentPane().add(u.tfPanel, "South");   this.pack(); // ウィンドウを適切な大きさにする   this.setVisible(true); // ウィンドウを可視化する  } } と書いたりします

  • koko_u_
  • ベストアンサー率18% (459/2509)
回答No.3

よく読みましたね。> ANo.2 まずは変数名や関数名が一文字、あるいは二文字などという「ありえない」状況を直して下さい。 ボタンなら変数名は button とそのまま書きましょう。連番で bt4 などと意味のない名前にするのもやめて下さい。 終了ボタンなら quit_button などどする。 三日後に自分のコードを読めば実感できますが、 例えばメソッド d() が何処で使われているか検索しようとした時に後悔するでしょう。 というわけで main しか見てませんが、gamenrun クラスを使用するときに new で生成してからメソッド d() を呼び出すことが利用者に課せられていますよね。 これは main にさせるのではなく gamenrun がその呼び出し順に対して責任を持つべきだと思います。 どの class で何をするべきかを切り分けましょう。

noname#94983
noname#94983
回答No.2

直接的な原因は、String S = tf.getText();ですね。ここで落ちてます。例外処理でcatchした部分でex.printStackTraceしてエラー内容をチェックしていればわかるはずなんですが……。この部分を、とりあえずString s;としておけば、一応起動はできるはずですね。 ただ、他にも問題がいろいろありそうなコードですね。mainがあるclass gamenがpublicでないので直しておきましょう。それから、クラス名が小文字なのも問題です。大文字で始まる名前に修正しておきましょう。 また、これは根本的な設計の話になってしまいますが、こういうときにnew JFrameしていろいろ作っていくのはかなり無理があるんじゃないですか。普通は、クラスをextends JFrameして、自身に組み込みをしていきます。いろいろと問題があるので、もう少しコードを整理して見直してみたほうがよいでしょう。

  • koko_u_
  • ベストアンサー率18% (459/2509)
回答No.1

>mainのクラスからgamenといったクラスをnewするかたちにする方法はありますか? そうしたければ、すればいいのでは? やってみて「~がうまく行かない」などあれば、それを書くべきです。

ken0129012
質問者

補足

失礼しました。以下のようにやってみたのですが表示されず終了してしまいました。 import java.awt.event.*; import javax.swing.*; class gamenrun implements ActionListener { private JMenuBar menuBar; private JTextField tf; //テキストフィールド private JPanel tfPanel; //テキストフィールドを配置 // 送信文字 String S = tf.getText(); JTextArea ta= new JTextArea(10, 20);; //テキストエリア private JScrollPane sp; //テキストエリアを配置 //ボタンの定義 private JPanel buttonPanel; private JButton bt; private JButton bt4; //コンストラクタ public gamenrun()throws Exception { //メニューの生成 menuBar = new JMenuBar(); JMenu editMenu = new JMenu("メニュー"); JMenuItem copyItem = new JMenuItem("コピー"); JMenuItem pasteItem = new JMenuItem("貼り付け"); editMenu.add(copyItem); editMenu.add(pasteItem); menuBar.add(editMenu); //各ボタンの生成 buttonPanel = new JPanel(); bt = new JButton("ユーザー名を変更"); bt4 = new JButton("終了"); bt.addActionListener(this); bt4.addActionListener(this); buttonPanel.add(bt); buttonPanel.add(bt4); //テキストフィールドを生成 tf = new JTextField("",20); tf.setActionCommand("text"); //アクションコマンド設定 //テキストフィールドを配置するパネルを生成 tfPanel = new JPanel(); tfPanel.add(tf); //テキストエリアの生成 ta.setLineWrap(true); //折り返しあり ta.setWrapStyleWord(false); //文字単位の折り返し ta.setTabSize(4); //TABキーの空白数 ta.setEditable(false); //編集不可 //テキストエリアを配置するスクロールペイン sp = new JScrollPane(ta); //イベント通知を登録 tf.addActionListener(this); copyItem.addActionListener(this); pasteItem.addActionListener(this); } //終了ボタン void OnExit() { } //イベント処理 public void actionPerformed(ActionEvent evt) { String name = ""; String command = evt.getActionCommand(); //アクションコマンドに応じた処理 if(command.equals("text")) { ta.append(name+">"+tf.getText() + "\n"); //テキストエリアに追加 } else if(command.equals("Copy")) { tf.copy(); //テキストフィールドをコピー } if(evt.getSource() ==bt) { String str = "ユーザー名を入力してください"; //文字入力用ダイアログボックスを表示 name = JOptionPane.showInputDialog(str); } if (evt.getSource() ==bt4) { OnExit(); } } public void d() { JFrame frame = new JFrame("チャットプログラム"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // ウィンドウを閉じたときにアプリケーションを終了する frame.setJMenuBar(menuBar); frame.getContentPane().add(sp, "North"); frame.getContentPane().add(buttonPanel, "Center"); frame.getContentPane().add(tfPanel, "South"); frame.pack(); // ウィンドウを適切な大きさにする frame.setVisible(true); // ウィンドウを可視化する System.out.println("うりr"); } } class gamen { public static void main(String[] args) { try{ gamenrun ga =new gamenrun(); ga.d(); System.out.println("うりr"); }catch(Exception ex){} } }

関連する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
  • 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); } }

    • ベストアンサー
    • Java
  • javaのpanelが表示されません

    下記のプログラムを作ったんですが、eclipseで実行するとフレームは表示されますが、空のフレームのような状態で、panelやボタンなどは表示されません。mainとは別のクラスで作成してるからなんでしょうか?よろしくお願いします。 import java.awt.BorderLayout; import java.awt.Container; import java.awt.Dimension; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.table.DefaultTableModel; public class Table0 { public static void main(String[] args) { new Frame0(); } } class Frame0{ JFrame frame; JPanel panel; JScrollPane jsp; JTable table; DefaultTableModel dtm; public Frame0(){ frame=new JFrame("table"); frame.setBounds(30, 30, 300, 200); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); table=new JTable(8,5); jsp=new JScrollPane(table); jsp.setPreferredSize(new Dimension(250, 70)); panel=new JPanel(); panel.add(jsp); Container c=frame.getContentPane(); c.add(panel,BorderLayout.CENTER); } }

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

    public class Main extends JFrame{ public static void main(String args[]){ Main frame = new Main("test"); frame.setVisible(true); } Main(String title){ setTitle(title); setBounds(100, 100, 300, 250); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JMenuBar menubar = new JMenuBar(); JMenu menu1 = new JMenu("File"); menubar.add(menu1); JMenuItem menuitem1 = new JMenuItem("New"); menu1.add(menuitem1); setJMenuBar(menubar); } public void paint(Graphics g){ } } いまウィンドウにメニューバーを表示させようとして上のプログラムで実行させたんですが、画像のようにメニューバーが表示されません。 そこでpaintの引数を消してみたところ表示されます。 しかし、paint内で画像の表示の処理もしたいので引数がないといけません。 どうしたらいいでしょうか?

    • ベストアンサー
    • Java
  • 「削除するか、クラスパスの正しいサブディレクトリにあるかを確認してください」とコンパイルエラーになってしまいます!

    下記のソースコードをコンパイルすると 「HelloWorldSwing.java:6: JFrame にアクセスできません。 クラスファイル .\JFrame.java は不正です。 ファイルにクラス JFrame が含まれていません。 削除するか、クラスパスの正しいサブディレクトリにあるかを確認してください。 JFrame frame = new JFrame("HelloWorldSwing");」 と表示されてしまいエラーになってしまいます。 どなたか、分かる方がいましたらアドバイスください!! <HelloWorldSwing.java>--------------------------- import javax.swing.*; public class HelloWorldSwing { public static void main(String[] args) { JFrame frame = new JFrame("HelloWorldSwing"); final JLabel label = new JLabel("Hello World"); frame.getContentPane().add(label); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.pack(); frame.setVisible(true); } } -------------------------------------------------

    • ベストアンサー
    • Java
  • addとremoveActionListener

    以下のプログラムは作っているプログラムの簡易版で、他のクラスからaddActionListenerを追加しようとしているですが、やり方が分かりません。 どうプログラミングすればいいか教えてください。 あと、removeActionListenerを使いたいのですが、これについて書かれているサイトが少なく、使い方がよくわからないので、こちらも教えて欲しいです。 import javax.swing.JFrame; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; import javax.swing.JPanel; public class Test1 extends JFrame { public Test1(){ super("test1"); Set set=new Set(this); setBounds(100,100,806,659); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setResizable(false); add(set); JMenuBar menubar = new JMenuBar(); JMenu menu1=new JMenu("メニュー"); menubar.add(menu1); JMenuItem menuitem1=new JMenuItem("終了"); menu1.add(menuitem1); setJMenuBar(menubar); } public static void main(String[] args){ new Test1().setVisible(true); } } class Set extends JPanel{ Set(final JFrame frame){ /*ここにaddを入れたかった frame.menuitem1.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e){ System.exit(0); } });*/ //removeActionListener 使用方法不明 } }

    • ベストアンサー
    • Java
  • java swing での質問です。

    javaのプログラミングをeclipseでしているのですが swingで行き詰ってしまいました。 タブペインを使いタブパネルを作り、その中にボタンを配置したのですが、 ボタンの位置をsetBoundsで動かすことができませんでした。 他の命令を使わなければならないのでしょうか? プログラミング自体が初心者のため、説明に不備があると思いますが 助けていただけると幸いです。 ひどいプログラミングかと思いますが張らせていただきました package gui; import java.awt.*; import javax.swing.*; public class ReisyokuMenu extends JFrame{ /*serialVersionUID*/ private static final long serialVersionUID=1L; /*コンポーネント作成*/ JButton syokuzaiBtn = new JButton("食材一覧"); JButton syoumiBtn = new JButton("賞味期限順"); JButton bunruiBtn = new JButton("分類"); JButton returnBtn=new JButton("Topへ"); JPanel tabPanel1 = new JPanel(); JPanel tabPanel2 = new JPanel(); JTabbedPane tabbedpane = new JTabbedPane(); public ReisyokuMenu(){ /*Closeボタンでアプリケーションが終了しないように設定*/ setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); /*フレームサイズを変更できないように設定*/ setResizable(false); /*フレームコンテナのインスタンスを生成*/ Container cPane = getContentPane(); /*レイアウトマネジャを利用しない(座標を指定する)*/ cPane.setLayout(null); setLocationRelativeTo(null); setSize(400, 380);//setBoundsはy、x、幅、高さを指定するのでsetLocationRelativeToで位置指定をする為に使用。 setTitle("一人暮らし支援ツール");//アプリケーションタイトルを入れる tabbedpane.addTab("食材を見る", tabPanel1); tabbedpane.addTab("食材を探す", tabPanel2); tabPanel1.add(syokuzaiBtn); tabPanel1.add(syoumiBtn); tabPanel1.add(bunruiBtn); syokuzaiBtn.setLocation(50, 80);//「選択」ボタン syoumiBtn.setBounds(10,10,325,120); bunruiBtn.setBounds(10,270,90,40); tabPanel2.add(new JLabel("食材名:")); tabPanel2.add(new JTextField("", 10)); setContentPane(tabbedpane); } public void setVisible(boolean isVisible){ if(isVisible){ /*フレームの表示位置を指定(x,y)*/ setLocation(200,200); } /*フレームを表示*/ super.setVisible(isVisible); } }

  • メニューバーのプログラム

    javaで、メニューバーの項目を選んだら動作するプログラムを試しに組んでみようとしたのですがうまくいきません。 どう組めばいいか教えてください。 メニューバーの項目を選んだあとに出てくるメニューを選ぶと動作するプログラムは検索してすぐ出てくるのですが…。 下のプログラムはメニューバーのEndを押すと終了する、にならなかったプログラムです。 import java.awt.Container; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JFrame; import javax.swing.JMenu; import javax.swing.JMenuBar; class Test1 extends JFrame{ public static void main(String args[]){ Test1 frame = new Test1("タイトル"); frame.setVisible(true); } Test1(String title){ setTitle(title); setBounds(100, 100, 300, 250); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JMenuBar menubar = new JMenuBar(); JMenu menu1 = new JMenu("End"); menu1.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e){ System.exit(0); } }); menubar.add(menu1); setJMenuBar(menubar); Container contentPane = getContentPane(); } }

    • ベストアンサー
    • Java
  • javaのフレームにサイズがセットされてない?

    前回、http://okwave.jp/qa/q8069621.htmlで質問しました。 回答をもとにframe.setvisible(true)をコンストラクタの最後にするとうまくいき回答を締め切ったんですが・・・。 しかし、mainメソッドにframe.setvisible(true)を書くとフレームのタイトル部分だけとなり、 サイズがセットされないまま実行したときと同じようになってしまいます。 なぜでしょう?よろしくお願いします。 import java.awt.BorderLayout; import java.awt.Container; import java.awt.Dimension; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.table.DefaultTableModel; public class Table0{ public static void main(String[] args) { Frame0 test=new Frame0(); test.setVisible(true); } } class Frame0 extends JFrame{ JFrame frame; JPanel panel; JScrollPane jsp; JTable table; DefaultTableModel dtm; public Frame0(){ frame=new JFrame("table"); frame.setBounds(30, 30, 300, 200); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); table=new JTable(8,5); jsp=new JScrollPane(table); jsp.setPreferredSize(new Dimension(250, 70)); panel=new JPanel(); panel.add(jsp); Container c=frame.getContentPane(); c.add(panel,BorderLayout.CENTER); } }

    • ベストアンサー
    • Java
  • 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

専門家に質問してみよう