почему метод setfize () jframe неправильно устанавливает размер?

<p>итак, я программировал на java в течение семестра или около того, и у меня была эта проблема несколько раз, и, наконец, я нашел время спросить.</p><p>если я создаю <code>jframe</code>, а затем устанавливаю размер, например, <code>setsize(400,800)</code>. кадр на самом деле не длинный <code>800 pixels</code>. из того, что я могу сказать, это на самом деле больше похоже на <code>770 (or maybe 769) pixels</code> long. кроме того, если вы установите очень низкий размер по вертикали (ниже 30), рамка даже не отобразится, только верхняя строка окна ос и рамка не увеличатся, пока вы не достигнете значения более 30 (так <code>setsize(400,0)</code> выглядит так же, как <code>setsize(400,20)</code>). почему это не трудно исправить, но это странно, и мне любопытно, почему это так?</p><p>если вам нужна дополнительная информация о чем-либо, просто спросите, и я передам ее вам. </p>

<p>это, вероятно, потому что размер рамки включает в себя размер границы.</p><blockquote> <p>рамка - это окно верхнего уровня с заголовком и рамкой. размер рамки включает любую область, предназначенную для границы. размеры области границы можно получить с помощью метода getinsets. поскольку область границы включена в общий размер кадра, граница эффективно скрывает часть кадра, ограничивая область, доступную для визуализации и/или отображения подкомпонентов, прямоугольником, который имеет местоположение в верхнем левом углу (вставки. слева, insets.top) и имеет размер ширины - (insets.left + insets.right) по высоте - (insets.top + insets.bottom). </p> </blockquote><p>источник: <a href="http://download.oracle.com/javase/tutorial/uiswing/components/frame.html">http://download.oracle.com/javase/tutorial/uiswing/components/frame.html</a> </p>

<p>jframe setsize () содержит область + граница.</p><p>я думаю, что вы должны установить размер <code>contentpane</code> этого </p><pre><code>jframe.getcontentpane().setsize(800,400); </code></pre><p>поэтому я бы посоветовал вам использовать jpanel, встроенный в jframe, и вы опираетесь на этот jpanel. это минимизирует вашу проблему.</p><pre><code>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(); </code></pre><p>я читаю это из <a href="http://download.oracle.com/javase/1.4.2/docs/api/javax/swing/jframe.html">javadoc</a> </p><blockquote> <p>класс <code>jframe</code> немного несовместим с <code>frame</code>. как все другие контейнеры верхнего уровня jfc/swing, <strong>jframe содержит <code>jrootpane</code> в качестве своего только ребенок</strong>. предоставляется панель <strong>content</strong> на корневой панели следует, как правило, содержит все компоненты, не относящиеся к меню отображается <code>jframe</code>. это отличается от корпуса awt frame. за например, чтобы добавить ребенка в awt кадр вы бы написали:</p> <p><code>frame.add(child);</code></p> <p>однако, используя <code>jframe</code>, вам нужно добавить дочерний элемент к панели содержимого <code>jframe</code> вместо:</p> <p><code>frame.getcontentpane().add(child);</code></p> </blockquote>

<p>в os x вам необходимо учитывать существующие декорации окон. они добавляют 22 пикселя к высоте. итак, на jframe, вы должны сообщить программе это:</p><pre><code>frame.setsize(width, height + 22); </code></pre>

<p>есть много веских причин для установки размера кадра. одним из них является запоминание последнего установленного пользователем размера и восстановление этих настроек. у меня есть этот код, который, кажется, работает для меня:</p><pre><code>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); } } </code></pre><p>}</p>

<p>верхняя граница рамки имеет размер 30. вы можете написать код для печати координаты любой точки на кадре, используя mouseinputadapter. вы найдете, когда курсор находится чуть ниже верхней границы рамки, координата y не равна нулю, ее близко к 30. поэтому, если вы задаете размер кадра 300 * 300, размер, доступный для размещения компонентов на кадре, составляет всего 300 * 270. поэтому, если вам нужен размер 300 * 300, укажите размер кадра 300 * 330. ,.</p>

<p>я знаю, что этому вопросу более 6 лет, но ответ @kyle не работает.</p><p>используя это</p><pre><code>setsize(width - (getinsets().left + getinsets().right), height - (getinsets().top + getinsets().bottom)); </code></pre><p>но это всегда работает в любом размере:</p><pre><code>setsize(width + 14, height + 7); </code></pre><p>если вы не хотите, чтобы граница граничит, а хотите только белую область, здесь:</p><pre><code>setsize(width + 16, height + 39); </code></pre><p>также это работает только в windows 10, для пользователей macos используйте ответ @ ben.</p>