Я хочу отобразить икониг на jlabel, на JPanel, в JlayeredPane, в jframe. Я написал подкласс для JlayeredPane (показан ниже), в котором я добавляю панель с меткой со значком изображения в него. Я переопределяю функцию Dolayout of Jlabel, поэтому изображение сохраняет свой рацион во время его изменения. Затем, когда я нажимаю снова (теперь это кнопка восстановления), кадр снова становится меньше, но изображение, похоже, занимает размер максимизированной кадра. Когда я просто снова перетаскиваю сторону кадра, он сразу же меняет размер изображения до, казалось бы, правильного размера. Я говорю, кажется, и, по-видимому, потому, что я считаю, что размер изображения отстает одно «изменение размера события» (не уверен, что это правильная терминология).package myPackage;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JLayeredPane;
import javax.swing.JPanel;
import javax.swing.SpringLayout;
public class GamePane extends JLayeredPane{
private BufferedImage worldImage = null;
private Image scaledWorldImage = null;
private ImageIcon worldIcon = new ImageIcon();
private final JLabel mapLabel;
private final JPanel bgPanel = new JPanel();
private final SpringLayout bgPanelLayout = new SpringLayout();
public GamePane() {
this.setBackground(Color.BLUE);
this.setOpaque(true);
bgPanel.setLayout(bgPanelLayout);
bgPanel.setOpaque(true);
try {
worldImage = ImageIO.read(new File("src/assets/world_map.png"));
//worldIcon = new ImageIcon(worldImage);
} catch (IOException e) {
e.printStackTrace();
}
int imHeight = worldImage.getHeight();
int imWidth = worldImage.getWidth();
double imRatio = (double) imHeight/ (double) imWidth;
mapLabel = new JLabel(worldIcon) {
private final double ratio = imRatio;
@Override
public void doLayout() {
super.doLayout();
if(getWidth() > 0 && getHeight() > 0) {
double height;
double width;
if(getHeight() < ratio*getWidth()) {
height = (double) getHeight();
width = height/ratio;
} else {
width = (double) getWidth();
height = width*ratio;
}
scaledWorldImage = worldImage.getScaledInstance(
(int) width,
(int) height,
Image.SCALE_DEFAULT);
worldIcon.setImage(scaledWorldImage);
revalidate();
repaint();
}
}
};
bgPanel.add(mapLabel);
bgPanelLayout.putConstraint(SpringLayout.NORTH, mapLabel, 0, SpringLayout.NORTH, bgPanel);
bgPanelLayout.putConstraint(SpringLayout.SOUTH, mapLabel, 0, SpringLayout.SOUTH, bgPanel);
bgPanelLayout.putConstraint(SpringLayout.EAST, mapLabel, 0, SpringLayout.EAST, bgPanel);
bgPanelLayout.putConstraint(SpringLayout.WEST, mapLabel, 0, SpringLayout.WEST, bgPanel);
this.add(bgPanel, JLayeredPane.DEFAULT_LAYER);
}
@Override
public void doLayout() {
super.doLayout();
bgPanel.setBounds(0, 0, this.getWidth(), this.getHeight());
}
}
< /code>
У меня есть какой -то базовый опыт Java, но я очень мало знаю о Jframes и тому подобном (но хотел бы узнать, это хобби -проект), поэтому я использовал много Catgpt, чтобы прийти в этот код. Если я делаю что -то действительно странное здесь (связано или не связано с проблемой, которую я описал), пожалуйста, дайте мне знать.
Подробнее здесь: https://stackoverflow.com/questions/797 ... store-down