У меня есть 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);
Очевидно, размер «холста» менялся, но я делал что-то странное с его буферной стратегией, которая не позволяла изменять размер ИТ. Я починил это. Спасибо всем!
@Oscar Reyes, я закрыл ваш вопрос или что-то в этом роде? ржу не могу. Я сижу на IRC-канале #Stackoverflow и получаю прямой поток вопросов. Если я вижу обман, я пытаюсь идентифицировать его как таковой ... на самом деле это PITA. Иногда бывает сложно вспомнить все вопросы / темы, которые я видел раньше.
Нет, но я предполагаю, что это было для вас, что они решили добавить функцию закрытия "комитета". Ты всегда рядом. На самом деле все началось с 3, но, поскольку вы всегда занимали одно место, теперь нужно 4. :) :)
@ Оскар Рейес, смеется. Заключительные вопросы и вопросы редактирования, чтобы улучшить их грамматику / верстку (особенно для людей, не являющихся носителями английского языка), - это два моих больших вклада в сайт. Думаю, людям не нравится, когда их обманутые вопросы закрываются, но я делаю это только для блага SO.
@Oscar Reyes, я никогда не закрываю пограничные вопросы ... когда люди говорят, что это не связано с программированием. Мне действительно нравятся пустые вопросы.
@Simucal: в вашем «Решенном», поверьте мне или нет, я всегда думал, что это проблема, см. Мой комментарий: «Начните с пустого холста, затем добавьте предпочтительный размер, затем и т.д. и т.д. Скорее всего, ошибка в краске. метод ", я уже был там раньше :(
@Oscar Reyes, да, в моем методе рендеринга была небольшая ошибка, заключающаяся в сохранении одного и того же графического объекта вместо получения нового при каждом рендеринге
Я знаю, что прошло много времени, но помните ли вы, что вам нужно было сделать, чтобы исправить проблему?




Вместо этого используйте макет границы:
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, и холст по-прежнему сохраняет свой исходный размер после изменения размера. Также проверьте мою правку
@Simucal: Вы уверены, что поместили ballCanvas в ЦЕНТР?
@SoftwareMonkey, да смотрите мою правку. В моем коде холст определенно расположен в BorderLayout.CENTER.
Если вы последовали совету Дэйва, особенно. помещая 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);
}
Например. Это очень просто. Возьмите родительскую панель под свои нужды.
Simucal: Я думал, вы используете только закрытые вопросы, а не задаете их ;-) Интересный вопрос, кстати :)