Адаптируйте изображение в реальном времени в JPanel - PullRequest
0 голосов
/ 15 декабря 2018

Я искал решение в течение 2 часов, поэтому в итоге спрашиваю его.

Мне просто нужно наложить сетку на картинку.Моя сетка автоматически приспосабливает свой размер к моему 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);
}
}

Когда я изменяю размер окна, сеткаадаптируется так, что он полностью отображается.Но не картинка, которая вырезана ...

Есть решение?

1 Ответ

0 голосов
/ 15 декабря 2018

Вам необходимо переопределить рисование изображения:

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