10

JFrameを取得し、50pxのパディングで境界線のあるJLabelを表示したいと思います。JFrameのサイズを750、750に設定し、JLabelのサイズを650、650に設定し、場所を50、50に設定すると、奇妙に表示されます...これが私のコードです。

public class GUI {

    /**
     * Declarate all 
     */
    public int height = 750;
    public int width = 750;

    Dimension screen = Toolkit.getDefaultToolkit().getScreenSize();
    int x = (screen.width / 2) - (width / 2); // Center horizontally.
    int y = (screen.height / 2) - (height / 2); // Center vertically.

    /**
     * Create the GUI
     */
    JFrame frame = new JFrame();
    Border border = LineBorder.createBlackLineBorder();
    JLabel label = new JLabel();    

    public GUI(){
        label.setBorder(border);
        label.setSize(700, 700);
        label.setLocation(0, 0);

        frame.getContentPane().setLayout(null);
        frame.add(label);
    }

    public void createGUI() {
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setBounds(x,y,width,height);
        frame.setVisible(true);
    }

}

ですから、上部のタイトルバーもサイズに含まれていると思います。グラフィックスでは、を使用できますgetInsets()。さて、Swing / JFrameにそのようなものはありますか?

4

2 に答える 2

17

まず、フレームによってピクセルがトリミングされます。

int reqWidth = reqHeight = 750;

// first set the size
frame.setSize(reqWidth, reqHeight);

// This is not the actual-sized frame. get the actual size
Dimension actualSize = frame.getContentPane().getSize();

int extraW = reqWidth - actualSize.width;
int extraH = reqHeight - actualSize.height;

// Now set the size.
frame.setSize(reqWidth + extraW, reqHeight + extraH);

別の簡単な方法。以前は動作しましたが、これをお勧めします。

frame.getContentPane().setPreferredSize(750, 750);
frame.pack();

お役に立てれば。

編集:

コンポーネントをフレームに追加する前に、これをコンストラクターに追加してください。真ん中に設定するには、

frame.setLocationRelativeTo(null);

これにより、ウィンドウが画面の中央に配置されます。

于 2012-11-20T14:10:13.920 に答える
3

使用setPreferredSize()は、コンポーネントの計算を任意の選択で常に無効にするため、問題があります。代わりに、以下に示すように、コンポーネントの好ましいサイズに対応するためpack()の囲み。Window

画像

import java.awt.Color;
import java.awt.EventQueue;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.border.Border;
import javax.swing.border.CompoundBorder;

/**
 * @see https://stackoverflow.com/a/13481075/230513
 */
public class NewGUI extends JPanel {

    private static final int S1 = 10;
    private static final int S2 = 50;
    private JLabel label = new JLabel("Hello, world!");

    public NewGUI() {
        label.setHorizontalAlignment(JLabel.CENTER);
        Border inner = BorderFactory.createEmptyBorder(S1, S1, S1, S1);
        Border outer = BorderFactory.createLineBorder(Color.black);
        label.setBorder(new CompoundBorder(outer, inner));
        this.setBorder(BorderFactory.createEmptyBorder(S2, S2, S2, S2));
        this.add(label);
    }

    private void display() {
        JFrame f = new JFrame("NewGUI");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.add(this);
        f.pack();
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                new NewGUI().display();
            }
        });
    }
}
于 2012-11-20T19:56:56.913 に答える