Как сделать JFrame определенного размера, не считая границы?
У меня есть JFrame, который я установил для определенного размера, используя setBounds. Тем не менее, это делает окно, включая границы, такого размера (что задним числом имеет полный смысл). Но я хочу, чтобы размер окна был, скажем, 800x600 плюс границы. Это важно, потому что я рисую в объекте Graphics из BufferStategy из JFrame, но я рисую под строкой заголовка, когда использую значение y меньше, чем 20. Я представляю разные ОС (или даже разные настройки ОС) также может иметь разные границы толщины. Я думал, что границы были просто привязаны к окну, но это не так.
Итак, как мне сделать пространство внутри границ определенного размера, независимо от толщины границ? Кроме того, чтобы облегчить мою жизнь, как сделать так, чтобы точки 0, 0 были верхним левым углом видимого содержимого фрейма?
Кстати, использование setUndecorated представляет свои проблемы, так что я сейчас не пытаюсь это сделать.
6 ответов
Это важно, потому что я рисую в объекте Graphics из BufferStategy из JFrame,
Почему вы используете BufferStrategy. Это старый код AWT. По умолчанию Swing имеет двойную буферизацию.
При выполнении пользовательского рисования в Swing вы должны расширить JPanel (или JComponent), а затем переопределить метод paintComponent(). Вы добавляете этот компонент на панель содержимого фрейма. Тогда, если вы последуете совету Клеопатры, у вас не будет проблем.
См. Раздел из учебника Swing по пользовательской живописи для получения дополнительной информации и примеров.
- Установите предпочтительный размер для панели содержимого.
- Упакуйте кадр.
- Работа выполнена.
НАПРИМЕР
import java.awt.*;
import javax.swing.*;
class FixedSizeContent {
public static void main(String[] args) {
SwingUtilities.invokeLater( new Runnable() {
public void run() {
JFrame f = new JFrame("Fixed size content");
f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
Container c = f.getContentPane();
c.setBackground(Color.YELLOW);
// adjust to need.
Dimension d = new Dimension(400,40);
c.setPreferredSize(d);
f.pack();
f.setResizable(false);
f.setVisible(true);
}
});
}
}
Позволить компоненту рисования сообщать размер графики как его преф
@Override
public Dimension getPreferredSize() {
return new Dimension(myDrawing.getWidth(), myDrawing.getHeight());
}
затем следуйте за пулями @Andrew 2 и 3
Вы можете использовать это, чтобы избежать использования контейнера.
JFrame f=new JFrame("Your title");
Dimension d=new Dimension();
d.setSize(x,y);
f.setSize(d);
Создайте Canvas canvas = new Canvas();
а также add(canvas);
к JFrame
,
Создайте canvas.createBufferStrategy(2);
получить BufferStrategy bs = canvas.getBufferStrategy();
Создайте Graphics2D graphics2D = (Graphics2D) bufferStrategy.getDrawGraphics();
рисовать с graphics2D
в BufferedImage
,
показать это на экране bufferStrategy.show();
Добавить элементы управления в canvas
всех видов...
пытаться graphics2D.translate(x,y)
чтобы переместить холст в определенную позицию, измеренную по краям окна, вставляет вставки...
У меня есть решение для моего проекта. Это довольно старый поток, может быть, кто-то хочет код. Попробуй это
public gfx_CFrame(String _Title, int _Height, int _Width)
{
super(_Title);
Dimension Dim = new Dimension(_Width, _Height);
setMaximumSize(Dim);
setMinimumSize(Dim);
setPreferredSize(Dim);
pack();
Dim.width = _Width + (getWidth() - getContentPane().getWidth());
Dim.height = _Height + (getHeight() - getContentPane().getHeight());
setMaximumSize(Dim);
setMinimumSize(Dim);
setPreferredSize(Dim);
pack();
// ....
}