2016-11-24 4 views
1

テストの理由として、パネルとそのメインアプリケーションフレームの内容でJDialogウィンドウを開こうとしました。私はすでにそこに何かを持っていたので、JDialogs contentPaneを単純に私が渡したものに設定できるかどうかを見たいと思っていました。だから、simplyfied形で、これは一緒に来た:JFrameとJDialogの間にコンテナを渡すとパネルが欠落しますか?

testsforSO.java:

import java.awt.BorderLayout; 
import java.awt.EventQueue; 
import java.awt.Point; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.JButton; 
import javax.swing.JDialog; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class testsforSO extends JFrame { 

    private static final long serialVersionUID = -3890178393751567629L; 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       try { 
        testsforSO frame = new testsforSO(); 
        frame.setSize(300, 300); 
        frame.setVisible(true); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 
    } 

    public testsforSO() { 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setTitle("I am the Frame"); 
     getContentPane().setLayout(new BorderLayout(0, 0)); 

     JPanel panel = new JPanel(); 
     panel.setLayout(null); 

     JButton btnRestart = new JButton("Restart"); 
     btnRestart.setBounds(10, 10, 50, 50); 
     btnRestart.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent arg0) { 
       testsforSO.main(null); 
       dispose(); 
      } 
     }); 
     panel.add(btnRestart); 
     getContentPane().add(panel); 
     repaint(); 

// -----------DELETE These comments------------- 
//  JDialog myDialg = new JDialog(this); 
//  myDialg.setContentPane(panel); 
//  myDialg.setVisible(true); 
//  myDialg.setSize(300,300); 
//  myDialg.setLocation(new Point(250, 250)); 
//  myDialg.setTitle("I am Dialog from within the script"); 

     myDialog.main(panel); 
    } 
} 

とmyDialog.java:

import java.awt.Container; 
import java.awt.EventQueue; 

import javax.swing.JDialog; 

public class myDialog extends JDialog { 

    private static final long serialVersionUID = 7079322237622743228L; 

    public static void main(Container myContainer) { 
     EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       try { 
        myDialog frame = new myDialog(myContainer); 
        frame.setVisible(true); 
        frame.setContentPane(myContainer); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 
    } 

    public myDialog(Container myContainer) { 
     setContentPane(myContainer); 

     getContentPane().setLayout(null); 

     setBounds(200,200,200,200); 

    } 

} 

私はそれが同様に再起動ボタンを含んでいるでしょう仮定のメインフレームを開始ダイアログが行うように。しかし興味深いことに、それはボタン付きのダイアログだけでした。
しかし、それを押すと、メインフレームが適切に再開され、2番目のダイアログが設定され、ボタンが再び含まれていました。今回はメインフレームにもボタンがありましたが、何の機能もありませんでした。それをクリックすることは絶対に何もしません。

次に、メインアプリケーションコード(コメント行を参照)にダイアログを直接追加し、アプリケーションを再起動すると、そのクラスのダイアログだけがボタンを表示した場合、その動作が変わるかどうかを確認しました。これを打つことさえも正しく再開されましたが、孤独な宣言されたダイアログ以外の他のウィンドウにはボタンは表示されません。

私はここで何が間違っていますか?また、このようにしてもコードが正しく動作するようにはどうすればできますか?

答えて

3

スイングコンポーネントは1つのコンテナにのみ存在することができ、コンテナ内のコンポーネントの視覚的な残量が表示されることがありますが、実際のコンポーネントは最後に追加されたコンテナにのみ存在します。

私は、ダイアログとjframeで同じコンテンツペインコンポーネントを使用したい場合は、contentPaneを作成するためのファクトリメソッドを作成し、それを使用して2つのユニークで同一のcontentPaneを作成します。

また、ヌルレイアウトの使用について何も言及していない場合は、私は残念です。ヌルレイアウトとsetBounds()は、複雑なGUIを作成する最も簡単で最良の方法のようにSwing初心者のように思えるかもしれませんが、Swing GUIを使用すると、より多くの深刻な問題が発生します。 GUIのサイズが変更されたときにコンポーネントのサイズを変更することはありません。これらのコンポーネントは、拡張または維持するロイヤルウィジェットであり、スクロールペインに配置すると完全に失敗し、元のプラットフォームとは異なるすべてのプラットフォームまたは画面解像度で表示されます。例えば

私はあなたのコードを実行したときに、これは私が見たダイアログです:

enter image description here

をあなたはハード私のプラットフォーム上でそのテキストを表示するには小さすぎるようにボタンのサイズをコード化されました。レイアウトマネージャを使用していて、最上位のウィンドウにpack()を呼び出した場合、ボタンは適切に表示されます。

+0

です。早速のご返事ありがとうございます!だから、 'public Container panelFactory(){/ * make and return Container * /}のようなもので、新しいものを取得したいときに呼び出すでしょう...フレームに表示されているこのボタンは本当に私を混乱させました。 – geisterfurz007

+0

@ geisterfurz007:それはJFrame内にあっただけですが、それは見ただけですが、ダイアログを作成した後にJFrameを再ペイントすると、消えてしまう可能性があります。たとえば、コードを実行すると、ダイアログのボタンを押すと、JFrameのボタンがすばやく表示されます。 –

+0

@ geisterfurz007:サイドの問題:あなたがしているときにメインメソッドを呼び出すコードもないでしょう。 –

関連する問題