Установите JPanel прозрачным для клавиатуры - PullRequest
0 голосов
/ 29 апреля 2019

Я фактически кодирую клавиатуру для приложения, и у меня возникла проблема.Я использую некоторое свободное место в JDialog, который я создаю, чтобы поместить существующую кнопку в верхнем правом углу диалогового окна.Это пустое пространство создает границу для диалогового окна, которое неприятно видеть.Поэтому я попытался сделать панели прозрачными с помощью функции setOpaque (false), но ничего не добился.Должен ли я использовать функцию рисования (которую я не знаю, как использовать)?

Вот моя тестовая функция без тестов setOpaque, которые я сделал:

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класс:

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();
    }
}

///// РЕДАКТИРОВАТЬ ///////

Вот мой код клавиатуры на данный момент, если кто-то хочет его использовать, не стесняйтесь.

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();
    }
}

1 Ответ

1 голос
/ 29 апреля 2019

Простой пример создания прозрачного JFrame:

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));
    }
}
...