JFrame: получить размер без границ? - PullRequest
26 голосов
/ 24 февраля 2011

Возможно ли в Java получить ширину и высоту JFrame без заголовка и других границ?

frame.getWidth () и frame.getHeight () 1, кажется, возвращает ширину, включая границу.

Спасибо.

Ответы [ 4 ]

35 голосов
/ 24 февраля 2011

frame.getContentPane().getSize();

7 голосов
/ 05 сентября 2012
frame.pack();
System.out.println("frame width : "+getWidth());
System.out.println("frame height: "+getHeight());
System.out.println("content pane width : "+getContentPane().getWidth());
System.out.println("content pane height: "+getContentPane().getHeight());
System.out.println("width  of left + right  borders: "+(getWidth()-getContentPane ().getWidth()));
System.out.println("height of top  + bottom borders: "+(getHeight()-getContentPane().getHeight()));
3 голосов
/ 21 апреля 2014

отлично работает

frame.getContentPane().getSize();

Но нет, если вы еще не добавили контент. В моем случае я хотел вычислить внутренние размеры JFrame перед добавлением контента, чтобы я мог соответственно разделить контент. Вот что я придумал.

Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();

pack(); // Need this, otherwise insets() show as 0.  
int scrW = (int)screenSize.getWidth();
int scrH = (int)screenSize.getHeight();
  int innerW = scrW - getInsets().left - getInsets().right;
  int innerH = scrH - getInsets().top - getInsets().bottom;

  // Need to setSize(), otherwise pack() will collapse the empty JFrame
  setSize(scrW, scrH);
0 голосов
/ 17 августа 2018

Вот фрагмент кода, который работает на JFrame, а также на AWT Frame (который является супертипом JFrame):

public static Dimension getInnerSize(Frame frame) {
    Dimension size = frame.getSize();
    Insets insets = frame.getInsets();
    if (insets != null) {
        size.height -= insets.top + insets.bottom;
        size.width -= insets.left + insets.right;
    }
    return size;
}

Осторожно: вставки действительны только после показа рамки.

Вот еще один фрагмент кода для решения этой проблемы:

private static Insets defaultInsets;
public static Insets getInsetsWithDefault(Frame frame) {
    // insets only correct after pack() and setVisible(true) has been
    // called, so we use some fallback strategies
    Insets insets = frame.getInsets();
    if (insets.top == 0) {
        insets = defaultInsets;
        if (insets == null) {
            insets = new Insets(26, 3, 3, 3);
            // usual values for windows as our last resort
            // but only as long as we never saw any real insets
        }
    } else if (defaultInsets == null) {
        defaultInsets = (Insets) insets.clone();
    }
    return insets;
}

Этот код необходимо вызывать один раз с видимым фреймом. После этого он может правильно предсказать вставки даже для невидимых кадров (из-за кэширования defaultInsets), предполагая, что они всегда одинаковы.

Конечно, это работает, только если все окна имеют одинаковые художественные оформления окон. Но я не знаю ни одного случая, когда они могли бы отличаться от окна к окну.

Это также может быть полезно:

frame.addWindowListener(new WindowAdapter() {

    @Override
    public void windowOpened(WindowEvent e) {
        MyUtilClass.getInsetsWithDefault(frame); // init the defaultInsets
    }

});

Он вызовет метод getInsetsWithDefault(), как только окно станет видимым, и инициализирует правильный defaultInsets.

...