Oppure

Loading
11/04/12 18:06
ht-never
sto sviluppando un programma e mi piacerebbe creare un bottone personalizzato... solo che se creo un bottone che estende AbstractButton quando ci clicco sopra non succede nulla.
package glow;
import javax.swing.*;
import java.awt.*;
@SuppressWarnings("serial")
public class XButton extends AbstractButton
{
  private Color color = Color.white;
  private String string = new String();
  private Dimension dim = new Dimension(30,30);
  private Color borderColor = Color.white;
  Graphics graph;
  
  public XButton(String s, Color c, Color border)
  {
	this.color = c;
	this.string = s;
	this.borderColor = border;
    this.dim = new Dimension(s.length()*9,30);
  }
  
  public XButton(String s)
  {
	this.string = s;
    setPreferredSize(new Dimension(300,200));
  }
  public XButton(Color c)
  {
	this.color = c;
    setPreferredSize(new Dimension(300,200));
  }
  public XButton(Dimension dim,Color c)
  {
	this.color = c;
    setPreferredSize(dim);
  }

  public void paintComponent(Graphics g)
  {
    super.paintComponent(g);
    graph = g;
    paintInDeviceCoords(g);
  }

  public void paintInDeviceCoords(Graphics g)
  {
    /* assegna modo di riempimento sfumato */
    ((Graphics2D)g).setPaint( new GradientPaint(0,0, Color.magenta,
                              300,200, Color.green) );
    g.setColor(color);
    g.fillRect(0,0,(int)dim.getWidth(),(int)dim.getHeight());
    g.setColor(Color.black);
    g.setFont(new Font(g.getFont().getFontName(),Font.PLAIN,18) );
    g.drawString(string,5,20);
    
    ((Graphics2D)g).setStroke( new BasicStroke(5.0f) );
    g.setColor(borderColor);
    g.drawLine(string.length()*9,0,string.length()*9,27);
    g.drawLine(0,0,0,27);
    g.drawLine(0,0,string.length()*9,0);
    g.drawLine(string.length()*9,28,0,28);
    g.drawLine(0,0,0,28);
  }

  public static void main(String[] args) 
  {
    XButton ed = new XButton("Hello!",Color.gray,Color.red);
    System.out.println("ciao");
    ed.addActionListener(new Action());
    XFrame fr = new XFrame();
    fr.setLayout(null);
    fr.setBounds(300,300,300,300);
    ed.setBounds(100,100,300,300);
    fr.add(ed);
    fr.setVisible(true);
  }

};
aaa
11/04/12 18:24
GrG
premetto di essere molto molto molto inesperto in ambito java.. ma guardando il codice mi viene un dubbio...

sinceramente non vedo nessun metodo che si occupa di gestire il click del pulsante qualcosa tipo OnClick.. sicuro che non manchi?
aaa
11/04/12 20:05
Bonny
è una classe astratta... non si può fare un istanza di una classe astratta...
non potresti semplicemente estendere la classe JButton ?!?!
GrG ha ragione non vedo nessun metodo che gestisce l'evento click?!
a meno che non sia scritto nella classe Action (riga 68)
aaa
12/04/12 6:22
Il Totem
Scrivi il codice dell'ActionListener.
aaa
12/04/12 10:55
ht-never
@bonny ma io non ho fatto l'istanza di una classe astratta, ma di una classe che la estende e che ne sviluppa tutti i metodi, giusto?

@It Totem non ho scritto il codice dell'ActionListener perchè non mi sembrava rilevante, il problema è eseguirlo questo listener... comunque è contenuto nel file Action.java, che è...

package glow;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class Action implements ActionListener {
	public void actionPerformed(ActionEvent e) {
		System.out.println("prova 1,2,3...");
	}	
}
aaa
12/04/12 11:55
Bonny
per curiosità prova a scrivere nel main
eb.requestFocusInWindow();
aaa
12/04/12 12:05
ht-never
Non funziona... semplicemente non vuole comportarsi come un bottone... se faccio extends JButton la situazione degenera, mentre se estendo AbstractButton non è un bottone...
aaa
12/04/12 13:54
Bonny
cosi funziona cmq il metodo paintInDeviceCoords(Graphics g) è inutile basta scrivere quel codice dentro paintComponent()


import javax.swing.*;
import java.awt.*;


public class XButton extends JButton{

    private Color color = Color.white;
    private String string = new String();
    private Dimension dim = new Dimension(30, 30);
    private Color borderColor = Color.white;
    Graphics graph;

    public XButton(String s, Color c, Color border) {
        this.color = c;
        this.string = s;
        this.borderColor = border;
        this.dim = new Dimension(64, 30);// 64 = 9 * s.lenght
        this.setPreferredSize(this.dim);
    }

    public XButton(String s) {
        this.string = s;
        //setPreferredSize(new Dimension(300, 200));
    }

    public XButton(Color c) {
        this.color = c;
        //setPreferredSize(new Dimension(300, 200));
    }

    public XButton(Dimension dim, Color c) {
        this.color = c;
        //setPreferredSize(dim);
    }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        graph = g;
        paintInDeviceCoords(g);
    }

    public void paintInDeviceCoords(Graphics g) {
        /*
         * assegna modo di riempimento sfumato
         */
        ((Graphics2D) g).setPaint(new GradientPaint(0, 0, Color.magenta,
                300, 200, Color.green));
        g.setColor(color);
        g.fillRect(0, 0, (int) dim.getWidth(), (int) dim.getHeight());
        g.setColor(Color.black);
        g.setFont(new Font(g.getFont().getFontName(), Font.PLAIN, 18));
        g.drawString(string, 5, 20);

        ((Graphics2D) g).setStroke(new BasicStroke(5.0f));
        g.setColor(borderColor);
        g.drawLine(string.length() * 9, 0, string.length() * 9, 27);
        g.drawLine(0, 0, 0, 27);
        g.drawLine(0, 0, string.length() * 9, 0);
        g.drawLine(string.length() * 9, 28, 0, 28);
        g.drawLine(0, 0, 0, 28);
    }

  
    public static void main(String[] args) {
        XButton ed = new XButton("Hello!", Color.gray, Color.red);
        //System.out.println("ciao");
        Action ac = new Action();
        ed.addActionListener(ac);
        JFrame fr = new JFrame();
        //fr.setLayout(null);
        fr.setBounds(300, 300, 300, 300);
        //ed.setBounds(100, 100, 100, 100);
        JPanel p = new JPanel();
        p.setLayout(new FlowLayout());
        p.add(ed);
        fr.getContentPane().add("Center",p);
        fr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        fr.setVisible(true);
    }

}


la classe Action lo lasciata com'era
aaa