2010-11-24 10 views
2

私はJLabelと3つのボタンで構成される単純なスイングアプリケーションを持っています。 3つのボタンは、JLabelとともにJFrame内にある独自のJPanelにあります。 JPanelはflowlayoutマネージャを使用してボタンを水平に配置し、JFrameはBorderLayoutマネージャを使用してJLabelとJPanelを垂直に配置します。すべてのボタンを表示するためにJFrameのサイズを自動的に変更するにはどうすればいいですか?

私の問題は、私がアプリケーションを起動すると、使用中にボタンの1つのテキストが変化し、その幅が大きくなります。ただし、これに合わせてウィンドウのサイズが変更されず、ボタンの1つが消えます。私はpack()をもう一度呼び出すことを考えましたが、JFrameはコンストラクタ内のローカル変数です。また、プログラムのサイズを変更する必要はありません。私はGoogleやここで私を助けるために何かを見つけることができていないが、単純な解決策がなければならない、何が私は行方不明ですか?コードは以下のとおりです。

playButton = new JButton("Play"); 
    pauseButton = new JButton("Pause"); 
    stopButton = new JButton("Stop"); 
    curTrackLabel = new JLabel("No Track Selected"); 

    JFrame myFrame = new JFrame("MediaPlayer"); 
    myFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    myFrame.setTitle("MediaPlayer"); 
    myFrame.setLocation(400,300); 

    JPanel topPanel = new JPanel(); 
    topPanel.setLayout(new BorderLayout()); 
    myFrame.add(topPanel); 
    JPanel buttonPanel = new JPanel(new FlowLayout()); 

    buttonPanel.add(playButton); 
    buttonPanel.add(pauseButton); 
    buttonPanel.add(stopButton); 
    topPanel.add(buttonPanel, BorderLayout.CENTER); 
    topPanel.add(curTrackLabel, BorderLayout.NORTH); 

    playButton.addActionListener(new playButtonHandler()); 
    pauseButton.addActionListener(new pauseButtonHandler()); 
    stopButton.addActionListener(new stopButtonHandler()); 

    myFrame.pack(); 
    myFrame.setVisible(true); 

答えて

5

たぶん試みる

((JFrameの)myButton.getTopLevelAncestor())パック();

ここで、myButtonは、実行中にテキストが変更されたボタンです。

+0

+1、クール!私は今日新しい方法を学びます。過去に私はSwingUtilities.windowForComponent(...)を提案しました。 – camickr

+0

これはうまくいくようですが、うまくいきました:) – CalumMcCall

1

GUIソフトウェアを学ぶのと同じように、実験が最適です。入れ子にされたJPanelでBorderLayoutsを操作してみてください。

究極的には、BorderLayoutでJPanelを使用します(フローレイアウトはOKですが、実際にはウィンドウのサイズを変更すると叙述的に失敗します)。 BorderLayoutsの詳細については、http://download.oracle.com/javase/tutorial/uiswing/layout/border.htmlを参照してください。

今すぐあなたのレイアウトスキームのために、それはの線に沿って何かする必要があります:

  1. トップレベルコンテナ:JFrameの
  2. のJFrameはBorderLayoutを持つJPanelのを(この JPanelの1を呼び出します)が含まれています。
  3. 3つのボタンは、 セパレートjPanel(JPanel 2)にある必要があります。 JPanel 1は、3つのボタンを BorderLayout.CENTERとして追加する必要があります。このようにして、 のボタン がその幅および/またはhrightを変更すると、ウィンドウのサイズが変更されます。
  4. JLabelは、 BorderLayout.LINE_STARTとして追加する必要があります。

チュートリアル:http://download.oracle.com/javase/tutorial/uiswing/layout/border.htmlが役に立ちます。しかし、一般的には、以下を使用します。

  • 利用のJPanelと巣のJPanel、必要に応じて
  • BorderLayout.CENTERは、これが鍵です---サイズの変更に適応されます! (これを試してください)
  • JFrameはトップレベルのコンテナとしてのみ使用してください(より複雑なGUIの場合はこれが当てはまります)。

さらに柔軟性が必要な場合は、JGoodies:http://www.jgoodies.com/をご確認ください。これは、フォームを作成する行に沿っています。

+0

上記コードスニペットで述べたことを実装しましたが、ボタンのテキストの1つを長くすると、ウィンドウは同じサイズのままです。明らかに間違っていることは何ですか?とにかく、あなたの説明をありがとう、なぜjavaドキュメントは読みやすいようにすることはできません:P – CalumMcCall

関連する問題