Как установить меньший ImageIcon на большем imageIcon на JButton?пока я хочу, чтобы оба изображения были видны - PullRequest
2 голосов
/ 30 мая 2011

Я хочу написать код для Tanks Game, и у меня возникла проблема с настройкой tank.jpg на существующем ImageIcon, потому что я хочу, чтобы оба изображения были видны и отображались пользователю, это как:

JButton block = new JButton () ;
block.setIcon(new ImageIcon("ground.png")) ;// sets the first image 
block.setIcon(new ImageIcon("tank.png")) ;// sets the second image

но если я напишу код, подобный этому, второй setIcon заменит первый, а это то, чего я не хочу, какие-нибудь идеи, как иметь 2 иконки на JButton одновременно? спасибо

Ответы [ 3 ]

2 голосов
/ 30 мая 2011

Самый простой способ - объединить две иконки в одну. Вы можете сделать это либо вручную (если у вас всего несколько комбинаций), либо написать собственную реализацию Icon.

Вы можете, например, совместите две иконки рядом со следующей реализацией:

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

import javax.swing.Icon;


public class DoubleIcon implements Icon {

    private static final int ICONSPACING = 4;

    private final Icon i1;
    private final Icon i2;

    public DoubleIcon(Icon i1, Icon i2) {
        this.i1 = i1;
        this.i2 = i2;
    }

    @Override
    public void paintIcon(Component c, Graphics g, int x, int y) {
        i1.paintIcon(c, g, x, y + (getIconHeight() - i1.getIconHeight()) / 2);
        i2.paintIcon(c, g, x + ICONSPACING + i1.getIconWidth(), y + (getIconHeight() - i2.getIconHeight()) / 2);
    }

    @Override
    public int getIconWidth() {
        return i1.getIconWidth() + ICONSPACING + i2.getIconWidth();
    }

    @Override
    public int getIconHeight() {
        return Math.max(i1.getIconHeight(), i2.getIconHeight());
    }
}
1 голос
/ 30 мая 2011

Составной значок дает вам больше гибкости в том, как нарисованы значки.

0 голосов
/ 30 мая 2011

Вам нужно будет объединить изображения, прежде чем установить значок кнопки. Как вы это сделаете, зависит от того, как вы хотите их объединить. Вы хотите, чтобы один поверх другого, или вы хотите их рядом? В любом случае вам нужно сделать что-то вроде этого:

BufferedImage groundImage = ImageIO.read(new File("ground.png");
BufferedImage tankImage = ImageIO.read(new File("tank.png"));
Graphics2 g2 = groundImage.createGraphics();
g2.drawImage(x, y, tankImage);

Тогда GroundImage будет рисовать tankImage поверх него, начиная с координаты (x, y). В этот момент вы можете установить значок кнопки на GroundImage. (предостережение: я только что ответил на своем iPad, поэтому код может быть не совсем правильным)

...