Foros del Web » Programación para mayores de 30 ;) » Java »

Jbutton propio

Estas en el tema de Jbutton propio en el foro de Java en Foros del Web. Gente, necesito su ayuda. Necesito crear un boton propio, con un dibujo adentro. El boton tiene que tener 3 estados. Tiene que iniciarse como un ...
  #1 (permalink)  
Antiguo 02/09/2015, 09:42
 
Fecha de Ingreso: agosto-2015
Mensajes: 24
Antigüedad: 7 años, 5 meses
Puntos: 0
Jbutton propio

Gente, necesito su ayuda.
Necesito crear un boton propio, con un dibujo adentro.
El boton tiene que tener 3 estados.
Tiene que iniciarse como un boton cuadrado gris, luego si hago click dibujarse una flecha <- adentro .

La cosa es que voy a tener un jtextfield y a la derecha el boton mio creado. Al hacer click me ponga el <- y el cursor para escribir se va a posicionar sobre el jtextfield. Al ingresar lo que necesito en el jtextfield y luego de hacer unas verificaciones, si esta ok, en el boton se tiene que dibujar un check ( ✓ ).

Por el momento, hice una clase que extiende de JButton el cual en paintComponent me llama a cualquiera de los 2 metodos ( drawArrow 0 drawOk ).

Dejo el código para que vean lo que hice.

Código:
public class JIconButton extends JButton implements ActionListener{
	
    private boolean mouseInside;
    private Color btnColor;
    private Color symbolCol;
    private final int ARR_SIZE = 20;
    Graphics g;
    
    public JIconButton(Color col, Color symbolLbk)
    {
        super();
    	this.btnColor = col;
    	this.symbolCol = symbolLbk;
        setBorder(new LineBorder(Color.LIGHT_GRAY, 0, true));
        setContentAreaFilled(false);
        setFocusPainted(false);
        setVisible(true);
    }

    @Override
    protected void paintComponent(Graphics g) {
       Graphics2D g2 = (Graphics2D) g.create();
       g2.setPaint(new GradientPaint(new Point(0, 0), btnColor, new Point(0,getHeight()), btnColor));
       g2.fillRoundRect(0, 0, getWidth(), getHeight(), 10, 10);
       g2.setPaint(Color.BLACK);

      //drawArrow(g, 50, 30, 10, 30);
       //drawOk(g, 60, 30, 10, 30); (ACA ES DONDE ME DIBUJA UN BOTON CON FLECHA O OK

       g2.dispose();
       // super.paintComponent(g);
    }
    
    void drawArrow(Graphics g1, int x1, int y1, int x2, int y2) {
        Graphics2D g = (Graphics2D) g1.create();

        double dx = x2 - x1;
        double dy = y2 - y1;
        double angle = Math.atan2(dy, dx);
        int len = (int) Math.sqrt(dx*dx + dy*dy);
        AffineTransform at = AffineTransform.getTranslateInstance(x1, y1);
        at.concatenate(AffineTransform.getRotateInstance(angle));
        g.transform(at);
        g.setColor(symbolCol);
        // Draw horizontal arrow starting in (0, 0)
        g.setStroke(new BasicStroke(6));
        g.draw(new Line2D.Float(0, 0, len-ARR_SIZE, 0));
        //g.drawLine(0, 0, len, 0);
        g.fillPolygon(new int[] {len, len-ARR_SIZE, len-ARR_SIZE, len},
                      new int[] {0, -ARR_SIZE, ARR_SIZE, 0}, 4);

    }

  void drawOk(Graphics g1, int x1, int y1, int x2, int y2) {
        Graphics2D g = (Graphics2D) g1.create();
       
        g.setColor(symbolCol);
        // Draw horizontal arrow starting in (0, 0)
        g.setStroke(new BasicStroke(6));
        g.draw(new Line2D.Float(10,40,20,50));
        g.draw(new Line2D.Float(50,10,20,50));
        //g.drawLine(0, 0, len, 0);
    }
Esa clase me dibuja lo siguiente
( https://www.dropbox.com/s/pf3o0u275kfk3tu/btnflecha.jpg?dl=0 )


o el ok
( https://www.dropbox.com/s/pp7a8cuo3eutc4g/botonok.jpg?dl=0 )


Bueno, lo que necesito yo, es hacer la prueba, desde un main común.
main....
JFrame jf = new JFrame();
JPanel jp = new JPanel();
Color botonLbk;
botonLbk = new Color(119,136,153);
Color symbolLbk;
symbolLbk= new Color(16,220,36);
JIconButton jb;
jb = new JIconButton(botonLbk,symbolLbk);
jp.add(jb);

jf.add(jp);
jf.setSize(new Dimension(150,150));
jf.setVisible(true);


Bueno, ahí tendria mi boton creado, ¿como hago yo para cuando hago click sobre el mismo me cambie el estado al boton??? osea, que me ponga la flecha o el ok???

Gracias.
  #2 (permalink)  
Antiguo 02/09/2015, 13:35
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 18 años, 4 meses
Puntos: 454
Respuesta: Jbutton propio

Hola:

El JButton tiene métodos para fijar qué iconos quieres según esté pulsado o no. No sé si te vale puesto que quieres tres estados y el botón sólo tiene dos (apretado y desapretado) ¿seguro que quieres heredar de un JButton?. Echales un ojo a esos métodos a ver si puedes apañarlo por ahí o encontrar alguna alternativa a los tres estados que te valga.

Si no es así, sobre el código que tiene, en el constructor de tu clase JIconButton, añade esto

super.addActionListener(this);

y en el método actionPerformed() que debes implementar (aunque no lo has puesto), gestiona los cambios de estado cada vez que se haga click y guarda el estado en un atributo de la clase. El método paint() deberá llamar, en función del estado, a uno de los métodos draw que tienes.

Se bueno.
__________________
Apuntes Java
Wiki de Programación
  #3 (permalink)  
Antiguo 02/09/2015, 14:42
(Desactivado)
 
Fecha de Ingreso: marzo-2012
Mensajes: 366
Antigüedad: 10 años, 10 meses
Puntos: 31
Respuesta: Jbutton propio

Tienes un JButton y una serie de eventos que según sucedan quieres que tu botón cambie.

Pues lo que tienes que hacer es capturar esos eventos, y cuando se cumplan pues le cambias el estado al JButton.

El evento más fácil es el de hacer click en el botón. Pero veo que según rellenas texto en tu JTextField, según el texto introducido puede saltar otro evento. Pues entonces eso puede, o no puede suceder cada vez que el texto del JTextField cambia. Y eso es otro evento. Y así con el resto de eventos que quieras.
  #4 (permalink)  
Antiguo 03/09/2015, 12:24
 
Fecha de Ingreso: agosto-2015
Mensajes: 24
Antigüedad: 7 años, 5 meses
Puntos: 0
Respuesta: Jbutton propio

Es que la idea es tener el boton en gris por defecto, y al hacer click sobre el mismo que se dibuje el ( ✓ )
(el método de drawArrow era el que me lo dibujaba), pero no lo logro hacer andar.
Tengo mi método @Override
public void actionPerformed(ActionEvent arg0) {

pero no se como manejarlo para que me dibuje el ok o lo saque...
  #5 (permalink)  
Antiguo 04/09/2015, 06:01
(Desactivado)
 
Fecha de Ingreso: marzo-2012
Mensajes: 366
Antigüedad: 10 años, 10 meses
Puntos: 31
Respuesta: Jbutton propio

creo que los jframe tienen un método llamado repaint o algo así... para volver a pintar su contenido.

Es algo así como cuando actualizas una página web. Pero para un programa.

En el evento click del botón le cambias el texto y le pones el ( ✓ ) y después haces el repaint del jframe.

Aunque a lo mejor, en vez de repintar todo el jframe se me ocurre que podrías poner la propiedad visible del botón a false y luego otra vez a true después de ponerle el ( ✓ ) . A lo mejor así no te hace falta repintar todo el jframe... pero si así no te funciona, repinta el jframe y te quitas de problems.

Etiquetas: clase, jbutton, jframe, propio
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 18:52.