Как сделать JFrame определенного размера, не считая границы? - PullRequest
1 голос
/ 15 октября 2011

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

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

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

Ответы [ 6 ]

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

EG

Fixed Size Content

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);
            }
        });
    }
}
7 голосов
/ 15 октября 2011

пусть компонент чертежа сообщит размер графического изображения в качестве его префикса

 @Override
 public Dimension getPreferredSize() {
      return new Dimension(myDrawing.getWidth(), myDrawing.getHeight());  
 } 

, а затем следит за пулями @ Andrew 2 и 3

6 голосов
/ 15 октября 2011

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

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

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

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

2 голосов
/ 13 января 2014

Вы можете использовать это, чтобы избежать использования Контейнер .

JFrame f=new JFrame("Your title");

Dimension d=new Dimension();

d.setSize(x,y);

f.setSize(d); 
0 голосов
/ 07 января 2016

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

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();
    // ....
}
0 голосов
/ 08 декабря 2013

Создать Canvas canvas = new Canvas();

и add(canvas); до JFrame,

создать canvas.createBufferStrategy(2);

get BufferStrategy bs = canvas.getBufferStrategy();

создать Graphics2D graphics2D = (Graphics2D) bufferStrategy.getDrawGraphics();

ничья с graphics2D в BufferedImage.

показать на экране bufferStrategy.show();

Добавить элементы управления в canvas всех видов ...

попробуйте graphics2D.translate(x,y), чтобы переместить холст в определенную позицию измеряется по краям окна вставки вставки ...

...