Есть ли способ сделать полупрозрачный JInternalFrame uing swing?Прозрачные внутренние рамки - это возможно в java?
Все, что я нашел, это вариант для JFrame (не внутреннего), который не то, что мне нужно.
Есть ли способ сделать полупрозрачный JInternalFrame uing swing?Прозрачные внутренние рамки - это возможно в java?
Все, что я нашел, это вариант для JFrame (не внутреннего), который не то, что мне нужно.
Вы должны иметь возможность использовать 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();
}
});
}
}
ничего не может найти об использовании JLayer для реальных компонентов, а не о некоторых демонстрационных панелях. можете ли вы привести пример правильно переопределенного метода рисования для LayerUI
@maxpovver, он не делает все компоненты полупрозрачными. Поскольку я предположил, что он просто сделает верхний слой медленно полупрозрачным, поэтому может показаться, что каждый компонент постепенно становится более непрозрачным. Это лучшее, что я могу предложить. – camickr
Да, это полная боль. Вы хотите, чтобы ВСЕ кадр и его содержимое были прозрачными? – MadProgrammer
@MadProgrammer да, beacause Мне нужно реализовать эффект затухания для кадра со всем содержимым – maxpovver