2

JLabel と 3 つのボタンで構成される単純なスイング アプリケーションがあります。3 つのボタンは、JFrame と JLabel にある独自の JPanel にあります。JPanel はフローレイアウト マネージャーを使用してボタンを水平方向に配置し、JFrame は BorderLayout マネージャーを使用して JLabel と JPanel を垂直方向に配置します。

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

    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);
4

2 に答える 2

5

たぶん試してみてください

((JFrame)myButton.getTopLevelAncestor()).pack();

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

于 2010-11-24T18:05:26.510 に答える
1

GUI ソフトウェアを学習する場合と同様に、実験が最善です。ネストされた JPanels で BorderLayouts をいじってみてください。

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

レイアウトスキームでは、次のようなものにする必要があります。

  1. 最上位コンテナ: JFrame
  2. JFrame には、BorderLayout を持つ JPanel (これを JPanel 1 と呼びます) が含まれています。
  3. 3 つのボタンは、SEPARATE jPanel (JPanel 2) に配置する必要があります。JPanel 1 は、3 つのボタンを BorderLayout.CENTER として追加する必要があります。このようにして、ボタンの幅や高さが変わると、ウィンドウのサイズが変更されます。
  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/を確認してください。これは、フォームの作成に沿ったものです。

于 2010-11-24T17:56:05.513 に答える