5

ここに画像の説明を入力してください

GridBagLayoutを使用して、写真のようなStatusBarを作成しています。私には4つの領域があるので、最初の領域にボタンがあり、2番目の領域に情報メッセージがあり、さらに2つの領域が必要です(コーナーを作成するために5つ目の領域もあります)。

コンテンツは常に同じ幅のボタンであるため、ボタン領域は完全にフィットします。コーナーエリアも同様です。情報領域には、使用可能なすべてのスペースを確保する必要があります。3番目と4番目の領域は、画面サイズに関係なく、固定値である必要があります。

どうやってやるの?

私の現在のコードは次のとおりです。

public MyStatusBar() {
        setLayout(new GridBagLayout());
        setPreferredSize(new Dimension(getWidth(), 23));
        GridBagConstraints c = new GridBagConstraints();

        botonDispositivo = new JButton("");
        this.setText(0, "Disconnected");
        URL imageUrl = getClass().getResource("resources/22x22/dispositivo01.png");
        this.setButtonImg(imageUrl);
        this.setButtonEnabled(false);


        c.gridx = 0;
        c.gridy = 0;
        c.fill = GridBagConstraints.BOTH;
        c.anchor = GridBagConstraints.WEST;
        c.gridwidth = 1;
        c.gridheight = 1;
        this.add(botonDispositivo, c);

        c.insets= new Insets(0,10,0,0);
        c.gridx ++;
        c.gridy = 0;
        c.weightx = 0.7;
        c.fill = GridBagConstraints.HORIZONTAL;
        msgLabel = new JLabel("");
        msgLabel.setPreferredSize(new Dimension(500, msgLabel.getHeight()));
        this.add(msgLabel, c);
        this.setText(1, "Waiting for potentiostat conection");

        c.gridx ++;
        c.gridy = 0;
        c.weightx = 0.0;
        c.fill = GridBagConstraints.NONE;
        this.add(new SeparatorPanel(Color.GRAY, Color.WHITE), c);

        c.gridx ++;
        c.gridy = 0;
        c.fill = GridBagConstraints.NONE;
        c.weightx = 0.0;
        overErrorLabel = new JLabel("");
        overErrorLabel.setSize(new Dimension(150, overErrorLabel.getHeight()));
        this.add(overErrorLabel, c);
        //this.setText(2, "");

        c.gridx ++;
        c.gridy = 0;
        c.weightx = 0.0;
        c.fill = GridBagConstraints.NONE;
        this.add(new SeparatorPanel(Color.GRAY, Color.WHITE), c);

        c.gridx ++;
        c.gridy = 0;
        c.weightx = 0.0;
        c.fill = GridBagConstraints.NONE;
        c.anchor = GridBagConstraints.EAST;
        timeLabel = new JLabel("");
        timeLabel.setMinimumSize(new Dimension(150, timeLabel.getHeight()));
        //timeLabel.setMaximumSize(new Dimension(150, timeLabel.getHeight()));
        this.add(timeLabel, c);
        //this.setText(3, "");


        JPanel rightPanel = new JPanel(new GridBagLayout());
        c.gridx ++;
        c.gridy = 0;
        c.weightx = 0.0;
        c.fill = GridBagConstraints.BOTH;
        rightPanel.add(new JLabel(new AngledLinesWindowsCornerIcon()), c);
        rightPanel.setOpaque(false);

        c.gridx ++;
        c.gridy = 0;
        c.fill = GridBagConstraints.BOTH;
        this.add(rightPanel, c);

        setBackground(SystemColor.control);
      }
4

3 に答える 3

12

さまざまなラベルの優先、最小、最大などのサイズを設定します。必要なのは、サイズ変更するラベルの制約の重みX>0とfillparam = HORIZONTALを設定し、サイズ変更したくないラベルのweightX=0とfill-NONEを設定することだけだと思います。

また、ipadxを使用して、ラベルの最小サイズを指定します。

于 2011-07-27T10:19:44.523 に答える
4

GUI への出力をより適切かつ簡単にするためにはBorderlayout

JPanel#setPrefferedSize(200, 30);for JButtonwithIconおよび JLabel put にWEST area

JPanel#setPrefferedSize(200, 30); (右パネル) へEAST area

別のJPanelものをCENTER area

于 2011-07-27T10:24:32.707 に答える
3

GridBagLayout 内のセルの幅 (または高さ) を固定したい場合は、これに対する有効な解決策があります。(x,y) のセルの幅を固定したいが、その中の JLabel には可変コンテンツがあり、実行時に変更する必要があるとします。GridBagLayout を使用すると、JLabel のサイズを変更する必要がある場合に他のコンポーネントが再配置されるため、含まれているセルのサイズが強制的に変更されます。これに対抗するには、次のいずれかを実行できます。

  • x 番目のセルにダミーの JPanel が含まれるレイアウトに余分な行 (y + 1) を追加し、その JPanel で を呼び出すことができます.setPreferredSize(new Dimension(desiredWidth, 0));
  • 同じですが、preferredSize を設定する代わりに、このダミー パネルを追加するときに使用される GridBagConstraints オブジェクトにインセットを設定します。したがって、固定幅が必要な場合は、gbc.insets = new Insets(0,preferredWidth,0,0);またはを実行するだけですgbc.insets = new Insets(0,0,0,preferredWidth);。このように、パネル自体の寸法は (0,0) ですが、含まれるセルは指定した幅に強制されます (インセットはコンポーネントから見た外部パディングであるため)。

最初のものでは setPreferredSize() を呼び出す必要がありますが、LayoutManager のタスクをいじっているため、これは常に不快に感じます。したがって、私は後者のソリューションを好みますが、ダミー パネルにはサイズがないため、セルを視覚化することはできません。前者のソリューションでは、パネルに背景色を指定することでセルを表示できます。

このアプローチの利点は、JLabel のサイズ、特に表示前に不明な高さの設定について気にする必要がないことです。どの高さが必要か (プラットフォーム依存、フォント依存など) がわからないため、JLabel に preferredSize を設定することはできません。追加するだけで、ダミー行をダミー パネルで使用すると、JLabel を含むセルが強制的に の幅になりdesiredWidthます。

このソリューションは、JLabel の幅が を超えない場合に機能desiredWidthします。その場合、セルも大きくなるためです。これを解決するために、いつでも JLabel に maximumSize を設定できます (ここでは、不明な高さの問題はありません。最大の高さについては、Integer.MAX_VALUE を使用できます)。

高さについても同じことが言えます。ダミー列を導入し、問題が発生する行のセルにディメンション = (0, preferredHeight) のダミー JPanel を追加するだけです。

このアプローチの欠点: ダミー コンポーネントを使用する必要がありますが、これは最善の方法ではありませんが、ここでは非常にうまく機能します。

于 2013-03-04T12:34:17.553 に答える