java - para - manual de programacion android pdf
Crear un JButton personalizado en Java (5)
Cuando aprendí Java por primera vez, tuvimos que hacer Yahtzee y pensé que sería genial crear componentes y contenedores Swing personalizados en lugar de dibujar todo en un JPanel
. El beneficio de extender los componentes de Swing
, por supuesto, es tener la capacidad de agregar soporte para atajos de teclado y otras características de accesibilidad que no puede hacer simplemente haciendo que un método paint()
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 era evidente a partir de las imágenes, cada dado es un botón en el que puede hacer clic. Esto lo moverá al DiceContainer
continuación. Mirando el código fuente, puede ver que cada botón Die se dibuja dinámicamente, en función de su valor.
Aquí están los pasos básicos:
- Cree una clase que extienda
JComponent
- Llame al constructor padre
super()
en sus constructores - Asegúrese de que su clase implemente
MouseListener
Pon esto en el constructor:
enableInputMethods(true); addMouseListener(this);
Anular estos métodos:
public Dimension getPreferredSize() public Dimension getMinimumSize() public Dimension getMaximumSize()
Anular este método:
public void paintComponent(Graphics g)
getPreferredSize()
define la cantidad de espacio con el que tiene que trabajar cuando dibuja el botón, suponiendo que getMinimumSize()
y getMaximumSize()
devuelven 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.
¿Hay alguna manera de crear un JButton
con su propio gráfico de botón y no solo con una imagen dentro del botón?
Si no, ¿hay otra forma de crear un JButton
personalizado en Java?
No he realizado el desarrollo de SWING desde mis primeras clases de CS, pero si no estuviera integrado, podría heredar javax.swing.AbstractButton
y crear el suyo propio. Debería ser bastante simple conectar algo junto con su marco existente.
Probablemente voy un millón de millas en el directo equivocado (pero solo soy joven: P). pero no podría agregar el gráfico a un panel y luego una escucha de mouse al objeto gráfico para que cuando el usuario en el gráfico realice su acción.
Si, esto es posible. Una de las principales ventajas para 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 al anular paintComponent, el contenido del botón se puede cambiar, pero que el borde se pinta con el método paintBorder . El método getPreferredSize también debe administrarse para admitir dinámicamente los cambios en el contenido. Se debe tener cuidado al medir las métricas de fuente 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 del aspecto utilizado. Incluso el aspecto Metal predeterminado ha cambiado en las versiones de JRE. Sería mejor implementar AbstractButton y cumplir con las pautas establecidas por la API Swing. Un buen punto de partida es mirar 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 y sensación personalizadas
Siempre puedes probar el estilo Synth. Proporciona un archivo xml que actúa como una especie de hoja de estilo, junto con las imágenes que desea utilizar. 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 "dirt").
Y un par de enlaces útiles:
http://javadesktop.org/articles/synth/
http://docs.oracle.com/javase/tutorial/uiswing/lookandfeel/synth.html