Aquí podría ser tu PUBLICIDAD


Creando un JButton personalizado en Java

votos
86

¿Hay alguna manera de crear un JButtongráfico con su propio botón y no solo con una imagen dentro del botón?

Si no, ¿hay alguna otra manera de crear una costumbre JButtonen Java?

Publicado el 05/08/2008 a las 13:15
fuente por usuario Anton
En otros idiomas...        العربية       

5 respuestas

votos
85

Cuando estaba aprendiendo Java por primera vez tuvimos que hacer Yahtzee y pensé que sería genial crear componentes y contenedores Swing personalizados en lugar de simplemente dibujar todo en uno JPanel. El beneficio de extender Swingcomponentes, por supuesto, es tener la capacidad de agregar soporte para atajos de teclado y otras funciones de accesibilidad que no se pueden hacer simplemente haciendo que un paint()método imprima una imagen bonita. Sin embargo, puede que no se haga de la mejor manera, pero puede ser un buen punto de partida para usted.

Editar 8/6 - Si no fue aparente por las imágenes, cada Dado es un botón en el que puede hacer clic. Esto lo moverá al DiceContainersiguiente. Al observar el código fuente, puede ver que cada botón Die se dibuja dinámicamente, en función de su valor.

texto alternativo
texto alternativo
texto alternativo

Aquí están los pasos básicos:

  1. Crea una clase que se extienda JComponent
  2. Llamar al constructor padre super()en sus constructores
  3. Asegúrate de que la clase implemente MouseListener
  4. Pon esto en el constructor:

    enableInputMethods(true);   
    addMouseListener(this);
    
  5. Anular estos métodos:

    public Dimension getPreferredSize()  
    public Dimension getMinimumSize()  
    public Dimension getMaximumSize()
    
  6. Anula este método:

    public void paintComponent(Graphics g)
    

La cantidad de espacio con el que debe trabajar cuando dibuja su botón se define getPreferredSize()asumiendo getMinimumSize()y getMaximumSize()devolviendo el mismo valor. No he experimentado demasiado con esto pero, dependiendo del diseño que use para su GUI, su botón podría verse completamente diferente.

Y finalmente, el código fuente . En caso de que me haya perdido algo.

Respondida el 05/08/2008 a las 02:03
fuente por usuario Kevin


Aquí podría ser tu PUBLICIDAD


votos
32

Sí, esto es posible Una de las principales ventajas de usar Swing es la facilidad con la que se pueden crear y manipular los controles abstractos.

Aquí hay una manera rápida y sucia de extender la clase JButton existente para dibujar un círculo a la derecha del texto.

package test;

import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Graphics;

import javax.swing.JButton;
import javax.swing.JFrame;

public class MyButton extends JButton {

    private static final long serialVersionUID = 1L;

    private Color circleColor = Color.BLACK;

    public MyButton(String label) {
        super(label);
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);

        Dimension originalSize = super.getPreferredSize();
        int gap = (int) (originalSize.height * 0.2);
        int x = originalSize.width + gap;
        int y = gap;
        int diameter = originalSize.height - (gap * 2);

        g.setColor(circleColor);
        g.fillOval(x, y, diameter, diameter);
    }

    @Override
    public Dimension getPreferredSize() {
        Dimension size = super.getPreferredSize();
        size.width += size.height;
        return size;
    }

    /*Test the button*/
    public static void main(String[] args) {
        MyButton button = new MyButton("Hello, World!");

        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(400, 400);

        Container contentPane = frame.getContentPane();
        contentPane.setLayout(new FlowLayout());
        contentPane.add(button);

        frame.setVisible(true);
    }

}

Tenga en cuenta que anulando paintComponent puede cambiar el contenido del botón, pero que el borde está pintado por el método paintBorder . El método getPreferredSize también necesita ser administrado para respaldar dinámicamente los cambios en el contenido. Se debe tener cuidado al medir las métricas de fuentes y las dimensiones de la imagen.

Para crear un control en el que pueda confiar, el código anterior no es el enfoque correcto. Las dimensiones y los colores son dinámicos en Swing y dependen de la apariencia que se use. Incluso el aspecto de metal predeterminado ha cambiado en las versiones de JRE. Sería mejor implementar AbstractButton y cumplir con las pautas establecidas por Swing API. Un buen punto de partida es observar las clases javax.swing.LookAndFeel y javax.swing.UIManager .

http://docs.oracle.com/javase/8/docs/api/javax/swing/LookAndFeel.html

http://docs.oracle.com/javase/8/docs/api/javax/swing/UIManager.html

Comprender la anatomía de LookAndFeel es útil para escribir controles: crear una apariencia personalizada

Respondida el 05/08/2008 a las 01:53
fuente por usuario McDowell

votos
12

Siempre puedes probar el aspecto y tacto Synth. Proporciona un archivo xml que actúa como una especie de hoja de estilo, junto con las imágenes que desea usar. El código podría verse así:

try {
    SynthLookAndFeel synth = new SynthLookAndFeel();
    Class aClass = MainFrame.class;
    InputStream stream = aClass.getResourceAsStream("\\default.xml");

    if (stream == null) {
        System.err.println("Missing configuration file");
        System.exit(-1);                
    }

    synth.load(stream, aClass);

    UIManager.setLookAndFeel(synth);
} catch (ParseException pe) {
    System.err.println("Bad configuration file");
    pe.printStackTrace();
    System.exit(-2);
} catch (UnsupportedLookAndFeelException ulfe) {
    System.err.println("Old JRE in use. Get a new one");
    System.exit(-3);
}

A partir de ahí, continúe y agregue su JButton como lo haría normalmente. El único cambio es que usa el método setName (cadena) para identificar a qué se debe asignar el botón en el archivo xml.

El archivo xml podría verse así:

<synth>
    <style id="button">
        <font name="DIALOG" size="12" style="BOLD"/>
        <state value="MOUSE_OVER">
            <imagePainter method="buttonBackground" path="dirt.png" sourceInsets="2 2 2 2"/>
            <insets top="2" botton="2" right="2" left="2"/>
        </state>
        <state value="ENABLED">
            <imagePainter method="buttonBackground" path="dirt.png" sourceInsets="2 2 2 2"/>
            <insets top="2" botton="2" right="2" left="2"/>
        </state>
    </style>
    <bind style="button" type="name" key="dirt"/>
</synth>

El elemento de enlace allí especifica a qué asignar (en este ejemplo, aplicará ese estilo a cualquier botón cuya propiedad de nombre se haya establecido en "suciedad").

Y un par de enlaces útiles:

http://javadesktop.org/articles/synth/

http://docs.oracle.com/javase/tutorial/uiswing/lookandfeel/synth.html

Respondida el 05/08/2008 a las 01:47
fuente por usuario rjohnston

votos
8

Probablemente esté yendo un millón de millas en el camino equivocado (pero solo soy joven: P). pero no podría agregar el gráfico a un panel y luego un monitor de pantalla táctil al objeto gráfico para que cuando el usuario en el gráfico se realice su acción.

Respondida el 20/08/2008 a las 04:48
fuente por usuario AngelOfCake

votos
6

No he hecho el desarrollo de SWING desde mis primeras clases de CS, pero si no estuviera incorporado, podrías heredar javax.swing.AbstractButton y crear el tuyo propio. Debería ser bastante simple conectar algo junto con su marco existente.

Respondida el 05/08/2008 a las 01:30
fuente por usuario John Downey