franksisca
12-04-2012, 16:02
Prendendo spunto da questa discussione (http://www.hwupgrade.it/forum/showthread.php?t=2462037) mi sono messo a creare il mio jbutton personalizzato.
sono arrivato ad un risultato non ancora accettabile, ma almeno sto vedendo i primi risultati:
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package core;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import javax.swing.AbstractButton;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.border.Border;
import javax.swing.plaf.ComponentUI;
import javax.swing.plaf.basic.BasicButtonUI;
public class JButtonFederimprese extends BasicButtonUI implements java.io.Serializable,
MouseListener, KeyListener {
private final static JButtonFederimprese m_buttonUI = new JButtonFederimprese();
protected Border m_borderRaised = UIManager.getBorder("Button.border");
protected Border m_borderLowered = UIManager.getBorder("Button.borderPressed");
protected Color m_backgroundNormal = UIManager.getColor("Button.background");
protected Color m_backgroundPressed = UIManager.getColor("Button.pressedBackground");
protected Color m_foregroundNormal = UIManager.getColor("Button.foreground");
protected Color m_foregroundActive = UIManager.getColor("Button.activeForeground");
protected Color m_focusBorder = UIManager.getColor("Button.focusBorder");
public static ComponentUI createUI(JComponent c) {
return m_buttonUI;
}
public void installUI(JComponent c) {
super.installUI(c);
c.addMouseListener(this);
c.addKeyListener(this);
}
public void uninstallUI(JComponent c) {
super.uninstallUI(c);
c.removeMouseListener(this);
c.removeKeyListener(this);
}
public void paint(Graphics g, JComponent c) {
AbstractButton b = (AbstractButton) c;
Dimension d = b.getSize();
FontMetrics fm = g.getFontMetrics();
String caption = b.getText();
int x = (d.width - fm.stringWidth(caption)) / 2;
int y = (d.height + fm.getAscent()) / 2;
b.setBorderPainted(false);
b.setForeground(new Color(0,0,131));
g.setFont(new Font("Colibri", Font.BOLD, 12));
g.setColor(new Color(72, 164, 227));
g.fillRoundRect(0, 0, d.width, d.height-1, 20, 20);
g.setColor(b.getForeground());
g.drawString(caption, x, y);
}
public Dimension getPreferredSize(JComponent c) {
Dimension d = super.getPreferredSize(c);
if (m_borderRaised != null) {
Insets ins = m_borderRaised.getBorderInsets(c);
d.setSize(d.width + ins.left + ins.right, d.height + ins.top
+ ins.bottom);
}
return d;
}
public void mouseClicked(MouseEvent e) {
}
public void mousePressed(MouseEvent e) {
JComponent c = (JComponent) e.getComponent();
c.setBorder(m_borderLowered);
c.setBackground(m_backgroundPressed);
}
public void mouseReleased(MouseEvent e) {
JComponent c = (JComponent) e.getComponent();
c.setBorder(m_borderRaised);
c.setBackground(m_backgroundNormal);
}
public void mouseEntered(MouseEvent e) {
JComponent c = (JComponent) e.getComponent();
c.setForeground(m_foregroundActive);
c.repaint();
}
public void mouseExited(MouseEvent e) {
JComponent c = (JComponent) e.getComponent();
c.setForeground(m_foregroundNormal);
c.repaint();
}
public void keyTyped(KeyEvent e) {
}
public void keyPressed(KeyEvent e) {
int code = e.getKeyCode();
if (code == KeyEvent.VK_ENTER || code == KeyEvent.VK_SPACE) {
JComponent c = (JComponent) e.getComponent();
c.setBorder(m_borderLowered);
c.setBackground(m_backgroundPressed);
}
}
public void keyReleased(KeyEvent e) {
int code = e.getKeyCode();
if (code == KeyEvent.VK_ENTER || code == KeyEvent.VK_SPACE) {
JComponent c = (JComponent) e.getComponent();
c.setBorder(m_borderRaised);
c.setBackground(m_backgroundNormal);
}
}
}
il risultato lo vedete in allegato.
Ora vorrei che mi deste una mano per quanto riguarda le seguenti problematiche (magari banali ma non ci arrivo al momento):
Inserire una icona, cambiere il foreground tra lo stato di "enable" e magari anche cambiare i colori alla pressione del pulsante. dove devo interagire? ovviamente io ho modificato solo il paint, il resto del codice l'ho copiato dal tutoria sun, ma non c'erano riferimenti alle mie questioni (oppure sono totalmente rincoglionito da essermeli persi).
anche "relink" vanno bene
sono arrivato ad un risultato non ancora accettabile, ma almeno sto vedendo i primi risultati:
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package core;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import javax.swing.AbstractButton;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.border.Border;
import javax.swing.plaf.ComponentUI;
import javax.swing.plaf.basic.BasicButtonUI;
public class JButtonFederimprese extends BasicButtonUI implements java.io.Serializable,
MouseListener, KeyListener {
private final static JButtonFederimprese m_buttonUI = new JButtonFederimprese();
protected Border m_borderRaised = UIManager.getBorder("Button.border");
protected Border m_borderLowered = UIManager.getBorder("Button.borderPressed");
protected Color m_backgroundNormal = UIManager.getColor("Button.background");
protected Color m_backgroundPressed = UIManager.getColor("Button.pressedBackground");
protected Color m_foregroundNormal = UIManager.getColor("Button.foreground");
protected Color m_foregroundActive = UIManager.getColor("Button.activeForeground");
protected Color m_focusBorder = UIManager.getColor("Button.focusBorder");
public static ComponentUI createUI(JComponent c) {
return m_buttonUI;
}
public void installUI(JComponent c) {
super.installUI(c);
c.addMouseListener(this);
c.addKeyListener(this);
}
public void uninstallUI(JComponent c) {
super.uninstallUI(c);
c.removeMouseListener(this);
c.removeKeyListener(this);
}
public void paint(Graphics g, JComponent c) {
AbstractButton b = (AbstractButton) c;
Dimension d = b.getSize();
FontMetrics fm = g.getFontMetrics();
String caption = b.getText();
int x = (d.width - fm.stringWidth(caption)) / 2;
int y = (d.height + fm.getAscent()) / 2;
b.setBorderPainted(false);
b.setForeground(new Color(0,0,131));
g.setFont(new Font("Colibri", Font.BOLD, 12));
g.setColor(new Color(72, 164, 227));
g.fillRoundRect(0, 0, d.width, d.height-1, 20, 20);
g.setColor(b.getForeground());
g.drawString(caption, x, y);
}
public Dimension getPreferredSize(JComponent c) {
Dimension d = super.getPreferredSize(c);
if (m_borderRaised != null) {
Insets ins = m_borderRaised.getBorderInsets(c);
d.setSize(d.width + ins.left + ins.right, d.height + ins.top
+ ins.bottom);
}
return d;
}
public void mouseClicked(MouseEvent e) {
}
public void mousePressed(MouseEvent e) {
JComponent c = (JComponent) e.getComponent();
c.setBorder(m_borderLowered);
c.setBackground(m_backgroundPressed);
}
public void mouseReleased(MouseEvent e) {
JComponent c = (JComponent) e.getComponent();
c.setBorder(m_borderRaised);
c.setBackground(m_backgroundNormal);
}
public void mouseEntered(MouseEvent e) {
JComponent c = (JComponent) e.getComponent();
c.setForeground(m_foregroundActive);
c.repaint();
}
public void mouseExited(MouseEvent e) {
JComponent c = (JComponent) e.getComponent();
c.setForeground(m_foregroundNormal);
c.repaint();
}
public void keyTyped(KeyEvent e) {
}
public void keyPressed(KeyEvent e) {
int code = e.getKeyCode();
if (code == KeyEvent.VK_ENTER || code == KeyEvent.VK_SPACE) {
JComponent c = (JComponent) e.getComponent();
c.setBorder(m_borderLowered);
c.setBackground(m_backgroundPressed);
}
}
public void keyReleased(KeyEvent e) {
int code = e.getKeyCode();
if (code == KeyEvent.VK_ENTER || code == KeyEvent.VK_SPACE) {
JComponent c = (JComponent) e.getComponent();
c.setBorder(m_borderRaised);
c.setBackground(m_backgroundNormal);
}
}
}
il risultato lo vedete in allegato.
Ora vorrei che mi deste una mano per quanto riguarda le seguenti problematiche (magari banali ma non ci arrivo al momento):
Inserire una icona, cambiere il foreground tra lo stato di "enable" e magari anche cambiare i colori alla pressione del pulsante. dove devo interagire? ovviamente io ho modificato solo il paint, il resto del codice l'ho copiato dal tutoria sun, ma non c'erano riferimenti alle mie questioni (oppure sono totalmente rincoglionito da essermeli persi).
anche "relink" vanno bene