Newsgroup: it.comp.java
Titolo: [?] JButton trasparente: come?

Salve a tutti!
E' possibile rendere un pulsante traparente?
Ho un JPanel con sopra dei pulsanti ma mi coprono parte dell'immagine che ho
steso sul pannello... come fare?
GRAZIE A TUTTI!
ciao cac


io ho preso spunto dall'esempio RoundButton del java tutorial che
trovi online sul sito sun. e' per AWT ma se invece di ereditare da
Component erediti da JComponent direi che il gioco e' fatto (magari e'
giocare sporco... non so... ma funziona).
in base alla mia piccola esperienza posso dirti che i punti chiave
sono:
- scrivere il gestore degli eventi( piu' che altro del mouse)
- scrivere la routine che disegna il bottone (o non lo disegna :-))
paintComponent (invece che paint... ma funziona anche con paint...)
- avere cura di definire l'area del bottone riscrivento il metodo
contains ed eseguendo un opportuna setBounds.
se usi i Component ci sono problemi di flickering che possono essere
risolti seguendo un ulteriore esempio nello stesso tutorial... nessun
problema con JComponent
unico problema irrisolto e' che dopo aver fatto la remove del bottone
in questione, e' necessario forzare un repaint del JPanel per farlo
sparire... forse e' necessario riscrivere qualche altro metodo di
JComponent... ma non so quale...
credo che si possano trarre molte informazioni da JFC Unleashed
capitolo 24... ma ora non  ho tempo di leggerlo... se scopri qualcosa
fammelo sapere
http://www.szptt.net.cn/9810dwnl/new/jfc/ch24/ch24.htm
ciao
-- 
Seti@Home Java Applets
http://maruko.cjb.net/

Ciao scusa essendo interessato anch'io all'orgomento,ho provato a seguire
cio' che hai consigliato a caccamo81,il problema è che non ho capito dove
sia precisamente il codice che rende trasparente il bottone,in quanto ...
sinceramente non mi funziona ossia mi appare il bottone nel jpanel ma invece
di avere lo sfondo della jpg che gli ho piazzato sotto mi rimane di color
grigio chiaro (scuro alla pressione ) , tu come hai risolto il problema ???
ciao
Diego



il bottone non e' "reso trasparente"... semplicemente non disegni in
parte del rettangolo che occuperebbe se fosse un bottone standard...
fai riferimento all'esempio RoundButton? se si'... guarda cosa succede
nel metodo paint... se tu disegni la jpg e poi sopra ci vai a
disegnare altro ovviamente non vedi la jpg... ma forse non ho capito
cosa intendi..
se usi JComponent (non l'ho detto nel post precedente ma e'
necessario) bisogna mettere "setOpaque(false)" nel costruttore del
componente per indicare che il componente non ridisegna tutta la sua
superficie ma solo parte di essa.


 cosa intendi..
ok ti faccio un copia incolla del codice :
//-------------- INIZIO CODICE !!!
import java.awt.*;
import javax.swing.*;
public class test extends JFrame{
  Container win = getContentPane();
public test() {
  super("Test");
  ImgPanel panel = new ImgPanel();
  JButton button = new JButton("Bottone di prova");
  button.setBorderPainted(false);
  button.setFocusPainted(false);
  panel.add(button);
  win.add(panel);
  setDefaultCloseOperation(EXIT_ON_CLOSE);
  setSize(800,600);
  setLocation(0,0);
  setTitle("Test");
  setVisible(true);
  setResizable(false);
}
public static void main(String [] args){
    new test();
  }
}
class ImgPanel extends JPanel {
 Image img;
public ImgPanel(){
 Toolkit tk = Toolkit.getDefaultToolkit();
 img=tk.getImage("Tramonto.jpg");
 MediaTracker mt =new MediaTracker(this);
 mt.addImage(img,1);
 try {mt.waitForAll();}
  catch (InterruptedException e){}
}
public void paintComponent(Graphics g){
  super.paintComponent(g);
  g.drawImage(img,0,0,null);
}
}
// ---------------FINE CODICE !!!
ok il problema è come faccio a far sparire se è possibile l'area grigia che
sta dietro il bottone e metterci un'area trasparente ?? Ossia come faccio a
fare in modo che si visualizzi solo l'etichetta del bottone ??
spero di essermi spiegato
grazie per le dritte ....
Diego


allora, io faccio cosi'... forse non e' del tutto corretto ma....
creo una nuova classe che eredita da JComponent.
nel costruttore metto:
public class Bietolone extends JComponent
{
    ActionListener actionListener;
 
    public Bietolone(int x, int y, int largh, int alt)
    {
	//bla bla bla
	//imposto i posizione e confini del component
        setBounds(new Rectangle(x, y, largh, alt));
        setToolTipText(bla bla bla);
        setOpaque(false);
        enableEvents(AWTEvent.MOUSE_EVENT_MASK);
    }
    public Dimension getPreferredSize()
    {
        return new Dimension(getBounds().width, getBounds().height);
    }
    public Dimension getMinimumSize()
    {
        return new Dimension(getBounds().width, getBounds().height);
    }
    public void addActionListener(ActionListener listener)
    {
        actionListener = AWTEventMulticaster.add(actionListener,
listener);
        enableEvents(AWTEvent.MOUSE_EVENT_MASK);
    }
    public void removeActionListener(ActionListener listener)
    {
        actionListener = AWTEventMulticaster.remove(actionListener,
listener);
    }
    public void processMouseEvent(MouseEvent e)
    {
	//bla bla bla
	//simile a round button
        Graphics g;
        switch(e.getID()) {
            case MouseEvent.MOUSE_PRESSED:
	            break;
            case MouseEvent.MOUSE_RELEASED:
	            break;
            case MouseEvent.MOUSE_ENTERED:
                break;
            case MouseEvent.MOUSE_EXITED:
        	    break;
        }
        super.processMouseEvent(e);
    }
    public void paintComponent(Graphics g)
    {
	//qui disegni solo la stringa
        g.drawString(bla bla bla);
    }
}
direi di aver detto tutto cio' che so....


Cavolo sei grande funziona tutto alla perffezione ...... !!!
io ho fatto pero' questa modifica .....
public class MyPersonalButton extends JComponent implements MouseListener
{
    public MyPersonalButton()
    {
        setBounds(new Rectangle(0, 0, 20, 10));
        setToolTipText("Tool Tip");
        setOpaque(false);
       addMouseListener(this);
    }
    public Dimension getPreferredSize()
    {
        return new Dimension(getBounds().width, getBounds().height);
    }
    public Dimension getMinimumSize()
    {
        return new Dimension(getBounds().width, getBounds().height);
    }
  public void mouseClicked(MouseEvent e){
 if(e.getClickCount()==2 ) //DOPPIO CLICK
  System.out.println("Magari funziona !!!");
  }
  public void mouseEntered(MouseEvent e) {}
  public void mouseExited(MouseEvent e) {}
  public void mousePressed(MouseEvent e) {}
  public void mouseReleased(MouseEvent e) {}
    public void paintComponent(Graphics g)
    {
        g.drawString("AA", 5, 10);
    }
Cosi' mi sembra più semplice gestire gli eventi del mouse, oppure ho fatto
una cavolata ????
Ora mi sono intoppato in altra cosa .... adesso vedo se riesco a risolverla
....
GRAZIE PER LE DRITTE !!!
mi sei stato di grande aiuto !

creo una nuova classe che eredita da JComponent.
Forse la prendi un po' alla lontana ;-)
Prova a dare un'occhita al demo SwingSet2 (nella cartella demo del tuo 
jdk).
Posto un piccolo demo (mio) sperando di aver capito cosa volete ottere.
Come piccola annotazione aggiungerei:
volendo ottenere un "particolare" bottone, perché non estendere JButton 
invece di partire da JComponent?!
import java.awt.*;
import javax.swing.*;
public class DemoBottoneTrasparente {
  public static void main(String[] args) {
    JButton button = new JButton("Trasparente?");
    button.setOpaque(false);
    button.setBorderPainted(false);
    button.setFocusPainted(false);
    button.setContentAreaFilled(false);
    JPanel panel = new JPanel();
    panel.setBackground(Color.green);
    panel.add(button);
    JFrame frame = new JFrame("Bottone trasparente");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(320, 120);
    frame.getContentPane().add(panel);
    frame.setVisible(true);
  }
}
-- 
Ciao
	Fabrizio C.

Posto un piccolo demo (mio) sperando di aver capito cosa volete ottere.
e "cosa volete ottenere"
Sono proprio rincitrullito!
-- 
Ciao
	Fabrizio C.

oo mmmmmmm è proprio quello che volevo ottenere in UNA SOLA RIGA DI CODICE
!!!!!!!
    button.setOpaque();
TI RINGRAZIO !
diego

    JButton button = new JButton("Trasparente?");
if(FabrizioCamera.isSarcastic()) System.out.println("Prrrrrr! :-) ");
grazie, 
    button.setBorderPainted(false);
    button.setFocusPainted(false);
    button.setContentAreaFilled(false);
queste 3 righe una settimana fa mi avrebbero evitato di buttarmi sul
JComponent... in ogni caso la conversione ha richiesto 5 minuti...
per quanto riguarda il demo che suggerisci... sigh... l'ho notato solo
ieri pomeriggio...
e per gestire il mouse (il mio "bottone" cambia colore al passaggio
del mouse) e' corretto riscrivere processMouseEvent o e' meglio
implementare l'interfaccia MouseListener?



ah, nel mio caso, essendo il bottone poligonale, non basta cambiare il
colore della scritta che c'e' sopra... devo ridisegnare il bottone.


implementare l'interfaccia MouseListener?
Decisamente la seconda :-)
-- 
Ciao
	Fabrizio C.