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(0, 0); // 1620 780 frame.setSize(1920, 1080); frame.getContentPane().setLayout(new java.awt.BorderLayout(0, 0)); frame.setBackground(new Color(0, 0, 0, 0)); } 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, 0, 0)); 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, 0, 0)); 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, "안녕하세엽", 20, 0, 800, 0, 0, 0); kk.drawImage(kk.frame, "res/niniz.gif", 500, 0, 200, 200); } } | cs |
위 코드를 실행하면 다음과 같이 이미지 텍스트가 화면 위에 뜨게 되고, 이미지가 존재하는 부위를 제외하고는 마우스 클릭이 될 수 있다.
(참고로 gif에서 이미지가 계속 중첩되는 부분은, main문을 thread로 만들어 background를 'frame.setBackground(new Color(0, 0, 0, 0));' 를 통해 계속 투명으로 만들어 주면 된다.)
여기서 이미지를 제외하고 클릭을 허용하게 만드는 부분은 아래 옵션이다.
frame.getRootPane().putClientProperty("apple.awt.draggableWindowBackground", false);
단, 리눅스에서는 위 옵션이 안 먹는다!
고쳐보려고 한참을 찾아봤었는데, 제대로 동작이 잘 안되더라.. ^.^;;..
JFrame의 경우, 아래 옵션을 통해 항상 최상단에 뜨게 된다.
frame.setAlwaysOnTop(true);
마지막으로 키보드 인풋을 listner로 받게 되는데, 위 사항들을 응용하면 다음과 같은 어플리케이션을 만들 수 있다.
'Programming Language > JAVA' 카테고리의 다른 글
JAVA ArrayList 내 단어 길이 내림차순 정렬 (0) | 2019.08.22 |
---|---|
JAVA Combination 조합 코드 예제 (0) | 2019.08.22 |