2015-07-17 4 views
1

Есть ли способ сделать полупрозрачный JInternalFrame uing swing?Прозрачные внутренние рамки - это возможно в java?

Все, что я нашел, это вариант для JFrame (не внутреннего), который не то, что мне нужно.

+0

Да, это полная боль. Вы хотите, чтобы ВСЕ кадр и его содержимое были прозрачными? – MadProgrammer

+0

@MadProgrammer да, beacause Мне нужно реализовать эффект затухания для кадра со всем содержимым – maxpovver

ответ

2

Вы должны иметь возможность использовать JLayer. Вы можете начать с макета, нарисовав полностью непрозрачный слой того же цвета, что и фон рабочего стола. Затем вы меняете альфа-значение для приближения к ячейке, пока не получите полную прозрачность.

Для получения дополнительной информации и примера окраски с прозрачностью см. Раздел из руководства Swing на странице How to Decorate Components With the JLayer Class.

Если вы заботитесь только о качестве фона можно использовать Alpha Container при использовании компонентов с прозрачностью:

JPanel content = new JPanel(new BorderLayout()); 
content.setBackground(new Color(0, 0, 0, 0)); 
internalFrame.setContentPane(new AlphaContainer(content)); 
internalFrame.setOpaque(false); 

Вы можете изменить значение альфа панели контента до нужной прозрачности.

Edit:

Здесь может попытаться в анимировать прозрачность внутренней рамы и ее компонентов:

import javax.swing.*; 
import java.awt.event.*; 
import java.awt.*; 

public class TransparentInternalFrame extends JInternalFrame implements ActionListener 
{ 
    static int openFrameCount = 0; 
    static final int xOffset = 30, yOffset = 30; 
    private float alpha = 0.0f; 
    private Timer timer = new Timer(500, this); 

    public TransparentInternalFrame() 
    { 
     super("Document #" + (++openFrameCount), true, true, true, true); 
     setSize(300,300); 
     setLocation(xOffset * openFrameCount, yOffset * openFrameCount); 
     setVisible(true); 
    } 

    @Override 
    public void paint(Graphics g) 
    { 
     g.setColor(getDesktopPane().getBackground()); 
     g.fillRect(0, 0, getWidth(), getHeight()); 

     Graphics2D g2 = (Graphics2D)g.create(); 
     g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, alpha)); 
     super.paint(g2); 
    } 

    public void showFrame() 
    { 
     timer.start(); 
    } 

    public void hideFrame() 
    { 
     alpha = 0.0f; 
     repaint(); 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) 
    { 
     alpha += .05f; 
     alpha = Math.min(1.0f, alpha); 
     System.out.println(alpha); 

     if (alpha >= 1.0f) 
      timer.stop(); 

     repaint(); 
    } 

    private static void createAndShowGUI() 
    { 
     JDesktopPane desktop = new JDesktopPane(); 
     desktop.setBackground(Color.YELLOW); 

     TransparentInternalFrame tif = new TransparentInternalFrame(); 
     desktop.add(tif); 
     tif.add(new JButton("Hello"), BorderLayout.PAGE_START); 

     JButton show = new JButton("Show Internal Frame"); 
     show.addActionListener(new ActionListener() 
     { 
      @Override 
      public void actionPerformed(ActionEvent e) 
      { 
       tif.showFrame(); 
      } 
     }); 

     JButton hide = new JButton("Hide Internal Frame"); 
     hide.addActionListener(new ActionListener() 
     { 
      @Override 
      public void actionPerformed(ActionEvent e) 
      { 
       tif.hideFrame(); 
      } 
     }); 

     JFrame frame = new JFrame("SSCCE"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(show, BorderLayout.PAGE_START); 
     frame.add(desktop); 
     frame.add(hide, BorderLayout.PAGE_END); 
     frame.setLocationByPlatform(true); 
     frame.setSize(500, 500); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) 
    { 
     EventQueue.invokeLater(new Runnable() 
     { 
      public void run() 
      { 
       createAndShowGUI(); 
      } 
     }); 
    } 
} 
+0

ничего не может найти об использовании JLayer для реальных компонентов, а не о некоторых демонстрационных панелях. можете ли вы привести пример правильно переопределенного метода рисования для LayerUI , который позволяет получать прозрачность для дочерних объектов компонента слоя? – maxpovver

+0

@maxpovver, он не делает все компоненты полупрозрачными. Поскольку я предположил, что он просто сделает верхний слой медленно полупрозрачным, поэтому может показаться, что каждый компонент постепенно становится более непрозрачным. Это лучшее, что я могу предложить. – camickr

 Смежные вопросы

  • Нет связанных вопросов^_^