Как сделать JFrame определенного размера, не считая границы?

У меня есть JFrame, который я установил для определенного размера, используя setBounds. Тем не менее, это делает окно, включая границы, такого размера (что задним числом имеет полный смысл). Но я хочу, чтобы размер окна был, скажем, 800x600 плюс границы. Это важно, потому что я рисую в объекте Graphics из BufferStategy из JFrame, но я рисую под строкой заголовка, когда использую значение y меньше, чем 20. Я представляю разные ОС (или даже разные настройки ОС) также может иметь разные границы толщины. Я думал, что границы были просто привязаны к окну, но это не так.

Итак, как мне сделать пространство внутри границ определенного размера, независимо от толщины границ? Кроме того, чтобы облегчить мою жизнь, как сделать так, чтобы точки 0, 0 были верхним левым углом видимого содержимого фрейма?

Кстати, использование setUndecorated представляет свои проблемы, так что я сейчас не пытаюсь это сделать.

6 ответов

Решение

Это важно, потому что я рисую в объекте Graphics из BufferStategy из JFrame,

Почему вы используете BufferStrategy. Это старый код AWT. По умолчанию Swing имеет двойную буферизацию.

При выполнении пользовательского рисования в Swing вы должны расширить JPanel (или JComponent), а затем переопределить метод paintComponent(). Вы добавляете этот компонент на панель содержимого фрейма. Тогда, если вы последуете совету Клеопатры, у вас не будет проблем.

См. Раздел из учебника Swing по пользовательской живописи для получения дополнительной информации и примеров.

  1. Установите предпочтительный размер для панели содержимого.
  2. Упакуйте кадр.
  3. Работа выполнена.

НАПРИМЕР

Фиксированный размер контента

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();
    // ....
}
Другие вопросы по тегам