Java JButton';s图标在悬停时变为像素化

Java JButton';s图标在悬停时变为像素化,java,swing,jbutton,imageicon,Java,Swing,Jbutton,Imageicon,我正在制作一个JavaSwing应用程序,遇到了一个问题。我想做一个有图标的按钮。 要创建它,我首先创建一个重新缩放的图像图标: studentIcon=新图像图标(新图像图标( “D:\\Programming\\Java\\ELearningDesktop\\src\\com\\core\\student.png”) .getImage().getScaleInstance(64,64,Image.SCALE_平滑)); 然后我制作一个按钮,并在上面设置图标: JButton studen

我正在制作一个JavaSwing应用程序,遇到了一个问题。我想做一个有图标的按钮。 要创建它,我首先创建一个重新缩放的图像图标:

studentIcon=新图像图标(新图像图标(
“D:\\Programming\\Java\\ELearningDesktop\\src\\com\\core\\student.png”)
.getImage().getScaleInstance(64,64,Image.SCALE_平滑));
然后我制作一个按钮,并在上面设置图标:

JButton studentButton=newjbutton();
studentButton.setIcon(studentIcon);
studentButton.setFocusable(假);
它工作正常,但由于某种原因,每次我将鼠标悬停在按钮上时,按钮上的图标都会变为像素。在悬停之后,它永远不会变得平滑,除非我重新缩放JFrame,这样它可能会在某个地方调用
repaint()
,然后重新绘制它

我使用下载的外观,但如果使用默认的外观,问题仍然存在。以同样的方式使用ImageIcon,但不重新缩放也无济于事-仍会出现像素化。 解决办法是什么

计划的起点

公共类初学者{
公共静态void main(字符串[]args){
FlatLightLaf.install();
EventQueue.invokeLater(()->{
AuthFrame=新的AuthFrame();
frame.setVisible(true);
});
}
}
AuthFrame

公共类AuthFrame扩展了JFrame{
私人JPanel主面板;
私人登录面板登录面板;
私人影像图标研究;
私人图像图标教师图标;
公共框架(){
setLayout(新的GridBagLayout());
ImageIcon ImageIcon=新图像图标(新图像图标(
“D:\\Programming\\Java\\ELearningDesktop\\src\\com\\core\\tileBackground.jpg”)
.getImage().getScaledInstance(321333,Image.SCALE_SMOOTH));
mainPanel=新的BackgroundPanel(imageIcon.getImage(),BackgroundPanel.TILED,
0f,0.5f);
添加(主面板,新的GBC(0,0).setFill(两个).setWeights(1,1));
setLayout(新的GridBagLayout());
studentIcon=新图像图标(新图像图标(
“D:\\Programming\\Java\\ELearningDesktop\\src\\com\\core\\student.png”)
.getImage().getScaleInstance(64,64,Image.SCALE_平滑));
教师图标=新图像图标(新图像图标(
“D:\\Programming\\Java\\ELearningDesktop\\src\\com\\core\\teacher.png”)
.getImage().getScaleInstance(64,64,Image.SCALE_平滑));
loginPanel=新loginPanel();
主面板。添加(登录面板);
setDefaultCloseOperation(关闭时退出);
设置尺寸(框宽、框高);
setExtendedState(Frame.MAXIMIZED_两者);
}
LoginPanel—在AuthFrame中使用的私有内部类

私有类LoginPanel扩展了JPanel{
私有JTextField usernameField;
私有JPasswordField密码字段;
私人JLabel错误标签;
私人JButton学生按钮;
私人JButton教师按钮;
私人JLabel titleLabel;
学生专用布尔值=true;
公共登录面板(){
setLayout(新的GridBagLayout());
挫折背景(新颜色(255、255、255、181));
studentButton=newjbutton();
studentButton.setIcon(studentIcon);
studentButton.setFocusable(假);
//添加(studentButton,新GBC(0,0).setAnchor(GBC.WEST).setInsets(10));
教师按钮=新的JButton(教师图标);
teacherButton.setFocusable(假);
添加(teacherButton,新的GBC(0,0).setAnchor(GBC.WEST).setInsets(10));
titleLabel=新的JLabel(“以学生身份登录”);
Utils.deriveFontForTo(标题标签,24f);
添加(标题标签,新GBC(1,0).setAnchor(GBC.EAST).setInsets(10));
标题标签设置垂直对齐(标签底部);
JLabel usernamelab=新的JLabel(“用户名”);
Utils.deriveFontForTo(用户名标签,24f);
添加(usernamelab,新的GBC(0,1).setAnchor(GBC.WEST).setInsets(10));
usernamelab.setHorizontalAlignment(左);
JLabel passwordLabel=新的JLabel(“密码”);
Utils.deriveFontForTo(密码标签,24f);
添加(密码标签,新的GBC(0,2).setAnchor(GBC.WEST).setInsets(10));
usernameField=newjtextfield(15);
Utils.deriveFontForTo(usernameField,24f);
添加(usernameField,新的GBC(1,1).setInsets(10));
passwordField=新的JPasswordField(15);
Utils.deriveFontForTo(密码字段,24f);
添加(密码字段,新GBC(1,2).setInsets(10));
errorLabel=新的JLabel();
Utils.deriveFontForTo(错误标签,16f);
errorLabel.setForeground(颜色:红色);
添加(错误标签,新GBC(1,3).setAnchor(GBC.WEST).setInsets(2));
errorLabel.setHorizontalAlignment(左);
JButton loginButton=新JButton(“登录”);
loginButton.setFocusable(false);
Utils.deriveFontForTo(登录按钮,24f);
添加(登录按钮,新GBC(1,4,1,1)
.setFill(GridBagConstraints.HORIZONTAL).setInsets(10));
JButton registerButton=新JButton(“注册”);
loginButton.setFocusable(false);
Utils.deriveFontForTo(注册按钮,24f);
添加(注册表按钮,新GBC(1,5,1,1)
.插图(10);
}
}
GBC-使用GridBagLayout的covenience类

package com.core.helpers.graphics;
导入java.awt.*;
公共类GBC扩展了GridBagConstraints{
公共GBC(int gridX,int gridY){
super.gridx=gridx;
super.gridy=gridy;
}
公共GBC(int-gridX、int-gridY、int-gridWidth、int-gridHeight){
super.gridx=gridx;
super.gridy=gridy;
super.gridwidth=网格宽度;
super.gridheight=gr
setBackground(new Color(255, 255, 255, 181));
JPanel panel = new JPanel()
{
    protected void paintComponent(Graphics g)
    {
        g.setColor( getBackground() );
        g.fillRect(0, 0, getWidth(), getHeight());
        super.paintComponent(g);
    }
};
panel.setOpaque(false); // background of parent will be painted first
panel.setBackground( new Color(255, 0, 0, 20) );
frame.add(panel);