在JPanel中实时调整图像



我已经找了两个小时的解决方案,所以我最终问了它。

我只需要在图片上重叠一个网格。我的网格会自动调整其大小以适应我的JPanel,但不会调整我的图片。这是我的代码:

网格类:

public class GridPane extends JPanel {
public GridPane(int row, int col) {
int count = 0 ; // use to give a name to each box so that you can refer to them later
setLayout(new GridLayout(row, col));
setBorder(BorderFactory.createEmptyBorder(2,2,2,2));
setOpaque(false);
for (int i = 1; i <= (row * col); i++) {
JPanel pan = new JPanel();
pan.setEnabled(true);
pan.setOpaque(false);
pan.setPreferredSize(new Dimension(1, 1));
pan.setBorder(BorderFactory.createLineBorder(Color.BLACK));
pan.addMouseListener(new BoxListener()); // add a mouse listener to make the panels clickable
pan.setName(count+"");
++count;
add(pan);
}
}

我的JFrame:课程

public class FenetreCluedo extends JFrame {
private JPanel fenetre;
private JPanel plateau = new JPanel();
private JTextField resume = new JTextField(40);
private BufferedImage img;
public FenetreCluedo() {
super("Cluedo");
try {
img = ImageIO.read(new File("/home/thomas/eclipse-workspace/Cluedo-GM4/src/cluedo1.png"));
} catch (IOException e) {};
fenetre = (JPanel)this.getContentPane();
fenetre.setLayout(new BorderLayout());
fenetre.add(plateau, BorderLayout.CENTER);
plateau.setLayout(new OverlayLayout(plateau));
plateau.add(new GridPane(22,22));
plateau.add(new JLabel(new ImageIcon("/home/thomas/eclipse-workspace/Cluedo-GM4/src/cluedo1.png")));
fenetre.add(resume, BorderLayout.EAST);
pack();
setVisible(true);
}
}

当我调整窗口大小时,网格会自行调整,以便完全显示。但不是照片,它是剪切的。。。

有什么解决方案吗?

您需要覆盖图像的绘制:

JPanel imagePanel = new JPanel() {
private static final long serialVersionUID = 1;
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(img, 0, 0, getWidth(), getHeight(), this);
}
@Override
public Dimension getPreferredSize() {
return new Dimension(img.getWidth(), img.getHeight());
}
};
// ...
plateau.add(new GridPane(22,22));
plateau.add(imagePanel);

您可以添加渲染提示以实现更平滑的缩放,但这可能会影响缺乏加速图形的旧系统的性能。

JPanel imagePanel = new JPanel() {
private static final long serialVersionUID = 1;
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
g2.setRenderingHint(
RenderingHints.KEY_RENDERING,
RenderingHints.VALUE_RENDER_QUALITY);
g2.setRenderingHint(
RenderingHints.KEY_INTERPOLATION,
RenderingHints.VALUE_INTERPOLATION_BICUBIC);
g2.setRenderingHint(
RenderingHints.KEY_ALPHA_INTERPOLATION,
RenderingHints.VALUE_ALPHA_INTERPOLATION_QUALITY);
g.drawImage(img, 0, 0, getWidth(), getHeight(), this);
}
};

最新更新