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

#java #swing #size #jframe

#java #swing #размер #jframe

Вопрос:

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

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

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

Ответ №1:

  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.setResizable(false);
                f.pack();
                f.setVisible(true);
            }
        });
    }
}
  

Комментарии:

1. Извините, это не решает мою проблему. Допустим, я рисую линию от (0, 0) до (100, 100). Эта строка начинается там, где находится верхний левый угол окна. Не желтая область на вашем изображении, а само окно. Строка не отображается там, где находится строка заголовка. Это означает, что все, что я рисую между y = 0 и y = ~ 25, скрыто полосой. Ваше решение этого не меняет. Однако это делает так, что, когда я перехожу в полноэкранный режим, ничего не отображается вообще, что является той же проблемой, с которой я столкнулся с setUndecorated.

2. «Допустим, я …» .. опубликуйте SSCCE вашей лучшей попытки?

3. @kleopatra Яхух? Каждый раз, когда я вижу этот комментарий, я думаю, что это должно быть шуткой, но я просто не понимаю (и это меня огорчает 🙁 ). Что вы имеете в виду?

4. извините, не хочу, чтобы вы грустили — это немецкий, звук, который издает собака, когда она страдает <g>

5. Однажды у меня была собака. Он никогда не издавал таких звуков. Но тогда он никогда не страдал. 😉

Ответ №2:

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

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

затем следуйте пунктам 2 и 3 @Andrew

Комментарии:

1. ваши неофициальные правила Swing 1

2. Однако графический объект не имеет размера, пока не будет установлен размер окна. Итак, я вернулся к тому, с чего начал. Если я чего-то не упускаю?

Ответ №3:

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

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

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

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

Комментарии:

1. О, так это тот случай, когда я пытаюсь найти решение неправильной проблемы. Симптом, а не причина. Я проверю это и отмечу вас как принятого, если все пойдет хорошо.

Ответ №4:

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

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

Dimension d=new Dimension();

d.setSize(x,y);

f.setSize(d); 
  

Ответ №5:

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

 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();
    // ....
}
  

Ответ №6:

Создать 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) переместить холст в определенное положение, измеренное относительно вставок вставок по краям окна…