时间:2018-04-26 20:05:35

标签: java swing

我正在为练习编写一个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());
}

}

enter image description here

这就是它目前的样子。如何确保图标显示且尺寸正确?

更新 这段代码得到了可行的结果。我可以从这里调整布局以使其完美。谢谢大家!

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());
}

}

enter image description here

1 个答案:

答案 0 :(得分:1)

  1. 使用ImageIO将文件读取为BufferedImage
  2. 然后您可以将图像缩放到您想要的任何大小。这可以通过使用BufferedImage的getScaledInstance()方法来完成。或者,您可以创建所需大小的第二个BufferedImage,然后将第一个图像绘制为缩放图像。
  3. 使用缩放图像创建图标。