17

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

  1. JPanelは、JFrame の中央に配置する必要があります。

  2. JPanelは常にsetPreferredSize () メソッドで指定されたサイズでなければなりません。このサイズ未満にサイズ変更してはなりません。

私は GridBagLayout を使用してみました: それは私ができる唯一の方法です

以下のサンプルを参照してください。

/* 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 を使用することはありません。Box を使用して最も簡単な解決策を試しましたが、これは機能しません。

サンプルコード:

/* 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);

    }
}

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

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

4

6 に答える 6

16

BoxLayoutは setXxxSize() を保持するためにきれいにできます。panel.setMaximumSize(new Dimension(100, 100));

そしてあなたの出力は

setMinimumSize によって削除されました(コンテナのサイズが ... より大きい場合は注意してください)

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

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);
    }
}
于 2011-08-28T23:27:02.330 に答える
6

初めまして、皆様ありがとうございました。

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

/* 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);

    }
}

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

問題が解決しました。皆様に改めて感謝申し上げます。

それ

于 2011-09-03T12:30:59.533 に答える
2

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);  
于 2014-09-05T06:28:14.163 に答える
-1

あなたはこれを行うことができます。私はチェスゲームを作らなければなりませんでした、そして私はチェスの駒が常にJlayeredPaneであるセルの中央に置かれることを望みました:

private void formMouseReleased(java.awt.event.MouseEvent evt) {
    // TODO add your handling code here:
    if (jl != null)
    {
        jl.setLocation(evt.getX()+10, evt.getY()+10);
        Component com = findComponentAt(evt.getPoint());
        if (com instanceof JPanel)
        {
            // System.out.println("Yes, it's a jpanel");
            ((JPanel)com).add(jl);
            ((JPanel)com).validate();
        }
    }
}
于 2011-10-24T16:49:23.730 に答える
-3

そのちょうど持っている

jPanel.setBounds(x, y, 1046, 503);

x は右側のスペース、y は左側のスペースです。画面の高さと幅に応じて、両側からスペースを計算する必要があります

于 2014-04-12T07:55:19.070 に答える
-5

使用する

panel.setMaximumSize(new Dimension(200,200));
panel.setResizable(false)

代わりは?

于 2011-08-28T20:06:24.020 に答える