проблема в том, что кнопка сообщает о полной непрозрачности, хотя на самом деле это не так (из-за частично прозрачного цвета)
but.setOpaque(false);
Кстати: как вы видите, я изменил имя поля в соответствии с соглашениями об именах Java :-)
Редактировать
arggghh .. пропустил это, извини. Нужно проверить, что мы делаем в SwingX, от всей головы я бы сказал, что вам нужно переопределить paintComponent и самостоятельно обрабатывать фоновый рисунок, например
/**
* @inherited <p>
*/
@Override
protected void paintComponent(Graphics g) {
if (!isOpaque() && getBackground().getAlpha() < 255) {
g.setColor(getBackground());
g.fillRect(0, 0, getWidth(), getHeight());
}
super.paintComponent(g);
}
не пытался, хотя, может быть, "становится более непрозрачным" снова вернулся с этим ... вернусь завтра
Редактировать 2
хорошо, проверено - отредактированный код работает правильно. Итак, подведем итог: компоненты с полупрозрачным фоном
- должен сообщить, что они непрозрачны, чтобы не перепутать механизм рисования по умолчанию
- должен взять на себя рисование фона и заполнить его самим цветом фона (SwingX JXPanel f.i. Явно поддерживает свойство alpha)
для вашего удобства, вот небольшой прогон с некорректным / правильным фоном рядом
public class TransparentButton {
public TransparentButton() {
JWindow incorrectOpaque = createWindow("incorrect opaque", true);
incorrectOpaque.setLocation(600, 600);
incorrectOpaque.setVisible(true);
JWindow correctOpaque = createWindow("correct opaque", false);
correctOpaque.setLocation(800, 600);
correctOpaque.setVisible(true);
}
private JButton createButton(final boolean opaque) {
JButton but = new JButton("Testing") {
/**
* @inherited <p>
* Overridden to take over background painting with
* transparent color.
*/
@Override
protected void paintComponent(Graphics g) {
if (!isOpaque() && getBackground().getAlpha() < 255) {
g.setColor(getBackground());
g.fillRect(0, 0, getWidth(), getHeight());
}
super.paintComponent(g);
}
};
but.setBackground(new Color(0, 0, 0, 100));
but.setForeground(new Color(70, 155, 255));
but.setOpaque(opaque);
return but;
}
private JWindow createWindow(String text, boolean opaque) {
JWindow window = new JWindow();
JButton but = createButton(opaque);
window.add(but);
window.add(new JLabel(""), BorderLayout.SOUTH);
window.setOpacity(0.5f);
window.setBackground(new Color(0, 0, 0, 0));
window.setSize(new Dimension(200, 100));
return window;
}
public static void main(String[] Args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new TransparentButton();
}
});
}
@SuppressWarnings("unused")
private static final Logger LOG = Logger.getLogger(TransparentButton.class
.getName());
}