• ベストアンサー

【Java】モーダルDLG内でリストを表示

Javaを学習し始めて間もない初心者です。よろしくお願いします。 ======================================== 開発環境:Eclipse SDK(Version: 3.5.0) 開発言語:Java ======================================== にて、プログラムを作成しています。 メインDLGの中に配置したボタンを押下したタイミングで、 モーダルDLGを開き、そのDLG内にリストを表示させたいのですが、 参考サイトなどを見ながら、とりあえずモーダルDLGは表示されましたが、 リストが表示されません。 下記に作成ソースを記載しますので、解決法をご存知の方おられましたら、 どこが悪く、どう修正すれば良いかについて、ご教示お願い致します。 なお、当方学習中の身ですので、より良いコードを書くために、 その他の指摘などももしあれば幸いです。 【ソースコード】 import javax.swing.*; import java.awt.BorderLayout; import java.awt.Dialog; import java.awt.Frame; import java.awt.event.*; import java.awt.*; public class TestList extends JFrame implements ActionListener{ Dialog dlg; Frame frm; public static void main(String[] args){ TestList frame = new TestList(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setBounds(10, 10, 400, 100); frame.setTitle("リスト表示"); frame.setVisible(true); } TestList(){ { // リスト表示ボタンを追加 JButton btn = new JButton("リストDLGを表示"); btn.addActionListener(this); JPanel p2 = new JPanel(); p2.add(btn); getContentPane().add(p2, BorderLayout.CENTER); } } // ボタン押下イベントを取得する関数 public void actionPerformed(ActionEvent e){ // リスト表示ボタンが押下された時 if (frm == null) { frm = new Frame("リスト"); frm.setSize(200 , 200); frm.setVisible(true); String list_n[] = {"テスト1", "テスト2", "テスト3", "テスト4", "テスト5"}; JList list = new JList(list_n); dlg = new Dialog(frm, "リスト" , true); JScrollPane sp = new JScrollPane(); sp.getViewport().setView(list); sp.setPreferredSize(new Dimension(200, 80)); JPanel p = new JPanel(); p.add(sp); dlg.add(p, BorderLayout.CENTER); } } }

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

  • ベストアンサー
回答No.3

よく考えずにいきなりプログラム書いてるから自分でもわからないことになってるんですよ。 自分が何をどう作りたいか一度紙に書いて整理してからプログラムを書くことを奨めます。 変数dlg  これはリストを格納したダイアログですね。 変数frm  これが空のフレームです。 空のフレームを表示したくないなら、この変数frmを使わなきゃいいんですよ。 えっ、ダイアログをモーダルにするのにオーナーのFrameが必要? JavaDocでJFrameの親クラスを確認するといいですよ。

zigen8513
質問者

お礼

ご回答ありがとうございます。 JFrameの親クラスがFrameなのですね。 試したところ、frmを用いずに、thisを渡すことで、 dlg = new Dialog(this, "リスト" , true); にて表示させることが出来ました。

その他の回答 (2)

回答No.2

気づいたとこだけ。 ・packageがない。(Java5以降はコンパイルエラーになる。) ・TestList()に不要な括弧「{」「}」がある。 ・actionPerformedはActionEventを拾うメソッドで、  このプログラムでは「リストDLGを表示」しかないので  「actionPerformed呼び出し」=「リスト表示ボタンが押下された時」  となるが、ActionEventが複数発生する場合などはActionEventクラスの  getActionCommandメソッドや、getSourceメソッドを使用して場合分け  するので、普段からやっておいた方が良い。 ・frm==nullの場合のみで表示しようとしているが、  このままだとfrmがnull以外の場合に表示されない。

zigen8513
質問者

お礼

ご回答ありがとうございます。 actionPerformed関数内で、どこからのイベントか判断して、 分岐処理をするのですね。参考になります。

回答No.1

dlg.add(p, BorderLayout.CENTER); の後に dlg.setSize(100,200); dlg.setVisible(true); を追加してみてください。

zigen8513
質問者

補足

ご回答ありがとうございます。 追加したところ、リストが表示されたDLGが表示されましたが、 その裏側にも、空のDLGが表示されています。。(図参照) この空のDLGを表示させずに、リストのDLGのみ表示させるには、 どう修正すれば良いのでしょうか? 重ねての質問申し訳ありませんが、ご回答お願い致します。

関連するQ&A