Durchsichtiges ButtonUI

barsiq

Mitglied
Hallo,

ich versuche einen halb durchsichtigen JInternalFrame zu realisieren, mit ebensolchen Buttons.

Die ButtonUI sieht dabei so aus - es wird mit einem TexturePaint instanziert, im Grunde ist es so eine Art Color, und damit wird in der Paint-Methode ein Rechteckgemalt.
Sonst ist gar nichts im Code.

Problem ist, wenn die Maus drüber geht oder geklickt wird; wird der Button von halbdurchsichtig immer mehr zu einem undurchsichtigen. Und das kriege ich nicht abgestellt. :(
Code:
class DHP_OpaqueButton_UI extends BasicButtonUI {
	private static TexturePaint Bild;

	public DHP_OpaqueButton_UI(TexturePaint bild) {
		Bild = bild;
	}
	  public static ComponentUI createUI(JComponent c) {
	    return new DHP_OpaqueButton_UI(Bild);
	  }

	  private static MouseListener handCursorListener = new HandCursor();

	  protected void installDefaults(AbstractButton b) {
	    super.installDefaults(b);

	    b.setOpaque(false);
	    b.setBorderPainted(false);
	    b.setRolloverEnabled(true);

	    b.setHorizontalAlignment(AbstractButton.LEFT);
	  }

	  protected void installListeners(AbstractButton b) {
	    super.installListeners(b);
	    b.addMouseListener(handCursorListener);
	  }

	  protected void uninstallListeners(AbstractButton b) {
	    super.uninstallListeners(b);
	    b.removeMouseListener(handCursorListener);
	  }

	  public void paint(Graphics g, JComponent c) {
	    AbstractButton abstractButton = (AbstractButton) c;
	    ButtonModel model = abstractButton.getModel();
	   
	    Graphics2D g2d = (Graphics2D)g;
	    
	    g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.5f));
	    g2d.setPaint(Bild);
	    g2d.fillRoundRect(0, 0, DHP_Popup_Constants.SIZE_OPAQUEBTN.width,DHP_Popup_Constants.SIZE_OPAQUEBTN.height, 15, 15);

	    if (model.isArmed() && model.isPressed()) {}

	   if (model.isRollover()) {}

	    if (model.isRollover()) {}
		   
	    if (abstractButton.isFocusPainted() && abstractButton.hasFocus()) {}

	  }

	  protected void paintFocus(Graphics g, AbstractButton b, Rectangle viewRect,
	      Rectangle textRect, Rectangle iconRect) {}

	  protected void paintButtonPressed(Graphics g, AbstractButton b) {}

	  static class HandCursor extends MouseAdapter {
	    public void mouseEntered(MouseEvent e) {
	      e.getComponent().setCursor(
	          Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
	    }

	    public void mouseExited(MouseEvent e) {
	      e.getComponent().setCursor(Cursor.getDefaultCursor());
	    }
	  }
	}
 
Du zeichnest immer wieder den Button. Ein Bild überlagert das vorherige, dadurch verlierst du die Transparenz.
Um das zu umgehen empfehle ich neuzeichnen mit BufferImage.

Falls du das nicht möchtest, kannst du noch meine Klasse auf http://www.tutorials.de/forum/swing-awt-swt/295830-eigener-button-ersetzt-den-vorherigen.html verwenden.
(Lösch static weg!)
Die Klasse funktioniert wie ein Button. Ist eine andere Lösung, aber es kommt drauf an wie du dich wohler fühlst
 
Zuletzt bearbeitet:
Zurück