3

私はギャンブルゲームをシミュレートすることになっている小さなプロジェクトに取り組んできました。残念ながら、で作業しているときにいくつかの奇妙な問題が発生しましたBoxLayout。私の知る限りでは、LayoutManagersは通常、任意のコンポーネントの推奨サイズを尊重します。ただし、以下のコードでは、そうでBoxLayoutはありません。

これまでの私のコードは次のとおりです。

import java.awt.*;
import javax.swing.*;



public class Main 
{
    public static void main(String[] args)
    {
      JFrame.setDefaultLookAndFeelDecorated(true);
      JFrame frame = new JFrame("Suit-Up");
      frame.setContentPane(makeGUI());
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.setSize(900,450);
      frame.setLocationRelativeTo(null);
      frame.setResizable(false);
      frame.setVisible(true);
    }

    public static JPanel makeGUI()
    {
      JPanel main = new JPanel();
      main.setMinimumSize(new Dimension(900,450));
      main.setBackground(Color.red);

      JPanel infoPanel = new JPanel();
      infoPanel.setLayout(new BoxLayout(infoPanel, BoxLayout.LINE_AXIS));
      infoPanel.setPreferredSize(new Dimension(900,60));
      infoPanel.setBackground(Color.green);
      main.add(infoPanel);

      JPanel infoText = new JPanel();
      infoText.setLayout(new BoxLayout(infoText, BoxLayout.PAGE_AXIS));
      infoPanel.add(infoText);

      JPanel moneyText = new JPanel();
      moneyText.setLayout(new BoxLayout(moneyText, BoxLayout.LINE_AXIS));
      infoText.add(moneyText);

      JPanel lastGameText = new JPanel();
      lastGameText.setLayout(new BoxLayout(lastGameText, BoxLayout.LINE_AXIS));
      infoText.add(lastGameText);

      JButton playAgain = new JButton("Play Again ($20)");
      playAgain.setPreferredSize(new Dimension(200,60));
      infoPanel.add(playAgain);

      JButton finish = new JButton("End Session");
      finish.setPreferredSize(new Dimension(200,60));
      infoPanel.add(finish);

      JPanel cardPanel = new JPanel();
      cardPanel.setLayout(new BoxLayout(cardPanel, BoxLayout.LINE_AXIS));
      main.add(cardPanel);

      return main;
    }
}

両方に優先サイズを指定してもJButton、サイズは変更されません。私も試しsetMaximumSize()ましsetMinimumSize()たが、どちらも効果がありませんでした。

私は明らかな何かを見落としていますか、それともこれは制限BoxLayoutですか?

4

1 に答える 1

2

「私の知る限りでは、LayoutManager は通常、任意のコンポーネントの推奨サイズを尊重します」 - 実際にはそうではありません。優先/最小/最大サイズは、レイアウト マネージャーがコンテンツを最適にレイアウトする方法を決定するために使用する「ヒント」にすぎません。レイアウト マネージャーは、必要に応じて単純に無視することができます。

JavaDocs から

BoxLayoutは、好みの幅 (水平レイアウトの場合) または高さ (垂直レイアウトの場合) でコンポーネントを配置しようとします。水平レイアウトの場合、すべてのコンポーネントが同じ高さでない場合、BoxLayout はすべてのコンポーネントを最も高いコンポーネントと同じ高さにしようとします。特定のコンポーネントでそれが不可能な場合、BoxLayout は、コンポーネントの Y 配置に従って、そのコンポーネントを垂直方向に配置します。デフォルトでは、コンポーネントの Y 位置合わせは 0.5 です。つまり、コンポーネントの垂直方向の中心は、Y 位置合わせが 0.5 の他のコンポーネントの垂直方向の中心と同じ Y 座標を持つ必要があります。

同様に、垂直レイアウトの場合、BoxLayout は列内のすべてのコンポーネントを最も幅の広いコンポーネントと同じ幅にしようとします。それが失敗した場合は、X 配置に従って水平方向に配置されます。PAGE_AXIS レイアウトの場合、コンポーネントのリーディング エッジに基づいて水平方向の配置が行われます。つまり、コンテナの ComponentOrientation が左から右の場合、X 配置値 0.0 はコンポーネントの左端を意味し、それ以外の場合はコンポーネントの右端を意味します。

于 2013-01-09T01:05:37.133 に答える