2017-04-04 1 views
1

JPanel에 대한 오버레이에서 작업하고 있었지만 약간의 문제가 있습니다. 오버레이의 투명도는 JFrame으로 바로 보입니다.JLayeredPane에서 누락 된 JPanel

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.EventQueue; 

import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JLayeredPane; 
import javax.swing.JPanel; 

@SuppressWarnings("serial") 
public class GUI extends JFrame { 
    private GUI() { 
     super("Recorder Part"); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     setLayout(new BorderLayout()); 
     JLayeredPane layers = new Overlay(); 
     add(layers); 

     pack(); 

     getContentPane().setBackground(Color.GREEN); 
     setVisible(true); 
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(() -> new GUI()); 
    } 

    private class Overlay extends JLayeredPane { 
     JPanel base; 
     JPanel overlay; 

     private Overlay() { 
      setPreferredSize(new Dimension(800, 100)); 

      createBase(); 
      createOverlay(); 

      add(base, new Integer(0)); 
      add(overlay, new Integer(1)); 
     } 


     private void createBase() { 
      base = new JPanel(); 
      base.setPreferredSize(new Dimension(800, 100)); 
      base.setBounds(0, 0, 800, 100); 
      base.setBackground(Color.BLUE); 
      base.setOpaque(true); 

      base.add(new JLabel("Hello")); 
     } 

     private void createOverlay() { 
      overlay = new JPanel(); 
      overlay.setPreferredSize(new Dimension(800, 100)); 
      overlay.setBounds(0, 0, 800, 100); 
      overlay.setBackground(new Color(255, 0, 0, 0)); 
     } 
    } 
} 

어떻게이, overlay라는 JPanel 투명 때 있도록 base라는 JpanelJFrame을 보이고 할 수는 없습니다 해결할 수 ?


편집

I 오버레이 패널 이상의베이스 패널의 크기와 동일 하나 개의 차원을 가지는 경우에만이 문제가 발생하는 것을 발견했다. 이 예제에서 프레임의 크기를 조정하여 볼 수 있습니다.

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.event.ComponentAdapter; 
import java.awt.event.ComponentEvent; 

import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JLayeredPane; 
import javax.swing.JPanel; 

@SuppressWarnings("serial") 
public class GUI extends JFrame { 
    private GUI() { 
     super("Recorder Part"); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     setLayout(new BorderLayout()); 
     JLayeredPane layers = new Overlay(); 
     add(layers); 

     pack(); 

     getContentPane().setBackground(Color.GREEN); 
     setVisible(true); 
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(() -> new GUI()); 
    } 

    private class Overlay extends JLayeredPane { 
     JPanel base; 
     JPanel overlay; 

     private Overlay() { 
      addComponentListener(new Resize()); 
      setPreferredSize(new Dimension(800, 100)); 

      createBase(); 
      createOverlay(); 

      add(base, new Integer(0)); 
      add(overlay, new Integer(1)); 
     } 


     private void createBase() { 
      base = new JPanel(); 
      base.setLocation(0, 0); 
      base.setBackground(Color.BLUE); 
      base.setOpaque(true); 

      base.add(new JLabel("Hello")); 
     } 

     private void createOverlay() { 
      overlay = new JPanel(); 
      overlay.setLocation(0, 0); 
      overlay.setSize(new Dimension(800, 100)); 
      overlay.setBackground(new Color(255, 0, 0, 128)); 
     } 

     private class Resize extends ComponentAdapter { 
      @Override 
      public void componentResized(ComponentEvent e) { 
       System.out.println("Resized"); 
       base.setSize(new Dimension(getParent().getWidth(), getParent().getHeight())); 
      } 
     } 
    } 
} 

오버레이 패널이 기본 패널의 크기와 정확히 같아야하므로 바람직하지 않습니다. 나는 어떤 도움을 주셔서 감사합니다.

+1

당신은 1 분 더 빨랐습니다 ... –

답변

1

나는 이것이 벌레라는 과실을 가지고 있습니다.

overlay.setBounds(0, 0, 799, 100); // or (1, 0, 800, 100) 

아마 최적화의 일종, 그것은 완전히 다른 구성 요소에 의해 가려되는 경우 구성 요소를 무시하고 같은,하지만 투명성을 고려하지 않고 : 완전히 오 어떻게되는지 기반을 중복되지 않도록 경계 변경 그 최적화 [: - |

편집 :

확실히 문제입니다 - JComponent의의의 paintChildren 어린이를 기반으로 최적화 어떤 종류의 완전히 다른 아이들에 의해 가려되지 않습니다.

나는 두 가지 해결책을 발견, 첫 번째는 아마 불투명에 오버레이를 설정 원 - 올바른입니다 :

overlay.setOpaque(false); 

이 배경색이 전혀 사용되지 않는 단점이있다.

두 번째는 더 workarround - JLayeredPane의이 optimizedDrawingEnabled에 대해 true를 반환 할이 그 일에서 JComponent의 중지됩니다 : 그 작업을 수행하여 작동하지 않을 수 있습니다 무엇인지

private class Overlay extends JLayeredPane { 

    /// ... 

    @Override 
    public boolean isOptimizedDrawingEnabled() { 
     return true; 
    } 
} 

하지만를, 그래서 선호 첫 번째 해결책!

+0

방금이 사실을 눈치 채 셨습니다. 나는 그것을 편집 할 때 언급했다. 나는 현재 이것을 사용하고 있지만 누군가가 그 주위에있는 방법으로 대답하기를 바라고 있습니다. – Dan

+1

@ 단, 찾았습니다. 편집 된 대답을 참조하십시오. –

+0

도움 주셔서 감사합니다. 나는 두 번째 것을 사용 했으므로 투명한 배경색을 가질 수 있습니다. 이것은 굉장합니다 :) – Dan