2013-01-07 1 views
1

JPanel의 구성 요소 표시와 관련하여 혼동 스럽습니다. 다음과 같이 내가 0.8f의 투명도와 사용자 정의 인 JPanel를 작성하는 경우JPanel에서 내용이 반투명하게 만드는 방법은 무엇입니까?

는 가정 -

JPanel panel=new JPanel(){ 
     @Override 
     public void paint(Graphics g) 
     { 
      super.paint(g); 
      BufferedImage img=(BufferedImage)createImage(getWidth(),getHeight()); 
      Graphics2D g2=(Graphics2D) g.create(); 
      g2.setComposite(AlphaComposite.SrcOver.derive(0.8f)); 
      g2.drawImage(img,0,0,null); 
     } 
     @Override 
     public Dimension getPreferredSize() 
     { 
      return new Dimension(300,300); 
     } 
    }; 

가 지금은 프레임의 contentPane로 설정합니다.

frame.setContentPane(panel); 

이제 버튼을 추가합니다.

frame.add(new JButton("Click Here")); 
    frame.add(new JButton("Click Here")); 
    frame.add(new JButton("Click Here")); 
    frame.add(new JButton("Click Here")); 

1) 다음 JPanel의 계층화 하나이고 I는 오버라이드 때 먼저 반투명 이미지 그려진 I는? 반투명 버튼을 얻는 이유는 출력에서의 paint있어서 다음 버튼을 첨가하고, 버튼이 반투명하지 않아야 그들은 그것을 극복해야한다.

2) 또한 4 개의 버튼 중 2 개만 반투명합니다. 왜 그런 극단성이 있습니까?

3)이 4 개의 버튼을 추가하기 전에 표를 추가하면 모든 것이 반투명하게됩니다. 왜요? 내가 JPanel에 대한 paintComponent(Graphics g)를 사용하는 경우

Object[] names = new Object[] { 
      "Title", "Artist", "Album" 
     }; 
     String[][] data = new String[][] { 
      { "Los Angeles", "Sugarcult", "Lights Out" }, 
      { "Do It Alone", "Sugarcult", "Lights Out" }, 
      { "Made a Mistake", "Sugarcult", "Lights Out" }, 
      { "Kiss You Better", "Maximo Park", "A Certain Trigger" }, 
      { "All Over the Shop", "Maximo Park", "A Certain Trigger" }, 
      { "Going Missing", "Maximo Park", "A Certain Trigger" } 
     }; 
     JTable table = new JTable(data, names); 
     frame.add(table); 

4) 아무 것도 내가 테이블을 추가하거나하지 않거나 많은 버튼 added.Why 여부, 반투명입니까?

(응용 프로그램을 실행할 때 즉각적인 출력을 요구합니다. 마우스를 해당 단추 위로 굴리거나 테이블의 행을 클릭하면 불투명 해집니다. 스윙의 페인팅 메커니즘 때문입니다.)

+0

1) '인 JPanel 패널 = 새로운 JPanel의() { @Override 공개 무효 페인트 (그래픽 g) { 는, super.paint (g)은,''되어야 JPanel의 패널 = 새로운 JPanel의() { @Override public void paintComponent (Graphics g) { super.paintComponent (g);'2) 더 빨리 도움을 받으려면 [SSCCE] (http://sscce.org/)를 게시하십시오. –

+0

또한, 생성 한'Graphics' 객체를'dispose()'하는 것을 잊지 마십시오. –

+0

@AndrewThompson : 업데이트 된 질문을 참조하십시오. 마지막 시점 4 –

답변

4

1) 그런 다음 왜 반투명 버튼이 표시됩니까? JPanel은 레이어가 하나 인 이므로 반투명 이미지를 먼저 그렸습니다. 페인트 방법을 재정의하고 버튼을 추가했을 때 버튼이 반투명하지 않아야합니다.

실제로 반투명 효과를 단추 위에 칠했습니다. paint 전화

  • paintChildren
  • paintBorder
    • paintComponent

      그런 다음 당신은 이미 (아이) 그린 된 내용의 맨 위에 반투명 효과를 그렸다. 구성 요소를 추가 할 때 아무런 차이가 없습니다. Swing은 구성 요소가 처음 실현 될 때 (화면에 표시됨)와 더티 영역 (및 로트)에 대한 변경에 대한 응답으로 여러 가지 상황에서 구성 요소를 페인트합니다. 다른 사람의) ... 당신 자신을 속일 필요는 없습니다. 당신은 이걸 통제 할 수 없습니다. ...

      페인트 프로세스를 레이어 방식으로 생각하십시오.첫째로 당신은 당신은 중간 땅을 칠하고 마지막으로, 당신은 가서 치켜 포어 그라운드는 ...

      public class TestTranslucentControls { 
      
          public static void main(String[] args) { 
           new TestTranslucentControls(); 
          } 
      
          public TestTranslucentControls() { 
           EventQueue.invokeLater(new Runnable() { 
            @Override 
            public void run() { 
             try { 
              UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
             } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
             } 
      
             JFrame frame = new JFrame(); 
             frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
             frame.setLayout(new BorderLayout()); 
             frame.add(new TestPane()); 
             frame.pack(); 
             frame.setLocationRelativeTo(null); 
             frame.setVisible(true); 
            } 
           }); 
          } 
      
          public class TestPane extends JPanel { 
      
           private BufferedImage background; 
      
           public TestPane() { 
            setLayout(new GridBagLayout()); 
            try { 
             background = ImageIO.read(new File("C:/Users/shane/Dropbox/MegaTokyo/poster.jpg")); 
            } catch (IOException ex) { 
             ex.printStackTrace(); 
            } 
            add(new JButton("1")); 
            add(new JButton("2")); 
            add(new JButton("3")); 
            add(new JButton("4")); 
            add(new JButton("5")); 
           } 
      
           @Override 
           protected void paintComponent(Graphics g) { 
            super.paintComponent(g); 
            if (background != null) { 
             Graphics2D g2 = (Graphics2D) g.create(); 
             g2.setComposite(AlphaComposite.SrcOver.derive(0.25f)); 
             int x = (getWidth() - background.getWidth())/2; 
             int y = (getHeight() - background.getHeight())/2; 
             g2.drawImage(background, x, y, this); 
             g2.dispose(); 
            } 
           } 
      
           @Override 
           public Dimension getPreferredSize() { 
            return background == null ? new Dimension(300, 300) : new Dimension(background.getWidth(), background.getHeight()); 
           } 
          } 
      } 
      

      enter image description here

      나는 당신이 찾을 수 있습니다 생각, 배경 페인트 ...

      유용)

    1

    일반적으로 paintComponent()이 아닌 paint()을 무시하고 싶습니다. 이것은 아마도 투명성 문제의 원인 일 수 있습니다. 둘째, 아마도 레이아웃을 변경하고 싶을 것입니다. 기본적으로 패널은 FlowLayout을 사용합니다. BorderLayout 또는 GridBagLayout 또는이 두 가지를 혼합하여 사용할 수 있습니다.

    +0

    : 레이아웃은 아무 효과가 없으므로 업데이트 된 질문을 참조하십시오. 다른 점을 추가했습니다. 4. –

    관련 문제