Search code examples
javaswingjpaneltransparencyjdialog

Set JPanel transparent for keypad


I'm actually codding a keypad for an application and I'm encountering a problem. I'm using some empty space in the JDialog I'm creating to place an exist button on the top right corner of the Dialog box. This empty space is creating a border to the dialog box which is unpleasant to see. So I've tried to make panels transparent with setOpaque(false) function, but I achieved nothing. Do I have to use the paint function (which I don't know how to use) ?

Here is my test function without the setOpaque tests I've done :

package test;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.*;

public class Test {

    public static JFrame frame;

    public static void main(String args[]){
        frame = new JFrame();

        JPanel panel = new JPanel();
        panel.setSize(400, 400);
        panel.setBackground(Color.CYAN);
        panel.setLayout(new GridBagLayout());

        JTextField text = new JTextField("coucou");
        panel.add(text);
        text.addMouseListener(new MouseAdapter() {
            public void mouseClicked(MouseEvent e) {
                text.setText("");
                openKeypad(text);
            }
        });

        frame.setContentPane(panel);
        frame.setSize(400, 400);
        frame.setUndecorated(true);
        frame.setLocation(50,0);
        frame.setVisible(true);

    }

    private static void openKeypad(JTextField text) {
        KeyPad pad = new KeyPad(frame, text);
    }
}

KeyPad class :

package test;

import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;

import javax.imageio.ImageIO;
import javax.swing.*;
import javax.swing.border.EmptyBorder;

public class KeyPad extends JDialog {

    private JTextField field;

    public KeyPad(JFrame parent, JTextField field_) {
        super(parent, true);

        //Initializing field
        field = field_;

        //Setting layout
        JPanel panelButton = new JPanel();
        panelButton.setLayout(new GridLayout(4, 3));

        //Buttons declaration
        JButton b0 = new JButton("0");
        JButton b1 = new JButton("1");
        JButton b2 = new JButton("2");
        JButton b3 = new JButton("3");
        JButton b4 = new JButton("4");
        JButton b5 = new JButton("5");
        JButton b6 = new JButton("6");
        JButton b7 = new JButton("7");
        JButton b8 = new JButton("8");
        JButton b9 = new JButton("9");
        JButton bp = new JButton(".");
        JButton del = new JButton();
        JButton close = new JButton();

        //Setting buttons icons
        try {
            Image img = ImageIO.read(new File("ressources/closeIcon.png"));
            close.setIcon(new ImageIcon(img));
            img = ImageIO.read(new File("ressources/deleteIcon.png"));
            del.setIcon(new ImageIcon(img));
            close.setOpaque(false);
            close.setBorder(new EmptyBorder(0, 0, 0, 0));
            close.setContentAreaFilled(false);
        }catch (Exception e) {
            System.out.println(e);
        }

        //Buttons sizing        
        b0.setPreferredSize(new Dimension(64, 64));
        b1.setPreferredSize(new Dimension(64, 64));
        b2.setPreferredSize(new Dimension(64, 64));
        b3.setPreferredSize(new Dimension(64, 64));
        b4.setPreferredSize(new Dimension(64, 64));
        b5.setPreferredSize(new Dimension(64, 64));
        b6.setPreferredSize(new Dimension(64, 64));
        b7.setPreferredSize(new Dimension(64, 64));
        b8.setPreferredSize(new Dimension(64, 64));
        b9.setPreferredSize(new Dimension(64, 64));
        bp.setPreferredSize(new Dimension(64, 64));
        del.setPreferredSize(new Dimension(64, 64));
        close.setPreferredSize(new Dimension(32, 32));

        //Adding buttons to the panelButton
        panelButton.add(b7);
        panelButton.add(b8);
        panelButton.add(b9);
        panelButton.add(b4);
        panelButton.add(b5);
        panelButton.add(b6);
        panelButton.add(b1);
        panelButton.add(b2);
        panelButton.add(b3);
        panelButton.add(bp);
        panelButton.add(b0);
        panelButton.add(del);

        //Adding Listeners
        b0.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                addDigit('0');
            }
        });
        b1.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                addDigit('1');
            }
        });
        b2.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                addDigit('2');
            }
        });
        b3.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                addDigit('3');
            }
        });
        b4.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                addDigit('4');
            }
        });
        b5.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                addDigit('5');
            }
        });
        b6.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                addDigit('6');
            }
        });
        b7.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                addDigit('7');
            }
        });
        b8.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                addDigit('8');
            }
        });
        b9.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                addDigit('9');
            }
        });
        bp.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                addDigit('.');
            }
        });
        del.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                delDigit();
            }
        }); 
        close.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                disposeDialog();
            }
        });

        //Placing close button
        JPanel panelClose = new JPanel();
        panelClose.setLayout(new BoxLayout(panelClose, BoxLayout.X_AXIS));

        panelClose.add(Box.createRigidArea(new Dimension(64*3, 1)));
        panelClose.add(close);

        JPanel test = new JPanel();
        test.setLayout(new BoxLayout(test, BoxLayout.X_AXIS));
        test.add(panelButton);
        test.add(Box.createRigidArea(new Dimension(32, 1)));

        //Setting main panel
        JPanel panel = new JPanel();
        panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
        panel.add(panelClose);
        panel.add(test);

        //Setting and displaying the Dialog Box
        this.setContentPane(panel);
        this.setUndecorated(true);
        this.pack();
        this.setVisible(true);
    }

    private void addDigit(char i) {
        field.setText(field.getText() + i);
    }

    private void delDigit() {
        if(field.getText().length() > 0) {
            field.setText(field.getText().substring(0, field.getText().length() - 1));
        }
    }

    private void disposeDialog() {
        this.dispose();
    }
}

/////EDIT///////

Here is my keypad code at the moment if someone wants to use it, feel free.

package mainPackage;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;
import java.awt.GridLayout;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;

import javax.imageio.ImageIO;
import javax.swing.*;
import javax.swing.border.EmptyBorder;

public class KeyPad extends JDialog {

    private GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
    private GraphicsDevice[] gs = ge.getScreenDevices();
    private JTextField field;

    public KeyPad(JDialog parent, JTextField field_, String placement) {
        super(parent, true);

        //Initializing field
        field = field_;

        //Setting layout
        JPanel panelButton = new JPanel();
        panelButton.setLayout(new GridLayout(4, 3));

        //Buttons declaration
        JButton b0 = new JButton("0");
        JButton b1 = new JButton("1");
        JButton b2 = new JButton("2");
        JButton b3 = new JButton("3");
        JButton b4 = new JButton("4");
        JButton b5 = new JButton("5");
        JButton b6 = new JButton("6");
        JButton b7 = new JButton("7");
        JButton b8 = new JButton("8");
        JButton b9 = new JButton("9");
        JButton bp = new JButton(".");
        JButton del = new JButton();
        JButton close = new JButton();

        //Setting buttons icons
        try {
            Image img = ImageIO.read(new File("ressources/closeIcon.png"));
            close.setIcon(new ImageIcon(img));
            img = ImageIO.read(new File("ressources/deleteIcon.png"));
            del.setIcon(new ImageIcon(img));
            close.setOpaque(false);
            close.setBorder(new EmptyBorder(0, 0, 0, 0));
            close.setContentAreaFilled(false);
        }catch (Exception e) {
            System.out.println(e);
        }

        //Buttons sizing        
        b0.setPreferredSize(new Dimension(64, 64));
        b1.setPreferredSize(new Dimension(64, 64));
        b2.setPreferredSize(new Dimension(64, 64));
        b3.setPreferredSize(new Dimension(64, 64));
        b4.setPreferredSize(new Dimension(64, 64));
        b5.setPreferredSize(new Dimension(64, 64));
        b6.setPreferredSize(new Dimension(64, 64));
        b7.setPreferredSize(new Dimension(64, 64));
        b8.setPreferredSize(new Dimension(64, 64));
        b9.setPreferredSize(new Dimension(64, 64));
        bp.setPreferredSize(new Dimension(64, 64));
        del.setPreferredSize(new Dimension(64, 64));
        close.setPreferredSize(new Dimension(32, 32));

        //Adding buttons to the panelButton
        panelButton.add(b7);
        panelButton.add(b8);
        panelButton.add(b9);
        panelButton.add(b4);
        panelButton.add(b5);
        panelButton.add(b6);
        panelButton.add(b1);
        panelButton.add(b2);
        panelButton.add(b3);
        panelButton.add(bp);
        panelButton.add(b0);
        panelButton.add(del);
        panelButton.setOpaque(false);

        //Adding Listeners
        b0.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                addDigit('0');
            }
        });
        b1.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                addDigit('1');
            }
        });
        b2.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                addDigit('2');
            }
        });
        b3.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                addDigit('3');
            }
        });
        b4.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                addDigit('4');
            }
        });
        b5.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                addDigit('5');
            }
        });
        b6.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                addDigit('6');
            }
        });
        b7.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                addDigit('7');
            }
        });
        b8.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                addDigit('8');
            }
        });
        b9.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                addDigit('9');
            }
        });
        bp.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                addDigit('.');
            }
        });
        del.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                delDigit();
            }
        }); 
        close.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                disposeDialog();
            }
        });

        //Placing close button
        JPanel panelClose = new JPanel();
        panelClose.setLayout(new BoxLayout(panelClose, BoxLayout.X_AXIS));

        panelClose.add(Box.createRigidArea(new Dimension(64*3, 1)));
        panelClose.add(close);
        panelClose.setOpaque(false);

        JPanel panelButtonWithPadding = new JPanel();
        panelButtonWithPadding.setLayout(new BoxLayout(panelButtonWithPadding, BoxLayout.X_AXIS));
        panelButtonWithPadding.add(panelButton);
        panelButtonWithPadding.add(Box.createRigidArea(new Dimension(32, 1)));
        panelButtonWithPadding.setOpaque(false);

        //Setting main panel
        JPanel panel = new JPanel();
        panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
        panel.add(panelClose);
        panel.add(panelButtonWithPadding);
        panel.setOpaque(false);

        //Setting dialog box transparency
        panelButton.setOpaque(false);
        panelClose.setOpaque(false);
        panelButtonWithPadding.setOpaque(false);
        panel.setOpaque(false);

        //Setting and displaying the Dialog Box
        this.setContentPane(panel);
        this.setUndecorated(true);
        this.setBackground( new Color(0, 0, 0, 0) ); // set transparency on JDialog only
        this.pack();

        //To place the KeyPad anywhere on the panel
        switch(placement) {

        case "BOTTOM_LEFT":
            this.setLocation(gs[Main.screen].getDefaultConfiguration().getBounds().x, 600 - (int) this.getSize().getHeight());
            break;

        case "BOTTOM_CENTER":
            this.setLocation(gs[Main.screen].getDefaultConfiguration().getBounds().x + (int) ((800 - this.getSize().getWidth())/2) , 600 - (int) this.getSize().getHeight());
            break;

        case "BOTTOM_RIGHT":
            this.setLocation(gs[Main.screen].getDefaultConfiguration().getBounds().x + (int) (800 - this.getSize().getWidth()), 600 - (int) this.getSize().getHeight());
            break;

        case "CENTER_LEFT":
            this.setLocation(gs[Main.screen].getDefaultConfiguration().getBounds().x, (int) (600 - this.getSize().getHeight())/2);
            break;

        case "CENTER":
            this.setLocation(gs[Main.screen].getDefaultConfiguration().getBounds().x + (int) ((800 - this.getSize().getWidth())/2), (int) (600 - this.getSize().getHeight())/2);
            break;

        case "CENTER_RIGHT":
            this.setLocation(gs[Main.screen].getDefaultConfiguration().getBounds().x + (int) (800 - this.getSize().getWidth()), (int) (600 - this.getSize().getHeight())/2);
            break;

        case "TOP_LEFT":
            this.setLocation(gs[Main.screen].getDefaultConfiguration().getBounds().x, 0);
            break;

        case "TOP_CENTER":
            this.setLocation(gs[Main.screen].getDefaultConfiguration().getBounds().x + (int) ((800 - this.getSize().getWidth())/2), 0);
            break;

        case "TOP_RIGHT":
            this.setLocation(gs[Main.screen].getDefaultConfiguration().getBounds().x + (int) (800 - this.getSize().getWidth()), 0);
            break;
        }

        this.setVisible(true);
    }

    private void addDigit(char i) {
        field.setText(field.getText() + i);
    }

    private void delDigit() {
        if(field.getText().length() > 0) {
            field.setText(field.getText().substring(0, field.getText().length() - 1));
        }
    }

    private void disposeDialog() {
        this.dispose();
    }
}

Solution

  • Simple example for making a JFrame transparent:

    import java.awt.*;
    import static java.awt.GraphicsDevice.WindowTranslucency.TRANSLUCENT;
    import javax.swing.*;
    
    class TransparentFrame extends JFrame
    {
        public TransparentFrame()
        {
            JPanel panel = new JPanel();
            panel.setOpaque( false );
            panel.add( new JButton("Button") );
            add(panel, BorderLayout.SOUTH);
    
            setUndecorated(true);
            setSize(300, 300);
            //pack();
    //      setOpacity(0.5f); // set transparency on frame and components
            setBackground( new Color(0, 0, 0, 64) ); // set transparency on frame only
    
            setTitle("Transparent Frame Demo");
            setDefaultCloseOperation(DISPOSE_ON_CLOSE);
        }
    
        public static void main(String args[])
        {
            GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
            GraphicsDevice gd = ge.getDefaultScreenDevice();
    
            //  Exit when translucent windows aren't supported
    
            if (!gd.isWindowTranslucencySupported(TRANSLUCENT))
            {
                System.err.println( "Translucency is not supported" );
                System.exit(0);
            }
    
            // Create the GUI on the event-dispatching thread
    
            SwingUtilities.invokeLater(() -> new TransparentFrame().setVisible(true));
        }
    }