Ява изменить размер изображения динамически, чтобы соответствовать сеткам в gridlayout - PullRequest
1 голос
/ 22 июня 2011

Я хочу сделать шахматную доску, используя собственный подкласс JButton.Моя проблема в том, что мои изображения шахматных фигур слишком малы.Есть ли способ, которым я могу увеличить изображение до размера каждой сетки в моей сетке?Если я изменю размер Jframe, сетки также изменят размер.Есть ли способ получить динамическое изменение размера изображения после изменения размера всего кадра?

Ответы [ 3 ]

3 голосов
/ 22 июня 2011

У вас есть 3 варианта для этого

1) Изменение размера самих изображений с помощью Gimp, Photoshop и т. Д.

2) Создать иконку динамически

Image i = icon.getImage();
if(i != null){
   int width = (int)(size * fraction);
   int height =(int)(size*icon.getIconHeight()/icon.getIconWidth()*fraction);
   miniature = new ImageIcon(i.getScaledInstance(width, height, Image.SCALE_SMOOTH));
}

3) на краске вашей рамки вы можете использовать шкалу

private void scaledDrawing(Graphics g, float scale){
   Graphics2D g2 = (Graphics2D) g;
   AffineTransform at = new AffineTransform();
   AffineTransform save = g2.getTransform();
   at.setToIdentity();
   at.scale(goa.getScale().x, goa.getScale().y);
   g2.transform(at);
   image.paintIcon(c, g2);
   g2.setTransform(save);
}
2 голосов
/ 22 июня 2011

Вы можете применить некоторые преобразования к изображениям, но это может выглядеть немного некрасиво.Если изображения достаточно малы, возможно, вы можете просто принудительно установить минимальный размер кнопки, чтобы появилась полоса прокрутки, если кадр имеет очень маленький размер.Другой вариант может состоять в том, чтобы иметь два или три разных набора изображений в хорошо масштабируемых размерах и заменять их для разных размеров платы.

0 голосов
/ 27 июля 2018

Другой альтернативой будет переопределение функции рисования для заполнения всех доступных мест:

@Override
public final void paint(final Graphics g) {
    super.paint(g);
    g.drawImage(image, 0, 0, getWidth(), getHeight(), this);
}

Вот пример:

import java.awt.Component;
import java.awt.Graphics;
import java.awt.Image;


public final class Tileset extends Component {

    private Image image;

    public Tileset(final Image image) {
        this.image = image;
    }

    @Override
    public final void paint(final Graphics g) {
        super.paint(g);
        g.drawImage(image, 0, 0, getWidth(), getHeight(), this);
    }

    public final Image getImage() {
        return (image);
    }

    public final void setImage(final Image image) {
        this.image = image;
    }
}

С:

import javax.swing.JPanel;
import java.awt.GridLayout;


public final class Map extends JPanel {

    public Map(final GridLayout layout) {
        setLayout(layout);
    }

    public Map(final Integer width, final Integer height) {
        this(new GridLayout(width, height));
    }
}

И:

final Map map = new Map(13, 17);

final Image grass = new ImageIcon("src/main/res/tilesets/grass1.png").getImage();
final Image wood = new ImageIcon("src/main/res/tilesets/wood1.png").getImage();
final Image rock = new ImageIcon("src/main/res/tilesets/rock1.png").getImage();

for (int i = 0; i != 13; ++i) {
    for (int j = 0; j != 17; ++j) {
        if (i % 2 == 0) {
            if (j % 2 == 0)
                map.add(new Tileset(grass), i, j);
            else
                map.add(new Tileset(rock), i, j);
        }
        else
            map.add(new Tileset(wood), i, j);
    }
}

Это даст вам:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...