Java swing JComponent “tamaño”

Estoy haciendo un proyecto donde necesito algunos componentes de swing personalizados. Hasta ahora he creado un nuevo botón con una serie de imágenes (el aspecto de Java Metal no encaja con mi UI en absoluto). He implementado MouseListener en este nuevo componente y aquí es donde surge mi problema. Mi widget cambia la imagen al desplazarse, haga clic en etc, excepto que MouseListener selecciona la entrada del mouse en todo el contenedor de GridLayout lugar de en la imagen. Así que tengo una imagen de aproximadamente 200 * 100 y el contenedor circundante es de aproximadamente 400 * 200 y el método mouseEntered se mouseEntered cuando ingresa a la sección GridLayout (incluso partes del espacio en blanco) en lugar de sobre la imagen. ¿Cómo puedo hacerlo para que solo se dispare cuando sobrevivo la imagen? He intentado establecer el tamaño y los límites y otros atributos en vano.

EDITAR: Aquí hay una demostración de mi problema. Como puede ver (más o menos, los colores son muy similares), el botón inferior derecho se resalta simplemente ingresando su sección de GridlLayout . Solo quiero que se resalte cuando estoy sobre la imagen real, no en la sección GridLayout .

texto alternativo

No MouseListener métodos MouseListener porque solo implican cambiar la imagen mostrada.

 public customWidget() { this.setLayout(new FlowLayout()); try { imageDef=ImageIO.read(new File("/home/x101/Desktop/buttonDef.png")); imageClick=ImageIO.read(new File("/home/x101/Desktop/buttonClick.png")); imageHover=ImageIO.read(new File("/home/x101/Desktop/buttonHover.png")); current=imageDef; } catch (IOException e) { e.printStackTrace(); } this.addMouseListener(this); } protected void paintComponent(Graphics g) { super.paintComponents(g); g.drawImage(current, 0, 0, current.getWidth(), current.getHeight(), null); } 

EDITAR: sección de código agregado

Supongo que su imagen contiene SOLO 4 objetos ‘widget personalizado’ (en una cuadrícula de 2×2).

Tu código está funcionando como yo esperaba. Sus métodos MouseListener responden a MouseEvents para ‘customWidget’ (no la imagen dibujada en ‘customWidget’), que está dimensionada para ocupar 1/4 de la imagen, por lo que responderán cuando entre en el área ampliada. El error está realmente en su progtwig de prueba, porque está permitiendo que el widget de botón personalizado sea más grande que la imagen.

Si desea un progtwig de prueba que proporcione una imagen similar a la suya, debe crear una cuadrícula más grande (digamos 4×4), y luego solo colocar sus botones en cada otro nodo de la grilla. Coloque un componente vacío en los espacios.

Como alternativa, considere la API The Button , que incluye el método setRolloverIcon() “para hacer que el botón muestre el icono especificado cuando el cursor pasa sobre él”.

Adición: por ejemplo ,

 import java.net.MalformedURLException; import java.net.URL; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.SwingUtilities; public class ButtonIconTest { public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { public void run() { createAndShowGui(); } }); } private static void createAndShowGui() { String base = "http://download.oracle.com/" + "javase/tutorial/uiswing/examples/components/" + "RadioButtonDemoProject/src/components/images/"; ImageIcon dog = null; ImageIcon pig = null; try { dog = new ImageIcon(new URL(base + "Dog.gif")); pig = new ImageIcon(new URL(base + "Pig.gif")); } catch (MalformedURLException ex) { ex.printStackTrace(System.err); return; } JFrame frame = new JFrame("Rollover Test"); JPanel panel = new JPanel(); panel.add(new JLabel(dog)); panel.add(new JLabel(pig)); JButton button = new JButton(dog); button.setRolloverIcon(pig); panel.add(button); frame.add(panel); frame.pack(); frame.setLocationRelativeTo(null); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); } } 

Aunque no responderé a su pregunta en particular, espero que esto ayude:

Si los componentes se ven mal, quizás deba reutilizar los componentes de Swing y simplemente escribir un Look & Feel o tema personalizado.

Sin duda ayudaría a asegurar que el aspecto de la aplicación sea consistente y al menos esté utilizando la herramienta adecuada para la tarea que desea lograr.

Como nota al margen, tenga en cuenta que Java viene con múltiples Look & feel, incluyendo Look & Feels hecho para imitar el tema del sistema operativo nativo.

Ver: http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html