Размер холста не изменяется с окном в Java?

У меня есть jFrame с холстом на нем. Когда я запускаю свою программу в Windows XP / Vista и меняю размер окна, размер холста изменяется пропорционально окну.

Однако в Ubuntu linux, когда я компилирую то же Java-приложение и меняю размер окна, холст остается того же размера.

Что мне нужно сделать, чтобы размер холста изменялся вместе с моим окном как в Windows, так и в Linux? В чем дело с несоответствием?

Main.java

public class Main {
    public static void main(String[] args)
    {
        JFrame frame = new JFrame("BallBounce");
        frame.setDefaultCloseOperation(Jframe.EXIT_ON_CLOSE);
        frame.getContentPane().setLayout(new BoxLayout(frame.getContentPane(),BoxLayout.Y_AXIS));

        BallCanvas ballCanvas = new BallCanvas();

        frame.getContentPane().add(ballCanvas);
        frame.getContentPane().add(controlPanel);
        frame.pack();
        frame.setVisible(true);
    }
}

BallCanvas.java

public class BallCavnas extends Canvas {
    public BallCanvas()
    {
        setPreferredSize(new Dimension(640, 400));
        setIgnoreRepaint(true);

        ... various gui controls are wired up here
    }
    ... rest of canvas code
}

Обновлено: мой исходный код заархивирован здесь, если кто-то захочет взглянуть:
http://www.filedropper.com/ballbounce

Я выполнил предложения, сделанные Дэйвом Рэем, но все еще не меняет размер холста? Помните, он отлично меняет размер, когда я компилирую эту java-программу и запускаю ее в Windows. Только в linux так поступает со мной. Я также использую Java 6 Sun 1.6.0.10 JVM, если это важно.

альтернативный текст http://img158.imageshack.us/img158/7642/screenshotww0.png

Возможно, размер моего холста изменяется с помощью BufferStrategy / Графика, размер которого не изменяется?

Изменить 2: на снимке экрана определенно установлено значение ЦЕНТР:

frame.getContentPane().add(ballCanvas, BorderLayout.CENTER);
frame.getContentPane().add(controlPanel, BorderLayout.SOUTH);

Решено

Очевидно, размер «холста» менялся, но я делал что-то странное с его буферной стратегией, которая не позволяла изменять размер ИТ. Я починил это. Спасибо всем!

Simucal: Я думал, вы используете только закрытые вопросы, а не задаете их ;-) Интересный вопрос, кстати :)

OscarRyz 22.01.2009 08:41

@Oscar Reyes, я закрыл ваш вопрос или что-то в этом роде? ржу не могу. Я сижу на IRC-канале #Stackoverflow и получаю прямой поток вопросов. Если я вижу обман, я пытаюсь идентифицировать его как таковой ... на самом деле это PITA. Иногда бывает сложно вспомнить все вопросы / темы, которые я видел раньше.

anon 22.01.2009 08:43

Нет, но я предполагаю, что это было для вас, что они решили добавить функцию закрытия "комитета". Ты всегда рядом. На самом деле все началось с 3, но, поскольку вы всегда занимали одно место, теперь нужно 4. :) :)

OscarRyz 22.01.2009 09:02

@ Оскар Рейес, смеется. Заключительные вопросы и вопросы редактирования, чтобы улучшить их грамматику / верстку (особенно для людей, не являющихся носителями английского языка), - это два моих больших вклада в сайт. Думаю, людям не нравится, когда их обманутые вопросы закрываются, но я делаю это только для блага SO.

anon 22.01.2009 09:08

@Oscar Reyes, я никогда не закрываю пограничные вопросы ... когда люди говорят, что это не связано с программированием. Мне действительно нравятся пустые вопросы.

anon 22.01.2009 09:08

@Simucal: в вашем «Решенном», поверьте мне или нет, я всегда думал, что это проблема, см. Мой комментарий: «Начните с пустого холста, затем добавьте предпочтительный размер, затем и т.д. и т.д. Скорее всего, ошибка в краске. метод ", я уже был там раньше :(

OscarRyz 23.01.2009 02:21

@Oscar Reyes, да, в моем методе рендеринга была небольшая ошибка, заключающаяся в сохранении одного и того же графического объекта вместо получения нового при каждом рендеринге

anon 23.01.2009 07:03

Я знаю, что прошло много времени, но помните ли вы, что вам нужно было сделать, чтобы исправить проблему?

compman 22.12.2011 19:57
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
3
8
9 780
4

Ответы 4

Вместо этого используйте макет границы:

frame.getContentPane().setLayout(new BorderLayout());
BallCanvas ballCanvas = new BallCanvas();
frame.getContentPane().add(ballCanvas, BorderLayout.CENTER);            
frame.getContentPane().add(controlPanel, BorderLayout.SOUTH);

Также избавьтесь от setPreferredSize () в пользу frame.setSize (), чтобы установить начальный размер дисплея.

Есть ли у вас другие предложения? Я изменил его на BorderLayout, и холст по-прежнему сохраняет свой исходный размер после изменения размера. Также проверьте мою правку

mmcdole 22.01.2009 08:04

@Simucal: Вы уверены, что поместили ballCanvas в ЦЕНТР?

Lawrence Dol 22.01.2009 08:38

@SoftwareMonkey, да смотрите мою правку. В моем коде холст определенно расположен в BorderLayout.CENTER.

mmcdole 22.01.2009 08:44

Если вы последовали совету Дэйва, особенно. помещая ballCanvas в ЦЕНТР, тогда вы должны установить максимальный размер для ballCanvas.

Возможно, менеджер по расположению просто пытается учесть ваш предпочтительный размер.

Я буду:

A) удалите предпочтительные, чтобы посмотреть, что происходит (в любом случае, не очень хорошая идея)

или же

Б) не использовать холст в первую очередь, а JComponent. В конце концов, Canvas - это компонент AWT, и я не совсем уверен, как они работают сегодня. JComponent - это легкий компонент, и поскольку вы используете JComponent в качестве контейнера, они ... ммммм лучше работать вместе?

Ну и дела ... Сейчас я даю предложения по программированию на вуду. Лучше приступай к работе.

В) То, что всегда работало у меня. Сделайте небольшое доказательство концепции, добавляя шаг за шагом элементы в мой код. Начните с пустого холста, затем добавьте желаемый размер, затем и т. д. И т. Д. Скорее всего, ошибка связана с методом рисования: P

Удачи.

:)

Еще одно хорошее решение - поместить холст в JPanel, как и я

    panel.add(new JPanel() {

        @Override
        public void paint(Graphics g) {
          // do not paint
        }

    }.add(capture));

и в функции холста что-то вроде

@Override
public void paint(Graphics g) {
    Dimension currentSize = getParent().getSize();
    int width = currentSize.width;
    int height = currentSize.height;
    if (offscreenImage == null || !currentSize.equals(offscreenDimension)) {
        // call the 'java.awt.Component.createImage(...)' method to get an
        // image
        offscreenImage = createImage(width, height);
        offscreenGraphics = offscreenImage.getGraphics();
        offscreenDimension = currentSize;
    }

    if (image != null) {
        offscreenGraphics.drawImage(image, 0, 0, width, height, null);
    } else {
        offscreenGraphics.setColor(Color.BLACK);
        offscreenGraphics.fillRect(0, 0, width, height);
    }
    //scratch image
    g.drawImage(offscreenImage, 0, 0, this);
}

Например. Это очень просто. Возьмите родительскую панель под свои нужды.

Другие вопросы по теме