为了操纵鼠标事件,例如悬停,您必须自己处理这些事件,其中一种方法是创建自己的按钮。
编辑
按照 Sergiy Medvynskyy 的回答,将鼠标侦听器添加到您的按钮会是一种更好的做法,因为不需要修改按钮类本身。
您可能还需要使用 LaF(UIManager 外观和感觉),因为它可能会给 UI 组件添加不想要的效果。
请注意,这会影响所有界面组件。
以下是一个基本示例。
按钮:
import java.awt.Color;
import java.awt.Font;
import java.awt.event.MouseEvent;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.border.Border;
public class UWPButton extends JButton{
private final Border regularBorder;
private final Border hoverBorder;
private final Color bgColor = new Color(204, 204, 204);
private final Color transparent;
private final Font metroFont = new Font("Segoe UI", Font.PLAIN, 20);
public UWPButton() {
super();
// thickness of the button's borders
int thickness = 4;
// Create a transparent color, to use for the regular border
// could also be the bgColor (204 204 204)
Color c = new Color(1f, 0f, 0f, 0f);
transparent = c;
// Creates a compound border to be present on the button majority of the time.
// uses an invisible line border on the outside in order to change border smoothly
// the inside border is just an empty border for insets.
regularBorder = BorderFactory.createCompoundBorder(
BorderFactory.createLineBorder(transparent, thickness), //outside
BorderFactory.createEmptyBorder(10, 14, 10, 14)); //inside
// Creates a compound border which will be used when the mouse hovers the button.
// the outside border has a darker colour than the background
// the inside border is just an empty border for insets.
hoverBorder = BorderFactory.createCompoundBorder(
BorderFactory.createLineBorder(bgColor.darker(), thickness), //outside
BorderFactory.createEmptyBorder(10, 14, 10, 14)); //inside
// configures the button
initButton();
}
// Here is where the mouse events are treated.
@Override
protected void processMouseEvent(MouseEvent e) {
// Gets the ID of the event,
// if it is a mouse entering the button, sets the new border
// if it is the mouse exiting the button, resets the border to the default.
switch(e.getID()){
case MouseEvent.MOUSE_ENTERED:
this.setBorder(hoverBorder);
break;
case MouseEvent.MOUSE_EXITED:
this.setBorder(regularBorder);
break;
}
// the parent then does all the other handling.
super.processMouseEvent(e);
}
// Configures the button.
private void initButton(){
setFont(metroFont);
setBorder(regularBorder);
setBackground(bgColor);
setFocusPainted(false);
}
}
更改 LaF:如果您通过 IDE 拖放创建框架,您的 main 中应该有类似的内容(来自 netbeans):
将“Nimbus”更改为“Metro”(或删除 LaF 设置),这样界面管理器就不会渲染所有 Nimbus 内容。
注意:没有“Metro”LaF,这只是为了禁用应用的LaF。
// other stuff above
//
// change "Nimbus" for something else or just remove this try-catch block
try {
for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
if ("Nimbus".equals(info.getName())) {
javax.swing.UIManager.setLookAndFeel(info.getClassName());
break;
}
}
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | javax.swing.UnsupportedLookAndFeelException ex) {
java.util.logging.Logger.getLogger(NewJFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
}
// other stuff bellow
有关 LaF(外观和感觉)的更多信息:
https://docs.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html