我正在编写一个Java库以供实践,我想用一个按钮创建一个密码字段,以切换该输入是可见的/不可见的。所有的功能都在那里,但在视觉上有一些问题。
我有一个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());
}
}

发布于 2018-04-26 20:11:24
ImageIO将文件读取为BufferedImage。getScaledInstance()的BufferedImage方法来完成。或者,您可以按照您需要的大小创建第二个BufferedImage,然后将第一个图像绘制到缩放图像中。https://stackoverflow.com/questions/50051054
复制相似问题