JPopupMenu translúcido dentro de uma janela translúcida - alternativa?
Não tenho certeza se isso é possível, mas existe uma maneira de permitir que os pop-ups sejam translúcidos mesmo quando o contêiner pai também é translúcido?
Se não,Qual seria a alternativa sábia para usar ou estender em vez deJPopupMenu
?
Nota:Translúcido refere-se a um componente que não tem 'antecedentes', semelhante ao efeito desetOpaque(false);
. Obrigado.
De uma resposta do fórum pelo usuáriocamickr em 2009:
Não sei se a transparência pintada mudou em 1.6.0_10. Antes disso, acredito que a transparência só pode ser alcançada em componentes leves (ou seja, Swing faz toda a pintura). JFrame, JWindow e JDialog não são leves porque usam componentes do sistema operacional.
No caso de um pop-up, ele é leve quando totalmente contido em seu quadro pai. Mas um popup leve não pode ser pintado fora dos limites do quadro, então um JWindow (eu acredito) é usado como o popup, que não pode ser transparente.
SSCCE: Mostrando JWindow translúcido sobre o topo do JFrame translúcido
<code>import com.sun.awt.AWTUtilities; import java.awt.Color; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.RenderingHints; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.*; public class OpaqueWindowSSCCE { private int countdown = 5; public static void main(String[] args) { new OpaqueWindowSSCCE(); } public OpaqueWindowSSCCE() { final JFrame frame = new JFrame("OpaqueWindowSSCCE"); final JWindow window = new JWindow(); new Timer(1000, new ActionListener(){ @Override public void actionPerformed(ActionEvent e) { if(--countdown == 0){ frame.dispose(); window.dispose(); System.exit(0); } else { frame.repaint(); } } }).start(); frame.setContentPane(new JPanel() { @Override public void paintComponent(Graphics paramGraphics) { super.paintComponent(paramGraphics); Graphics2D g = (Graphics2D) paramGraphics.create(); g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g.setColor(new Color(50, 50, 50)); g.fillRoundRect(0, 0, getWidth(), getHeight(), 10, 10); g.setColor(new Color(180, 180, 180)); g.drawString("Closing in " + countdown + " seconds", 20, 25); } }); window.setContentPane(new JPanel() { @Override public void paintComponent(Graphics paramGraphics) { super.paintComponent(paramGraphics); Graphics2D g = (Graphics2D) paramGraphics.create(); g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g.setColor(new Color(180, 180, 180)); g.fillRoundRect(0, 0, getWidth(), getHeight(), 10, 10); } }); frame.setUndecorated(true); ((JComponent) frame.getContentPane()).setOpaque(false); ((JComponent) window.getContentPane()).setOpaque(false); AWTUtilities.setWindowOpaque(frame, false); AWTUtilities.setWindowOpaque(window, false); window.setAlwaysOnTop(true); frame.setBounds(200,200,500,500); window.setBounds(600,600,200,200); frame.setVisible(true); window.setVisible(true); } } </code>