Canvas не меняет размеры с окном в Java? - PullRequest
3 голосов
/ 22 января 2009

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

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

Что мне нужно сделать, чтобы изменить размер Canvas в 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 / Graphics Размер не изменяется?

Редактировать 2: На скриншоте определенно установлено значение CENTER:

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

Решено

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

Ответы [ 4 ]

3 голосов
/ 22 января 2009

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

Я бы:

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

или

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

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

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

Удачи.

:)

2 голосов
/ 29 декабря 2011

Другое хорошее решение - поместить полотно в JPanel, как я

    panel.add(new JPanel() {

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

    }.add(capture));

и в функции canvas что-то типа

@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);
}

например. Это делает это очень просто. Возьмите родительскую панель в соответствии с вашими потребностями.

2 голосов
/ 22 января 2009

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

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

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

1 голос
/ 22 января 2009

Если вы следовали совету Дейва, особенно поместив ballCanvas в CENTER, вы должны установить максимальный размер для ballCanvas.

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