2016-09-17 2 views
0

Ich habe ein paar JRadioButton: rb1, rb2; welches in transparentem JPanel p1 enthalten ist, und p1 ist in einem bunten Panel mit dem Namen mainPanel enthalten. Ich will auch diese JRadioButton transparent machen und hier ist, was ich tue:Wie kann ich JRadioButton im Einzelfall transparent machen?

in Mainpanel: mainPanel.setBackground(Color.RED);

in p1: p1.setBackground(new Color(0,0,0,0));

und in RB1 und RB2:

rb1.setOpaque(false); 
     rb1.setContentAreaFilled(false); 
     rb1.setBorderPainted(false); 
     rb2.setOpaque(false); 
     rb2.setContentAreaFilled(false); 
     rb2.setBorderPainted(false); 

es ist ok, wenn rb1 und rb2 in mainPanel enthalten sind oder wenn p1 kein transparentes JPanel ist, aber in meinem Fall ist das Ergebnis nicht das, was ich erwartet habe: result

Wie kann ich dieses Problem lösen? Danke im Voraus!

Antwort

4

Die seltsame Malerei Artefakte Sie sind zu sehen, die durch diese verursacht:

p1.setBackground(new Color(0,0,0,0)); 

, die mit dem übergeordneten Container es ist Hintergrund und neu streichen löschen nicht benachrichtigt. Wenn das Panel also vollständig transparent sein soll, verwenden Sie stattdessen setOpaque(false). Sie müssen diese Methode auch nur auf den Radioknöpfen aufrufen und sonst nichts.

setOpaque benachrichtigt die Eltern zu neu streichen, aber wenn Sie eine halbtransparente Panel wollen, müssen Sie paintComponent überschreiben und super.paintComponent(Graphics) manuell aufrufen.

enter image description here


import java.awt.Color; 
import java.awt.EventQueue; 

import javax.swing.ButtonGroup; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JRadioButton; 

public class Example { 

    public void createAndShowGUI() {  
     JRadioButton encryptButton = new JRadioButton("Encrypt"); 
     encryptButton.setOpaque(false); 

     JRadioButton decryptButton = new JRadioButton("Decrypt"); 
     decryptButton.setOpaque(false); 

     ButtonGroup group = new ButtonGroup(); 
     group.add(encryptButton); 
     group.add(decryptButton); 

     JPanel subPanel = new JPanel(); 
     subPanel.setOpaque(false); 
     subPanel.add(encryptButton); 
     subPanel.add(decryptButton); 

     JPanel mainPanel = new JPanel(); 
     mainPanel.setBackground(Color.CYAN); 
     mainPanel.add(subPanel); 

     JFrame frame = new JFrame(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setContentPane(mainPanel); 
     frame.pack(); 
     frame.setVisible(true); 
    } 

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

} 
+2

(1+) für die Verwendung von 'setOpaque (...)'. Sie können auch [Hintergründe mit Transparenz] (https://tips4java.wordpress.com/2009/05/31/backgrounds-with-transparency/) für Fälle suchen, in denen Sie halbtransparente Hintergründe wünschen. – camickr

+0

Vielen Dank. Ich war es gewohnt, einen transparenten JLabel zu nehmen, aber das ist kein richtiger Weg. danke dir nochmal was mein aller Respekt! –

Verwandte Themen