Java Swing неправильно упаковывает окно - PullRequest
3 голосов
/ 07 марта 2009

Я делаю подобную Scorched Earth игру на Java (для моего экзаменационного проекта: D), но у меня есть эта проблема. Я рисую окно (JFrame), задаю компоновку BorderLayout, применяю расширенный JPanel и упаковываю окно, но после того, как оно было упаковано, оно показывает некоторое расширенное белое пространство слева и снизу.

Это мой основной класс:

public class Main {
    public static void main(String[] args) {
        javax.swing.JFrame frame = new javax.swing.JFrame("game title");
        panel p = new panel(new java.awt.Dimension(512, 512));
        frame.setDefaultCloseOperation(javax.swing.JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().setLayout(new java.awt.BorderLayout());
        frame.getContentPane().add(p, java.awt.BorderLayout.CENTER);
        frame.pack();
        frame.setResizable(false);
        frame.setVisible(true);
    }
}
Панель

- это мой класс JPanel, который в конструкторе устанавливает свой предпочтительный размер для аргумента (512x512). Я проверил это как на Windows, так и на Linux, и ошибка в обоих местах, и размер белого разрыва отличается от ОС к ОС.

Это мой класс панели:

class panel extends javax.swing.JPanel{
    panel(java.awt.Dimension size){
        setPreferredSize(size);
    }
    public void paint(java.awt.Graphics g){
        g.setColor(java.awt.Color.BLUE);
        g.fillRect(0, 0, 512, 512);
    }
}

Пожалуйста, помогите!

Ответы [ 4 ]

3 голосов
/ 07 марта 2009

ГАУА,

Это не то, что вы просили, но важно, тем не менее ... Вы не переопределяете рисовать в разгаре; вместо этого вы переопределяете paintComponent .

См. Учебник Sun "Custom Painting": http://java.sun.com/docs/books/tutorial/uiswing/painting/

На самом деле, я настоятельно рекомендую (учитывая ваш выбор проекта) пройти весь учебник по Swing. Это займет некоторое время, но оно того стоит.

Приветствия. Кит.

3 голосов
/ 07 марта 2009

Я пытался воспроизвести это без вашего panel класса (которому нужно лучшее имя и, по крайней мере, его следует назвать с помощью CamelCase):

import javax.swing.*;

public class Main {
    public static void main(String[] args) {
        JFrame frame = new JFrame("game title");
        JPanel p = new JPanel();
        p.setPreferredSize(new java.awt.Dimension(512, 512));
        p.setBackground(java.awt.Color.BLUE);
        frame.setDefaultCloseOperation(javax.swing.JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().setLayout(new java.awt.BorderLayout());
        frame.getContentPane().add(p, java.awt.BorderLayout.CENTER);
        frame.pack();
        frame.setResizable(false);
        frame.setVisible(true);
    }
}

При этом появляется окно с синей панелью 512x512 и без разноцветных границ. Так что проблема должна быть в вашем panel классе.

2 голосов
/ 07 марта 2009

Я решил проблему, удалив:

setResizable(false);
1 голос
/ 23 февраля 2012

Я просмотрел код setResizable() и понял, что все правильно. Просто поставьте this.setResizable(false) перед this.pack().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...