2

私は Java で Swing をまったく扱ったことがありません。私はそれを試しています。サイズを変えられないセットレイアウトを作りたい。Layout managersに複数を追加するために使用することを提案するものをたくさん見てきましJPanelsJFrame

ただし、私が見たレイアウト マネージャーに関するすべてのチュートリアルでは、ユーザーが画面のサイズを変更できると述べています。私が望むレイアウトには、左側に沿って長方形があり、下に沿って細い長方形があり、残りのスペースを占める 3 番目の長方形があります。絶対レイアウトを使用して試してみましたが、うまくいきません。

import java.awt.Color;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;


public class Test extends JFrame {

    public Test() {
        JPanel rect1 = new JPanel();
        rect1.setBounds(101, 650, 900, 50);
        rect1.setBackground(Color.RED);
        getContentPane().add(rect1);

        JPanel rect2 = new JPanel();
        rect2.setBounds(0, 650, 100, 1000);
        rect2.setBackground(Color.BLUE);
        getContentPane().add(rect2);

        JPanel rect3 = new JPanel();
        rect3.setBounds(101, 700, 900, 950);
        rect3.setBackground(Color.GREEN);
        getContentPane().add(rect3);

       setTitle("TEST");
       setSize(1000, 700);

       setLocationRelativeTo(null);
       setDefaultCloseOperation(EXIT_ON_CLOSE);        
    }


    public static void main(String[] args) {

        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                Test ex = new Test();
                ex.setVisible(true);
            }
        });
    }
}

このレイアウトの Jframe に 3 つの Jpanel を適切に作成するのを手伝ってもらえますか (すべて異なる色で)。

4

5 に答える 5

4

BorderLayoutベースとして、またはGridBagLayout.

欠けている主な部分は、レイアウトマネージャーがコンポーネントの優先/最小/最大サイズを使用する(またはレイアウトマネージャーに応じて使用できる)という事実です

基本的には、カスタム コンポーネント (のようなものから拡張JPanel) を定義し、そのメソッドをオーバーライドしてgetPreferredSize、必要な値を返すことです。レイアウト マネージャーによっては、メソッドgetMaximumSizegetMinimumSizeメソッドもオーバーライドする必要がある場合があります。

例えば...

基本的に、これは「デフォルト」のサイズと、画面のサイズが変更されたときに何が起こるかを示しています...

ここに画像の説明を入力ここに画像の説明を入力

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class FixedSizeLayout {

    public static void main(String[] args) {
        new FixedSizeLayout();
    }

    public FixedSizeLayout() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        public TestPane() {
            setLayout(new GridBagLayout());
            GridBagConstraints gbc = new GridBagConstraints();
            gbc.gridx = 0;
            gbc.gridy = 0;

            add(new ContentPane(), gbc);
            gbc.gridx++;
            add(new LeftPane(), gbc);
            gbc.gridwidth = 2;
            gbc.gridx = 0;
            gbc.gridy = 1;
            add(new BottomPane(), gbc);

        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(200, 200);
        }

    }

    public class ContentPane extends JPanel {

        public ContentPane() {
            setBackground(Color.GREEN);
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(150, 150);
        }

        @Override
        public Dimension getMinimumSize() {
            return getPreferredSize();
        }

        @Override
        public Dimension getMaximumSize() {
            return getPreferredSize();
        }

    }

    public class BottomPane extends JPanel {

        public BottomPane() {
            setBackground(Color.RED);
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(200, 50);
        }

        @Override
        public Dimension getMinimumSize() {
            return getPreferredSize();
        }

        @Override
        public Dimension getMaximumSize() {
            return getPreferredSize();
        }

    }

    public class LeftPane extends JPanel {

        public LeftPane() {
            setBackground(Color.BLUE);
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(50, 150);
        }

        @Override
        public Dimension getMinimumSize() {
            return getPreferredSize();
        }

        @Override
        public Dimension getMaximumSize() {
            return getPreferredSize();
        }

    }
}

必要に応じて、画面のサイズを変更できないようにすることもできますが、私はあなたを好きではありません。私は、レイアウト マネージャーの機能を使用して、ユーザーがコンテンツをどのように表示したいかを決定できるようにすることを好みます...可能な場合...しかし、それは私だけです (サイズ変更できないウィンドウは好きではありません一部のダイアログの場合)

于 2013-10-31T03:19:58.807 に答える
3

setResizable() を使用できます。以下のコードフラグメントを参照してください。

   setResizable(false); // this will not allow resizing
   setLocationRelativeTo(null);
   setDefaultCloseOperation(EXIT_ON_CLOSE);  
于 2013-10-31T03:17:26.513 に答える
1

AbsoluteLayout行きません。そうしないでください。あなたはおそらく を探していBorderLayoutます。詳細については、チュートリアル: BorderLayout の使用方法を確認してください。JFrameサイズを変更したくない場合は、その上で使用frame.setResizable(false);してください。

于 2013-10-31T03:19:28.860 に答える
0

MigLayout を使用して、BorderLayout.CENTER を「ドック センター」に置き換えることができます。

JPanel panel = new JPanel(new MigLayout(" insets 0"));
panel.add(greenPanel, "dock center");
panel.add(redPanel, "dock south");
panel.add(bluePanel, "dock east");

MigLayout の詳細については、http: //www.miglayout.com/QuickStart.pdfをご覧ください。

于 2019-01-02T18:19:32.447 に答える