Make jtoolbar transparent

I have a jPanel with a background and I want to add a JToolbar to it.
My problem is when I add the JToolbar, the default background is bothersome and I set it opaque to false but has no effect.
I want to remove it by default and make it transparent.
I read the following article but didn’t help:
JToolbar background image
Here is my code:

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;

import javax.swing.Action;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JToolBar;

public class Toolbar extends JToolBar {

    private JButton manage;
    private JButton add;
    private JButton search;
    private JButton exit;

    public Toolbar() {
        super();

        manage = new JButton();
        add = new JButton();
        search = new JButton();
        exit = new JButton();

        ImageIcon icon = new ImageIcon("pics/Add-01.png");
        Image img = icon.getImage();
        Image newImage = img.getScaledInstance(80, 80, Image.SCALE_SMOOTH);
        add.setIcon(new ImageIcon(newImage));

        setOpaque(false);

        setBackground(Color.RED);

        add(add);
        add(search);
        add(manage);
        add(exit);

    }

}

      

Thanks for your support.
The code doesn't work:

public class Toolbar extends JToolBar {

    public Toolbar() {
        setBackground(Color.RED);
        setOpaque(false);
        add(new JButton("add"));
    }

    protected void addImpl(Component comp, Object constraints, int index) {
        super.addImpl(comp, constraints, index);
        if (comp instanceof JButton) {
            ((JButton) comp).setContentAreaFilled(false);
        }
    }

}

      

+3


source to share


1 answer


Basically, the buttons still "fill" their backgrounds. You can instruct them not to paint their content (background) viaJButton#setContentAreaFilled

This example sets the background color JToolBar

to red, so you can see that the buttons are now transparent. To make the toolbar transparent, just add setOpaque(false)

to the constructor

Toolbar

public class CustomToolBar extends JToolBar {

    public CustomToolBar() {
        setBackground(Color.RED);
    }

    protected void addImpl(Component comp, Object constraints, int index) {
        super.addImpl(comp, constraints, index);
        if (comp instanceof JButton) {
            ((JButton) comp).setContentAreaFilled(false);
        }
    }

}

      



Extended example ....

Transparent toolbar

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JToolBar;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.border.LineBorder;

public class Test {

    public static void main(String[] args) {
        new Test();
    }

    public Test() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                JButton manage = new JButton("Manage");
                JButton add = new JButton("Add");
                JButton search = new JButton("Search");
                JButton exit = new JButton("Exit");
                CustomToolBar tb = new CustomToolBar();
                tb.add(manage);
                tb.add(add);
                tb.add(search);
                tb.add(exit);

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setContentPane(new TestPane());
                frame.add(tb, BorderLayout.NORTH);
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        private BufferedImage bgImg;

        public TestPane() {
            setLayout(new BorderLayout());
            try {
                bgImg = ImageIO.read(new File("..."));
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }

        @Override
        public Dimension getPreferredSize() {
            return bgImg == null ? new Dimension(200, 200) : new Dimension(bgImg.getWidth(), bgImg.getHeight());
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            if (bgImg != null) {
                Graphics2D g2d = (Graphics2D) g.create();
                int x = (getWidth() - bgImg.getWidth()) / 2;
                int y = (getHeight() - bgImg.getHeight()) / 2;
                g2d.drawImage(bgImg, x, y, this);
                g2d.dispose();
            }
        }

    }

    public class CustomToolBar extends JToolBar {

        public CustomToolBar() {
            setBorder(new LineBorder(Color.BLACK, 2));
            setOpaque(false);
        }

        @Override
        protected void addImpl(Component comp, Object constraints, int index) {
            super.addImpl(comp, constraints, index);
            if (comp instanceof JButton) {
                ((JButton) comp).setContentAreaFilled(false);
            }
        }

    }

}

      

+6


source







All Articles