Цвет фона Jbutton ImageIcon белый, когда он должен быть прозрачным. Кроме того, исчезают соседние кнопки с иконками - PullRequest
0 голосов
/ 24 октября 2019

Попытка сделать игру тральщика на Java. Используя 2d массив кнопок для игрового поля. С режимом пометки, который использует imageicon, чтобы установить для каждого значка j серый или красный флажок (если включен режим пометки). Я создал 2 растровых изображения с прозрачным фоном вокруг флага. Моя проблема в том, что независимо от того, что я делаю, я не могу заставить значок сидеть на кнопке без белого фона. Я пробовал несколько разных решений, в том числе с использованием временного BufferedImages для прохождения пикселя за пикселем, чтобы гарантировать, что белые пиксели были прозрачными на изображении, но это не работает. Эти разделы прозрачны до тех пор, пока не будет создан ImageIcon. При поиске других вопросов кажется, что большинство людей используют формат изображений .png (начинающийся с bmp), но переключение на png также не решило проблему. Белый фон позади изображения значка флагов, кажется, происходит от самого ImageIcon, так как при отладке на каждом этапе до того, как он становится значком, изображение не имеет фона (пример изображения ниже), но в приложении есть фон. Я не знаю, поможет ли здесь изменение внешнего вида Java, но я планирую реализовать это позже. Возможно ли это даже с ImageIcon?

Кроме того, еще одна проблема, которую я недавно заметил, состоит в том, что линии между кнопками, которые имеют значки, исчезли (это также можно увидеть на изображении ниже). Когда установлен значок jbuttons, граница между соседними кнопками со значками исчезает, изображение значка слишком велико и «сидит» поверх границ соседних кнопок?

Я не задавал вопрос здесь, вдостаточно времени, дайте мне знать, если я не следую правилу публикации вопросов, или дайте мне знать, если их больше информации, которую я пропустил.

private BufferedImage rflagimg;
private BufferedImage gflagimg;
private Image rflagscaledimg;
private Image gflagscaledimg;
private BufferedImage rflagbuff;
private BufferedImage gflagbuff;
private ImageIcon redflagicon;
private ImageIcon greyflagicon;


    //init all of the game buttons and add them to the main panel
    for (int i = 0; i < NUM_BLOCKS; i++)
    {
        button[i] = new JButton();
        button[i].addActionListener(this);
        button[i].setActionCommand("" + i);
        button[i].setFocusPainted(false);
        button[i].setOpaque(false);
        button[i].setName("noFlag");
        centerpanel.add(button[i]);
    }


    //load the image files into their respective BufferedImage
     rflagimg = ImageIO.read(getClass().getResource(rflagpath));
     gflagimg = ImageIO.read(getClass().getResource(gflagpath));


    //scale and then prep to make white pixels transparent
    rflagscaledimg = rflagimg.getScaledInstance(SCLD_ICON_WID, SCLD_ICON_HGHT, java.awt.Image.SCALE_SMOOTH);
    gflagscaledimg = gflagimg.getScaledInstance(SCLD_ICON_WID, SCLD_ICON_HGHT, java.awt.Image.SCALE_SMOOTH);
    rflagbuff = new BufferedImage(SCLD_ICON_WID, SCLD_ICON_HGHT, BufferedImage.TYPE_INT_ARGB);
    gflagbuff = new BufferedImage(SCLD_ICON_WID, SCLD_ICON_HGHT, BufferedImage.TYPE_INT_ARGB);
    rflagbuff.getGraphics().drawImage(rflagscaledimg, 0, 0, null);
    gflagbuff.getGraphics().drawImage(gflagscaledimg, 0, 0, null);
    final BufferedImage rflag_trans = new BufferedImage(rflagbuff.getWidth(), rflagbuff.getHeight(), BufferedImage.TYPE_INT_ARGB);
    final BufferedImage gflag_trans = new BufferedImage(gflagbuff.getWidth(), gflagbuff.getHeight(), BufferedImage.TYPE_INT_ARGB);


    //Both for loops are for ensuring the white pixels are transparent
    Color cTrans = new Color(255, 0, 0, 0);

    for (int x = 0; x < rflagbuff.getWidth(); x++)
    {
        for (int y = 0; y < rflagbuff.getHeight(); y++)
        {
            Color c = new Color(rflagbuff.getRGB(x, y), true);
            Color cNew = (c.equals(Color.WHITE) ? cTrans : c);
            rflag_trans.setRGB(x, y, cNew.getRGB());
        }
    }

    for (int x = 0; x < gflagbuff.getWidth(); x++)
    {
        for (int y = 0; y < gflagbuff.getHeight(); y++)
        {
            Color c = new Color(gflagbuff.getRGB(x, y), true);
            Color cNew = (c.equals(Color.WHITE) ? cTrans : c);
            gflag_trans.setRGB(x, y, cNew.getRGB());
        }
    }

    //where it goes astray
    //WHY DOES IMAGEICON use white when the values are transparent/nonexistant.
    redflagicon = new ImageIcon(rflag_trans);
    greyflagicon = new ImageIcon(gflag_trans);

bmp изображение без фона:

bmp image with no background

значок в приложении на белом фоне (выпуск):

icon in app with white background(issue)

...