web-dev-qa-db-ja.com

JFrame内のJPanel(固定サイズ)を適切に中央揃えするにはどうすればよいですか?

こんにちは、みんな!明らかにシンプルな問題を解決しようとしていますが、修正できません。私はJava/Swingライブラリを使用したサンプルアプリケーションに取り組んでいます。 JFrameとJPanelがあります。次の目的を達成したいだけです。

  1. JPanel[〜#〜] [〜#〜]はJFrame内で中央揃えにする必要があります。

  2. JPanel[〜#〜]必須[〜#〜][〜#〜]を常に持っている[〜#〜 ]で指定されるサイズ
    setPreferredSize()メソッド。このサイズでサイズを変更してはなりません。

GridBagLayoutを使用して試してみました。これは[〜#〜] only [〜#〜]の方法で実行できます。

以下のサンプルをご覧ください。

/* file StackSample01.Java */

import Java.awt.*;
import javax.swing.*;

public class StackSample01 {
    public static void main(String [] args) {

        JFrame frame = new JFrame();
        JPanel panel = new JPanel();
        panel.setPreferredSize(new Dimension(100, 100));
        panel.setBackground(Color.RED);  

        frame.setLayout(new GridBagLayout());
        frame.add(panel, new GridBagConstraints());
        frame.setSize(new Dimension(200, 200));
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);

    }
}

ここ スクリーンショット:

GridBagLayoutを使用して単純すぎることを行うことはしません。私はボックスを使用して最も簡単な解決策を試しましたが、これは機能しません:

サンプルコード:

/* file StackSample02.Java */

import Java.awt.*;
import javax.swing.*;

public class StackSample02 {
    public static void main(String [] args) {

        JFrame frame = new JFrame();
        JPanel panel = new JPanel();
        panel.setPreferredSize(new Dimension(100, 100));
        panel.setBackground(Color.RED); // for debug 

        panel.setAlignmentX(JComponent.CENTER_ALIGNMENT); // have no effect

        Box box = new Box(BoxLayout.Y_AXIS);

        box.add(Box.createVerticalGlue());
        box.add(panel);     
        box.add(Box.createVerticalGlue()); // causes a deformation

        frame.add(box);
        frame.setSize(new Dimension(200, 200));
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);

    }
}

ここ スクリーンショット、

何か案は?ありがとうございます :-)

16
IT.

BoxLayout setXxxSize()を保持するためにかなりでき、次にpanel.setMaximumSize(new Dimension(100, 100));を追加するだけです

あなたの出力は

setMinimumSizeによって削除されます)コンテナのサイズが...より大きい場合の通知)

enter image description hereenter image description hereenter image description here

import Java.awt.*;
import javax.swing.*;

public class CustomComponent12 extends JFrame {

    private static final long serialVersionUID = 1L;

    public CustomComponent12() {
        Box box = new Box(BoxLayout.Y_AXIS);
        box.setAlignmentX(JComponent.CENTER_ALIGNMENT);
        box.add(Box.createVerticalGlue());
        box.add(new CustomComponents12());
        box.add(Box.createVerticalGlue());
        add(box);
        pack();
        setTitle("Custom Component Test / BoxLayout");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setMaximumSize(getMinimumSize());
        setMinimumSize(getMinimumSize());
        setPreferredSize(getPreferredSize());
        setLocation(150, 150);
        setVisible(true);
    }

    public static void main(String[] args) {
        Runnable r = new Runnable() {

            @Override
            public void run() {
                CustomComponent12 main = new CustomComponent12();
            }
        };
        javax.swing.SwingUtilities.invokeLater(r);
    }
}

class CustomComponents12 extends JPanel {

    private static final long serialVersionUID = 1L;

    @Override
    public Dimension getMinimumSize() {
        return new Dimension(100, 100);
    }

    @Override
    public Dimension getMaximumSize() {
        return new Dimension(100, 100);
    }

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

    @Override
    public void paintComponent(Graphics g) {
        int margin = 10;
        Dimension dim = getSize();
        super.paintComponent(g);
        g.setColor(Color.red);
        g.fillRect(margin, margin, dim.width - margin * 2, dim.height - margin * 2);
    }
}
15
mKorbel

まず第一に、すべてに感謝します。

私の質問にもう一度答えて、私が選択したことをみんなに示します。以下のサンプルコードを参照してください。ご覧のとおり、目標を達成するために絶対に必要な最小限の手順のみを含めました。

/* file StackResponse.Java */

import Java.awt.*;
import javax.swing.*;

public class StackResponse {
    public static void main(String [] args) {

        JPanel panel = new JPanel();
        Dimension expectedDimension = new Dimension(100, 100);

        panel.setPreferredSize(expectedDimension);
        panel.setMaximumSize(expectedDimension);
        panel.setMinimumSize(expectedDimension);

        panel.setBackground(Color.RED); // for debug only

        Box box = new Box(BoxLayout.Y_AXIS);

        box.add(Box.createVerticalGlue());
        box.add(panel);     
        box.add(Box.createVerticalGlue());

        JFrame frame = new JFrame();
        frame.add(box);
        frame.setSize(new Dimension(200, 200));
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        frame.setMinimumSize(frame.getMinimumSize());   // cannot be resized-

        frame.setVisible(true);

    }
}

ここ スクリーンショットを見ることができます。

問題が解決しました。本当にありがとうございました。

それ

5
IT.

gridBagLayoutで「FixedPanel」という名前のパネルを作成し、優先サイズをフレームサイズに設定してから、フレームをFixedPanelに追加します。

Frame = new JFrame("CenterFrame");         
Frame.setLocation(0, 0);
Frame.setSize(new Dimension(400,400));//dim

JPanel FixedPanel = new JPanel(new GridBagLayout());
FixedPanel.setPreferredSize(Frame.getSize());

JPanel myPanel = new JPanel();
myPanel.setPreferredSize(new Dimension(100,100));
myPanel.setBackground(Color.BLACK);

FixedPanel.add(myPanel);
Frame.add(FixedPanel);
Frame.setVisible(true);  
2
Ehsan Jelodar