При публикации вопроса рекомендуется опубликовать MRE , как показано ниже:
import java.awt.Color;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class GameManager extends JFrame{
private final Map <String, String> images = new HashMap<>(2);
GameManager()
{
images.put("Articuno", "https://cdn3.iconfinder.com/data/icons/softwaredemo/PNG/256x256/Box_Green.png");
images.put("Rayquaza", "https://cdn3.iconfinder.com/data/icons/softwaredemo/PNG/256x256/Box_Red.png");
JPanel pnlPokemonInParty = new JPanel(new GridBagLayout());
GridBagConstraints c = new GridBagConstraints();
JButton btn1 = gifBtn("Articuno");
JButton btn2 = gifBtn("Rayquaza");
c.gridx = 0;
pnlPokemonInParty.add(btn1, c);
c.gridx = 1;
pnlPokemonInParty.add(btn2, c);
this.add(pnlPokemonInParty);
this.pack();
this.setVisible(true);
}
public JButton gifBtn(String name)
{
final JButton btn = new JButton();
URL url = null;
try {
url = new URL(images.get(name));
} catch (MalformedURLException ex) {
ex.printStackTrace();
}
Icon icon = new ImageIcon(url);
btn.setIcon(icon);
btn.setBackground(new Color(50,50,50,0));
return btn;
}
public static void main(String[] args)
{
GameManager gameManager = new GameManager();
}
}
Код работает нормально, используя общедоступные изображения, поэтому он предполагает, что существует проблема с местный ресурс. MRE значительно облегчает помощь и является мощным средством отладки. Во многих случаях при подготовке вы, вероятно, найдете проблему.
Редактировать 1: С новым добавлением теперь проблема ясна: каждая кнопка отображает два изображения друг над другом.
Проблема действительно исчезает при удалении
btn.setBackground(new Color(50,50,50,0));
Это может быть объяснено
«setBackground () плохо читается на некоторых платформах» взято из ответа @trashgod. Эту проблему можно устранить, установив LAF, как описано в этом
ответе @Andrew Thompsom. Вот
mre демонстрирующий это.
Соблюдение этого свойства зависит от внешнего вида, некоторые могут игнорировать его.
(Цитируется из JComponent#setBackground(Color)
документация * 1027) *.)
Редактировать 2:
Пользовательский JButton
, который переопределяет paintComponent
, работает правильно (с прозрачным цветом, где альфа равен 0, например new Color(50,50,50,0)
или любой другой цвет):
class Main extends JFrame{
private final Map <String, String> images = new HashMap<>();
Main()
{
images.put("Articuno", "https://66.media.tumblr.com/d9105814c15295196a3dbe75c32ba1a0/tumblr_oagpklvBGf1scncwdo1_400.gif");
images.put("Rayquaza", "https://play.pokemonshowdown.com/sprites/ani-back-shiny/rayquaza.gif");
images.put("GreenCircle", "https://cdn3.iconfinder.com/data/icons/softwaredemo/PNG/128x128/Circle_Green.png");
images.put("RedBox", "https://cdn3.iconfinder.com/data/icons/softwaredemo/PNG/256x256/Box_Red.png");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
getContentPane().setBackground(Color.WHITE);
this.setLayout(new FlowLayout());
this.add(gifBtn("GreenCircle"));
this.add(gifBtn("RedBox"));
this.add(gifBtn("Articuno"));
this.add(gifBtn("Rayquaza"));
this.pack();
this.setVisible(true);
}
public JButton gifBtn(String name)
{
JButton btn = new CustomButton();
try {
URL url = new URL(images.get(name));
btn.setIcon(new ImageIcon(url));
} catch (MalformedURLException ex) { ex.printStackTrace(); }
return btn;
}
public static void main(String[] args) throws Exception
{
new Main();
}
}
class CustomButton extends JButton{
private final Color bgColor = new Color(255,192,203,0);
public CustomButton() {
//setBorderPainted(false); //optioal
setContentAreaFilled(false);
setOpaque(false);
}
@Override
public void paintComponent(Graphics g){
g.setColor(bgColor);
Rectangle r = g.getClipBounds();
g.fillRect(r.x, r.y, r.width, r.height);
super.paintComponent(g);
}
}
JComponent#setBackground(Color)
документация состояния:
Прямые подклассы JComponent должны переопределить paintComponent, чтобы соблюдать это свойство. Это зависит от внешнего вида, чтобы почитать это свойство, некоторые могут проигнорировать его.
по какой-то причине JButton
нет.