我正在为练习编写一个Java GUI库,我想创建一个带有按钮的密码字段来切换该输入是可见/不可见的。功能就在那里,但在视觉上存在一些问题。
我有一个512x512图标(我能找到的最大尺寸)保存在与src /文件夹相同的目录级别的res /文件夹中。 (我使用IntelliJ作为我的IDE)。我已经获得了显示图标的时间,它比JTextField更大,并且与视图中所有其他组件的大小相混淆。
我的问题是如何让图标以正确的大小呈现,尽管图标文件有点高分辨率。
package com.carvethsolutions.guilib.fields;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class ToggleHiddenTextField extends JPanel {
private JButton toggle;
private HiddenTextField htf;
private boolean hidden;
public ToggleHiddenTextField() {
htf = new HiddenTextField();
htf.setBorder(null);
hidden = true;
toggle = new JButton(new ImageIcon("./visibility-button.png"));
toggle.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (hidden) {
htf.showInput();
} else {
htf.hideInput();
}
hidden = !hidden;
}
});
this.setLayout(new GridLayout(1,2));
this.add(htf);
this.add(toggle);
this.setBorder(BorderFactory.createLoweredBevelBorder());
}
}
这就是它目前的样子。如何确保图标显示且尺寸正确?
更新 这段代码得到了可行的结果。我可以从这里调整布局以使其完美。谢谢大家!
package com.carvethsolutions.guilib.fields;
import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.IOException;
public class ToggleHiddenTextField extends JPanel {
private JButton toggle;
private HiddenTextField htf;
private boolean hidden;
public ToggleHiddenTextField() {
htf = new HiddenTextField();
htf.setBorder(null);
hidden = true;
try {
Image image = ImageIO.read(getClass().getResource("/visibility-button.png"));
image = image.getScaledInstance(htf.getPreferredSize().height, htf.getPreferredSize().height, Image.SCALE_AREA_AVERAGING);
toggle = new JButton(new ImageIcon(image));
toggle.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (hidden) {
htf.showInput();
} else {
htf.hideInput();
}
hidden = !hidden;
}
});
} catch (IOException e) {
System.out.println("IOException : ");
e.printStackTrace();
}
this.setLayout(new GridLayout(1,2));
this.add(htf);
this.add(toggle);
this.setBorder(BorderFactory.createLoweredBevelBorder());
}
}
答案 0 :(得分:1)
ImageIO
将文件读取为BufferedImage
。 getScaledInstance()
方法来完成。或者,您可以创建所需大小的第二个BufferedImage,然后将第一个图像绘制为缩放图像。