Я не знаю ответа для моего первоначального вопроса (это способ рассказать источник ComponentEvent
), поэтому я просто храню предыдущие измерения и вычисляю новый размер. Если это кому-то помогает, это код, который я использую.
public class ResizableImageView extends JDialog {
BufferedImage img;
Dimension OriginalImgSize;
double imageRatio;
JPanel jp;
JLabel label;
Dimension previousSize;
public ResizableImageView(BufferedImage img) {
...
setResizable(true);
this.img = img;
OriginalImgSize = new Dimension(img.getWidth(), img.getHeight());
imageRatio = (double)img.getWidth()/(double)img.getHeight();
label = new JLabel(new ImageIcon(img));
label.setMinimumSize(OriginalImgSize);
jp = new JPanel();
jp.setBorder(new EmptyBorder(0, 0, 0, 0));
jp.add(label);
setContentPane(jp);
pack();
previousSize = getSize();
addComponentListener(new ComponentAdapter() {
private boolean allreadyResized = true;
private void resize(Image img) {
ImageIcon ico = new ImageIcon(img);
label = new JLabel(ico);
label.setBorder(new EmptyBorder(0, 0, 0, 0));
label.setPreferredSize(new Dimension(img.getWidth(null), img.getHeight(null)));
jp = new JPanel();
jp.setBorder(new EmptyBorder(0, 0, 0, 0));
jp.add(label);
setContentPane(jp);
allreadyResized = true;
pack();
previousSize = getSize();
}
@Override
public void componentResized(ComponentEvent e) {
if (allreadyResized) {
allreadyResized = false;
return;
}
double xChange = (double) Math.abs(getSize().width - previousSize.width);
double yChange = (double) Math.abs(getSize().height - previousSize.height);
if (xChange == 0 && yChange == 0) return;
int height = getSize().height - getInsets().bottom - getInsets().top;
int width = getSize().width - getInsets().left - getInsets().right;
if (height > OriginalImgSize.height
|| width > OriginalImgSize.width) {
resize(img);
return;
}
if (yChange == 0 || xChange/yChange > imageRatio) {
resize(img.getScaledInstance(width, -1, Image.SCALE_SMOOTH));
return;
} else {
resize(img.getScaledInstance(-1, height, Image.SCALE_SMOOTH));
return;
}
}
});
}
}
Что вы подразумеваете под «поддержанием скорости JDialog»? В этом контексте слово «ставка» путается. В целом вы, похоже, пытаетесь сделать что-то, что библиотека/структура пользовательского интерфейса не настроена, но вы могли бы достичь общей цели по-другому. Поэтому я ищу дополнительную информацию об общей цели. – arcy
JDialog содержит изображение. Я хочу разрешить пользователю изменять размер окна, но сохранить размер изображения. поэтому мне нужно пересчитать размер изображения и окна в соответствии с действием пользователя (если пользователь увеличивает ширину, размер должен соответственно увеличиваться и т. д.). Думаю, я смогу достичь той же цели, сохранив предыдущий размер и сравню его с новым размером ... Но меня все еще интересует ответ на исходный ответ. Я понимаю, что ваш ответ - это невозможно. – Elist
Я бы не сказал «невозможно», но я имел в виду сказать, что необычно быть «необычным» с доказательствами того, что пользовательский интерфейс не обеспечивает его. Не вдаваясь в это, я бы подумал, что этого будет достаточно, чтобы получить событие изменения размера, получить текущую высоту/ширину диалога, определить максимальную высоту/ширину вашего изображения, которая будет соответствовать там с правильным соотношением (это то, что я сейчас подумайте, что вы имеете в виду под «скоростью» и перерисовываете. Вам не нужна предыдущая информация, если только она не устраняет перерисовку, если размер идентичен, и какие измерения изменены. – arcy