Programming Language/JAVA

투명한 JPanel 만들기

바나나인간 2019. 2. 28. 00:36

JPanel을 다루다보면, 투명한 JPanel에, JFame 뒷면이 터치 되는 through touchable ..? JPanel..? 을 만들고 싶은 욕구가 생긴다.

오늘은 그 예제가 되는 프로젝트를 만들어 보았다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
package com.shkim.temp.panel;
 
import java.awt.Color;
import java.awt.Font;
import java.awt.Image;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.ArrayList;
import java.util.List;
 
import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
 
public class TransparentPanel extends JDialog {
    // public static void main(String[] args) throws IOException {
    public JFrame frame = new JFrame("Hello");
    public List<JLabel> jLabelList = new ArrayList<JLabel>();
    static KeyListener listener = new KeyListener() {
 
        public void keyPressed(KeyEvent e) {
            printEventInfo("Key Pressed", e);
 
        }
 
        public void keyReleased(KeyEvent e) {
            // TODO Auto-generated method stub
 
        }
 
        public void keyTyped(KeyEvent e) {
            // TODO Auto-generated method stub
            printEventInfo("Key Typed", e);
 
        }
 
        private void printEventInfo(String str, KeyEvent e) {
            System.out.println(str);
            int code = e.getKeyCode();
            System.out.println("   Code: " + KeyEvent.getKeyText(code));
            System.out.println("   Char: " + e.getKeyChar());
        }
 
    };
 
    public void initial() {
        frame.setDefaultCloseOperation(javax.swing.WindowConstants.HIDE_ON_CLOSE);
        frame.setUndecorated(true);
        frame.setAlwaysOnTop(true);
        frame.setType(javax.swing.JFrame.Type.UTILITY);
        frame.getRootPane().putClientProperty("apple.awt.draggableWindowBackground"false);
        frame.setLocation(00); // 1620 780
        frame.setSize(19201080);
        frame.getContentPane().setLayout(new java.awt.BorderLayout(00));
        frame.setBackground(new Color(0000));
    }
 
    public void drawImage(JFrame frame, String fileName, int x_coor, int y_coor, int x_size, int y_size) {
        ImageIcon myPicture0 = new ImageIcon(fileName);
        Image image0 = myPicture0.getImage();
        Image resizedImage0 = image0.getScaledInstance(x_size, y_size, Image.SCALE_DEFAULT);
        ImageIcon resizedMypic = new ImageIcon(resizedImage0);
        JLabel pitureLabel0 = new JLabel(resizedMypic);
        pitureLabel0.setBorder(BorderFactory.createEmptyBorder(y_coor, x_coor, 00));
        frame.getContentPane().add(pitureLabel0, 0);
        frame.setVisible(true);
    }
 
    public void drawString(JFrame frame, String sentence, int size, int y_coord, int x_coord, float h, float s,
            float b) {
        JLabel key = new JLabel();
        key.setText(sentence);
        Font myFont = new Font("NanumBarunGothic", Font.BOLD, size);
        key.setFont(myFont);
        key.setForeground(Color.getHSBColor(h, s, b));
        key.setBorder(BorderFactory.createEmptyBorder(y_coord, x_coord, 00));
        frame.getContentPane().add(key, 0);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }
 
    public static void main(String[] args) {
        TransparentPanel kk = new TransparentPanel();
        kk.initial();
        kk.frame.addKeyListener(listener);
        kk.drawString(kk.frame, "안녕하세엽"200800000);
        kk.drawImage(kk.frame, "res/niniz.gif"5000200200);
    }
}
cs


위 코드를 실행하면 다음과 같이 이미지 텍스트가 화면 위에 뜨게 되고, 이미지가 존재하는 부위를 제외하고는 마우스 클릭이 될 수 있다.

(참고로 gif에서 이미지가 계속 중첩되는 부분은, main문을 thread로 만들어 background를 'frame.setBackground(new Color(0000));' 를 통해 계속 투명으로 만들어 주면 된다.)


여기서 이미지를 제외하고 클릭을 허용하게 만드는 부분은 아래 옵션이다.

frame.getRootPane().putClientProperty("apple.awt.draggableWindowBackground"false);

단, 리눅스에서는 위 옵션이 안 먹는다!

고쳐보려고 한참을 찾아봤었는데, 제대로 동작이 잘 안되더라.. ^.^;;..


JFrame의 경우, 아래 옵션을 통해 항상 최상단에 뜨게 된다.

frame.setAlwaysOnTop(true);


마지막으로 키보드 인풋을 listner로 받게 되는데, 위 사항들을 응용하면 다음과 같은 어플리케이션을 만들 수 있다.