2016-04-11 3 views
0

У меня проблема: я начал делать более красивое расширение Swing-JButton. Одна из оставшихся проблем: всякий раз, когда я устанавливаю ее «Полупрозрачный» (например, this.setBackground(new Color(100,100,100,90));), оптическая система становится странной: каждый раз, когда я наводил указатель мыши на кнопку «Последний свинг-элемент» со строкой (например, JRadioButton или JCheckBox) Я завис над вами, появится в фоновом режиме.Полупрозрачный JButton: Объекты появляются в фоновом режиме

Моя текущая кнопка:

более
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; 
} 

одно: я пытался это не отменяя paintComponent (...) - метод. Нет эффекта.

+1

'protected void paintComponent (Graphics g) { Graphics2D g2d = (Graphics2D) g; ..' должен быть 'protected void paintComponent (Graphics g) {sper.pintComponent (g); Graphics2D g2d = (Graphics2D) g; ..' Чтобы лучше помочь, опубликуйте [MCVE] или [Short, Self Contained, Correct Example] (http://www.sscce.org/). –

+1

1) 'this.setSize (ширина, высота);' не делайте ничего в методе paint, который может вызвать перерисовку, поскольку это вызовет бесконечный цикл. 2) 'ret.setDoubleBuffered (true);' поскольку 'ret' является' JPanel', по умолчанию он дважды буферизуется. –

+0

Спасибо вам за помощь, - супер совсем не то, что я хочу - setSize абсолютно неправ, спасибо Тем не менее это, похоже, не проблема. Я понял это, как указано ниже. – blackwodka86

ответ

1

Хорошо, только что исправил эту проблему «случайно»: я понял, что одна из панелей вокруг этих кнопок все еще была java awt Pane. Никогда не думал об этом как о проблеме.

+0

Да, смешивающий свет (Swing) и тяжелые (AWT) весовые компоненты были исторически проблемой. Oracle предположительно исправил это, хотя я не знаю ни одного поклонника Swing, который теперь рекомендует смешивать два. –

+0

О, и почти забыл упомянуть. Эта проблема не является чем-то, что мы могли бы знать из вышеупомянутого источника, но быстро определили бы с [mcve]. Но, конечно, вы, вероятно, обнаружили бы проблему в процессе создания MCVE;) –

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