2016-04-11 35 views
0

Bir Sorunum var: Swing-JButton'un daha güzel görünümlü bir uzantısını yapmaya başladım. Kalan sorunlardan biri: "Yarı saydam" (this.setBackground(new Color(100,100,100,90)); gibi) her ayarladığımda, optik garip olur: fareyi Düğme üzerindeki en son Swing-Element ile bir String (JRadioButton veya JCheckBox gibi) üzerinde tuttuğum her seferinde Gezindim arka planda görünecek.Yarı Şeffaf JButton: Nesneler Arka Planda görünür

Bulunduğum Button:

private boolean transparent; 
private boolean drawImage; 
private final int width; 
private final int height; 
int marginWidth=15; 
int marginHeight=15; 

public MyButton(String text, String command){ 
    super(text); 
    this.setDoubleBuffered(true); 
    this.setOpaque(); 
    this.setActionCommand(command); 

    this.setBackground(ParameterPool.COLOR_BACKGROUND_SECOND); 
    this.setBorder(null); 

    this.width = (int) this.getPreferredSize().getWidth()+marginWidth; 
    this.height = (int) this.getPreferredSize().getHeight()+marginHeight; 

    this.setPreferredSize(new Dimension(this.width, this.height)); 

} 


public void setTransparent() { 
    this.transparent = true; 
    this.setOpaque(false); 
} 

public void setOpaque() { 
    this.transparent = false; 
    this.setOpaque(true); 
} 
@Override 
protected void paintComponent(Graphics g){ 
    Graphics2D g2d = (Graphics2D)g; 


    g2d.fillRoundRect(0,0,width,height,18,18); 

    g2d.setColor(Color.darkGray); 
    g2d.drawRoundRect(0,0,width, height,18,18); 

    FontRenderContext frc = new FontRenderContext(null, false, false); 
    Rectangle2D r = getFont().getStringBounds(getText(), frc); 
    float xMargin = (float)(width-r.getWidth())/2; 
    float yMargin = (float)(height-getFont().getSize())/2; 
    g2d.drawString(getText(), xMargin, (float)getFont().getSize() + yMargin); 
    this.setSize(width, height); 
} 

public JPanel inTransparentPanel(){ 
    JPanel ret = new JPanel(); 
    ret.setOpaque(false); 
    ret.setDoubleBuffered(true); 
    ret.add(this); 
    return ret; 
} 

Bir şey daha: Ben de paintComponent (...) geçersiz kılma olmadan bu çalıştı - Yöntem. Etkisi yok.

+1

'korumalı boşluk boyası Bileşen (Grafik g) { Graphics2D g2d = (Graphics2D) g; .. 'korunmalıdır void paintComponent (Graphics g) {sper.pintComponent (g); Graphics2D g2d = (Graphics2D) g; Daha iyi yardım için, daha önce bir [MCVE] veya [Kısa, Kendini İçeren, Doğru Örnek] (http://www.sscce.org/) gönderin. –

+1

1) 'this.setSize (genişlik, yükseklik); bir boya yönteminde, bir yeniden boyamayı tetikleyebilecek hiçbir şey yapma, sonsuz bir döngüye neden olacağından. 2) 'ret.setDoubleBuffered (true);' ret' bir 'JPanel' olduğundan varsayılan olarak çift arabelleğe alınır. –

+0

Yardımlarınız için teşekkürler, - süper istediğim şey tam olarak değil - setSize tamamen yanlış, teşekkürler Yine de sorun bu değil gibi görünüyor. Aşağıda belirtildiği gibi anladım. – blackwodka86

cevap

1

Tamam, bu sorunu "kazayla" giderdim: Panellerden birinin düğmelerinin hala bir java awt Panosu olduğunu anladım. Bunu bir problem olarak düşünmedim.

+0

Evet (Swing) ve ağır (AWT) ağırlık bileşenleri tarihsel olarak bir problemdi. Oracle sözde düzeltildi, ancak şimdi ikisini karıştırmayı öneren herhangi bir Swing aficionado'yu bilmiyorum. –

+0

Oh, ve neredeyse bahsetmeyi unuttum. Bu sorun, yukarıdaki kaynaktan bildiğimiz bir şey değil, bir [mcve] ile hızlı bir şekilde tanımlanacaktır. Ama tabii ki, muhtemelen bir MCVE yapma sürecinde problemi keşfettiniz;) –