Подтвердить что ты не робот

Почему метод JFrame setSize() не задает размер правильно?

Итак, я программировал в java в течение семестра или около того, и у меня была эта проблема несколько раз и, наконец, обошла меня.

Если я создаю JFrame, а затем задаю размер, например setSize(400,800). Кадр на самом деле 800 pixels длинный. Из того, что я могу сказать, это больше похоже на 770 (or maybe 769) pixels long. Кроме того, если вы установите минимальный размер по вертикали (ниже 30), кадр даже не появится, только верхняя панель окна из ОС и рамка не станут больше, пока вы не перейдете к значению более 30 (так setSize(400,0) выглядит так же, как setSize(400,20)). Почему это, это не трудно исправить, но его странно, и мне любопытно, почему это?

Если вам нужна дополнительная информация о чем-либо, просто спросите, и я получу ее вам.

4b9b3361

Ответ 1

Вероятно, размер кадра равен размеру рамки.

A Рамка - это окно верхнего уровня с заголовком и границей. Размер рамки включает любую область, обозначенную для границы. Размеры области границы могут быть получены с использованием метода getInsets. Поскольку граница области включена в общий размер кадра, граница эффективно скрывает часть кадра, ограничивая область, доступную для рендеринга и/или отображая подкомпоненты, на прямоугольник, который имеет верхнее левое угловое положение (вставки. left, insets.top) и имеет размер ширины - (insets.left + insets.right) по высоте - (insets.top + insets.bottom).

Источник: http://download.oracle.com/javase/tutorial/uiswing/components/frame.html

Ответ 2

JFrame SetSize() содержит область + граница.

Я думаю, вы должны установить размер ContentPane этого

jFrame.getContentPane().setSize(800,400);

Итак, я бы посоветовал вам использовать JPanel, встроенный в JFrame, и вы будете использовать этот JPanel. Это свести к минимуму вашу проблему.

JFrame jf = new JFrame();
JPanel jp = new JPanel();
jp.setPreferredSize(new Dimension(400,800));// changed it to preferredSize, Thanks!
jf.getContentPane().add( jp );// adding to content pane will work here. Please read the comment bellow.
jf.pack();

Я читаю это из Javadoc

Класс JFrame немного несовместимый с Frame. Как все другие контейнеры верхнего уровня JFC/Swing, a JFrame содержит a JRootPane как его только ребенок. Панель контента предоставлена по корневой панели должно, как правило, содержат все компоненты без меню отображается JFrame. Это отличающийся от корпуса AWT Frame. Для Например, чтобы добавить ребенка в AWT кадр, который вы должны написать:

frame.add(child);

Однако, используя JFrame, вам нужно добавить дочерний элемент в области содержимого JFrameвместо:

frame.getContentPane().add(child);

Ответ 3

Существует множество веских причин для установки размера фрейма. Один из них - запомнить последний размер, который пользователь установил, и восстановить эти настройки. У меня есть этот код, который, кажется, работает для меня:

package javatools.swing;
import java.util.prefs.*;
import java.awt.*;
import java.awt.event.*;

import javax.swing.JFrame;

public class FramePositionMemory {
    public static final String WIDTH_PREF = "-width";

    public static final String HEIGHT_PREF = "-height";

    public static final String XPOS_PREF = "-xpos";

    public static final String YPOS_PREF = "-ypos";
    String prefix;
    Window frame;
    Class<?> cls;

    public FramePositionMemory(String prefix, Window frame, Class<?> cls) {
        this.prefix = prefix;
        this.frame = frame;
        this.cls = cls;
    }

    public void loadPosition() {
        Preferences prefs = (Preferences)Preferences.userNodeForPackage(cls);
    //  Restore the most recent mainframe size and location
        int width = prefs.getInt(prefix + WIDTH_PREF, frame.getWidth());
        int height = prefs.getInt(prefix + HEIGHT_PREF, frame.getHeight());
        System.out.println("WID: " + width + " HEI: " + height);
        Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
        int xpos = (screenSize.width - width) / 2;
        int ypos = (screenSize.height - height) / 2;
        xpos = prefs.getInt(prefix + XPOS_PREF, xpos);
        ypos = prefs.getInt(prefix + YPOS_PREF, ypos);
        frame.setPreferredSize(new Dimension(width, height));
        frame.setLocation(xpos, ypos);
        frame.pack();
    }

    public void storePosition() {
        Preferences prefs = (Preferences)Preferences.userNodeForPackage(cls);
        prefs.putInt(prefix + WIDTH_PREF, frame.getWidth());
        prefs.putInt(prefix + HEIGHT_PREF, frame.getHeight());
        Point loc = frame.getLocation();
        prefs.putInt(prefix + XPOS_PREF, (int)loc.getX());
        prefs.putInt(prefix + YPOS_PREF, (int)loc.getY());
        System.out.println("STORE: " + frame.getWidth() + " " + frame.getHeight() + " " + loc.getX() + " " + loc.getY());
    }
}
public class Main {
void main(String[] args) {
        JFrame frame = new Frame();
        // SET UP YOUR FRAME HERE.
        final FramePositionMemory fm = new FramePositionMemory("scannacs2", frame, Main.class);
        frame.setSize(400, 400); // default size in the absence of previous setting
        fm.loadPosition();

        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        Runtime.getRuntime().addShutdownHook(new Thread() {
            @Override
            public void run() {
                fm.storePosition();
            }
        });
        frame.setVisible(true);
    }
}

}

Ответ 4

В OS X вам необходимо учитывать существующие декорации окон. Они добавляют 22 пикселя к высоте. Итак, на JFrame вам нужно сообщить программе следующее:

frame.setSize(width, height + 22);