2

希望するメイン GUI

基本的に、これを生成するにはどうすればよいですか?これは の仕事だと確信していGridBagLayoutますが、「アクション ペイン」と「メニューバー」のサイズを適切に調整する方法について頭を悩ませることはできません。赤と黒の線は、この場合に使用すると思われるグリッド (3x3) を示していますが、完全に間違っている可能性があり、別の構成でそれを行う方法がある可能性があります。weightxweightygridheight、 のgridwidth値をいじろうとしましたGridBagConstraintsが、ここで目的を達成できません。

2 番目の赤い線は、フレームの下半分の高さのちょうど 3 分の 1 であることに注意してください。

これは、3x6 グリッドを使用しようとする私の最新の試みです (c は GridBagConstraints オブジェクト、characterPortraits にはすべてのポートレートが含まれ、currentScreen は「アクション ペイン」です)。

c.fill = GridBagConstraints.BOTH;
    c.weightx = 0.25;
    c.weighty = (1/6);
    c.gridx = 0;
    c.gridy = 0;
    c.gridheight = 3;
    pane.add(characterPortraits.get(0), c);  

    c.gridx = 2;        
    pane.add(characterPortraits.get(1), c);          

    c.gridx = 0;
    c.gridy = 3;
    c.gridheight = 3;
    pane.add(characterPortraits.get(2), c);  

    c.gridx = 2;        
    pane.add(characterPortraits.get(3), c);

    //c.fill = GridBagConstraints.NONE;
    c.weightx = 1.0;
    c.weighty = 1.0;
    c.gridx = 1;
    c.gridy = 0;
    c.gridheight = 3;
    pane.add(currentScreen, c);    

代わりに、これにより、象限の下 3 分の 1 に各ポートレートが生成され、アクション ペインは、私が望むように、中央の列の 4/6 ではなく 5/6 を使用します。どんなアイデアでも役に立ちます。ありがとう!-B.

編集: このアプリケーションはウィンドウ サイズを固定するように設計しています。これは設計が悪いと言う人もいるかもしれませんが、私は実際に Swing コンポーネントの感触をつかみ、少なくとも固定ウィンドウで希望どおりに動作することを確認しようとしています。適切なサイズ変更を最大化できると思いますが、それだけです。

4

2 に答える 2

5

JMenuBarただし、最も奇妙な位置に ,を追加するのは奇妙に思えました。あなたができることですが、この行であなたが言及した困難を克服するために

Instead, this produces each portrait in the bottom third of its quadrant, and the 
Action Pane taking 5/6 of the center column instead of 4/6, like I want it to.

JPanelこの場所に 1 つを追加し、この追加されたにActionPaneandを追加して、目的の結果を達成することです。そのため、これを実現する方法を示すために、この場所に追加しました。JmenuBarJPanelcenterPanel

この出力があなたが望んでいたものであることを願っています:

出力

そして、この出力を担当するコードは次のとおりです。

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

public class GridBagPanelLayout
{
    private JPanel portrait1;
    private JPanel portrait2;
    private JPanel portrait3;
    private JPanel portrait4;
    private JPanel centerPanel;

    private JPanel actionPane;

    private void createAndDisplayGUI()
    {
        JFrame frame = new JFrame("GridBag JPanel Layout Example");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        /*
         * This JPanel will serve as the 
         * Content Pane, for the JFrame.
         */
        JPanel contentPane = new JPanel();
        contentPane.setOpaque(true);
        contentPane.setBackground(Color.WHITE);
        contentPane.setLayout(new GridBagLayout());

        GridBagConstraints gbc = new GridBagConstraints();
        gbc.anchor = GridBagConstraints.FIRST_LINE_START;
        gbc.fill = GridBagConstraints.BOTH;
        gbc.gridx = 0;
        gbc.gridy = 0;
        gbc.weightx = 0.33;
        gbc.weighty = 0.5;
        gbc.gridheight = 2;

        portrait1 = new JPanel();
        portrait1.setOpaque(true);
        portrait1.setBackground(Color.BLUE);
        portrait1.setBorder(
                    BorderFactory.createMatteBorder(
                            2, 2, 2, 2, Color.WHITE));
        contentPane.add(portrait1, gbc);

        gbc.gridx = 1;
        gbc.gridy = 0;
        gbc.weighty = 1.0;
        gbc.gridheight = 4;

        centerPanel = new JPanel();
        centerPanel.setOpaque(true);
        centerPanel.setBackground(Color.WHITE);
        centerPanel.setLayout(new GridBagLayout());
        GridBagConstraints constCenter = new GridBagConstraints();
        constCenter.anchor = GridBagConstraints.FIRST_LINE_START;
        constCenter.fill = GridBagConstraints.BOTH;
        constCenter.gridx = 0;
        constCenter.gridy = 0;
        constCenter.weightx = 1.0;
        constCenter.weighty = 0.975;

        actionPane = new JPanel();
        actionPane.setOpaque(true);
        actionPane.setBackground(Color.MAGENTA);
        actionPane.setBorder(
                    BorderFactory.createMatteBorder(
                            2, 2, 2, 2, Color.WHITE));
        centerPanel.add(actionPane, constCenter);

        constCenter.gridx = 0;
        constCenter.gridy = 1;
        constCenter.weighty = 0.025;

        centerPanel.add(getMenuBar(), constCenter); 
        contentPane.add(centerPanel, gbc);  

        gbc.gridx = 2;
        gbc.gridy = 0;
        gbc.weighty = 0.5;
        gbc.gridheight = 2;

        portrait3 = new JPanel();
        portrait3.setOpaque(true);
        portrait3.setBackground(Color.BLUE);
        portrait3.setBorder(
                    BorderFactory.createMatteBorder(
                            2, 2, 2, 2, Color.WHITE));
        contentPane.add(portrait3, gbc);

        gbc.gridx = 0;
        gbc.gridy = 2;
        //gbc.weighty = 0.5;
        //gbc.gridheight = 2;

        portrait2 = new JPanel();
        portrait2.setOpaque(true);
        portrait2.setBackground(Color.BLUE);
        portrait2.setBorder(
                    BorderFactory.createMatteBorder(
                            2, 2, 2, 2, Color.WHITE));
        contentPane.add(portrait2, gbc);

        gbc.gridx = 2;
        gbc.gridy = 2;
        gbc.weighty = 0.5;
        gbc.gridheight = 2;

        portrait4 = new JPanel();
        portrait4.setOpaque(true);
        portrait4.setBackground(Color.BLUE);
        portrait4.setBorder(
                    BorderFactory.createMatteBorder(
                            2, 2, 2, 2, Color.WHITE));
        contentPane.add(portrait4, gbc);

        frame.setContentPane(contentPane);
        frame.setSize(500, 300);
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    private JMenuBar getMenuBar()
    {
        JMenuBar menuBar = new JMenuBar();

        JMenu fileMenu = new JMenu("File");
        fileMenu.setOpaque(true);
        fileMenu.setBackground(Color.BLACK);
        fileMenu.setForeground(Color.WHITE);
        JMenuItem newItem = new JMenuItem("NEW");
        JMenuItem openItem = new JMenuItem("OPEN");
        fileMenu.add(newItem);
        fileMenu.add(openItem);

        JMenu editMenu = new JMenu("Edit");
        editMenu.setOpaque(true);
        editMenu.setBackground(Color.BLACK);
        editMenu.setForeground(Color.WHITE);
        JMenuItem redoItem = new JMenuItem("Redo");
        JMenuItem undoItem = new JMenuItem("Undo");
        editMenu.add(redoItem);
        editMenu.add(undoItem);

        JMenu viewMenu = new JMenu("View");
        viewMenu.setOpaque(true);
        viewMenu.setBackground(Color.BLACK);
        viewMenu.setForeground(Color.WHITE);
        JMenuItem zInItem = new JMenuItem("Zoom In");
        JMenuItem zOutItem = new JMenuItem("Zoom Out");
        viewMenu.add(zInItem);
        viewMenu.add(zOutItem);

        menuBar.add(fileMenu);
        menuBar.add(editMenu);
        menuBar.add(viewMenu);
        menuBar.setOpaque(true);
        menuBar.setBackground(Color.BLACK);     

        return menuBar;
    }

    public static void main(String... args)
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            public void run()
            {
                new GridBagPanelLayout().createAndDisplayGUI();
            }
        });
    }
}
于 2012-06-23T04:39:46.650 に答える
4

私は GridBagLayout の大ファンではありません。各コンポーネントは最大 11 個の制約を持つことができます。維持するのが難しく、同じ制約オブジェクトを再利用すると、意図しない結果が生じる可能性があります。

代わりに、さまざまな種類のレイアウトをネストすることを好みます。私には、あなたは明らかに持っています:

  1. A BorderLayoutWestCenter、およびEastパネル付き
  2. Westパネル内には、 GridLayout2 行 1 列 (ポートレート 1 と 2) があります。
  3. Eastパネル内には、 GridLayout- 2 行 1 列 (ポートレート 3 および 4) があります。
  4. Centerパネル内にはBorderLayoutCenterコンポーネント (アクション ペイン) とSouthコンポーネント (メニューバー) を持つ別の があります。

これに対する唯一の制限は、West パネルと East パネルが論理的に接続されていないことです。ポートレート 1、2、3、4 がすべて同じサイズであれば問題ありません。サイズが異なる場合、西パネルと東パネルの形状が異なる場合があります。

于 2012-06-23T02:05:18.533 に答える