- 締切済み
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するかたちにする方法はありますか? 何か良い方法はないでしょうか?
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- pyridoxin
- ベストアンサー率0% (0/0)
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)
よく読みましたね。> ANo.2 まずは変数名や関数名が一文字、あるいは二文字などという「ありえない」状況を直して下さい。 ボタンなら変数名は button とそのまま書きましょう。連番で bt4 などと意味のない名前にするのもやめて下さい。 終了ボタンなら quit_button などどする。 三日後に自分のコードを読めば実感できますが、 例えばメソッド d() が何処で使われているか検索しようとした時に後悔するでしょう。 というわけで main しか見てませんが、gamenrun クラスを使用するときに new で生成してからメソッド d() を呼び出すことが利用者に課せられていますよね。 これは main にさせるのではなく gamenrun がその呼び出し順に対して責任を持つべきだと思います。 どの class で何をするべきかを切り分けましょう。
直接的な原因は、String S = tf.getText();ですね。ここで落ちてます。例外処理でcatchした部分でex.printStackTraceしてエラー内容をチェックしていればわかるはずなんですが……。この部分を、とりあえずString s;としておけば、一応起動はできるはずですね。 ただ、他にも問題がいろいろありそうなコードですね。mainがあるclass gamenがpublicでないので直しておきましょう。それから、クラス名が小文字なのも問題です。大文字で始まる名前に修正しておきましょう。 また、これは根本的な設計の話になってしまいますが、こういうときにnew JFrameしていろいろ作っていくのはかなり無理があるんじゃないですか。普通は、クラスをextends JFrameして、自身に組み込みをしていきます。いろいろと問題があるので、もう少しコードを整理して見直してみたほうがよいでしょう。
- koko_u_
- ベストアンサー率18% (459/2509)
>mainのクラスからgamenといったクラスをnewするかたちにする方法はありますか? そうしたければ、すればいいのでは? やってみて「~がうまく行かない」などあれば、それを書くべきです。
補足
失礼しました。以下のようにやってみたのですが表示されず終了してしまいました。 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){} } }