Рендеринг иконки внутри - PullRequest
0 голосов
/ 26 апреля 2018

Я пишу библиотеку Java GUI для практики, и я хочу создать поле пароля с кнопкой, чтобы переключать этот ввод, чтобы он был видимым / невидимым. Функциональность все есть, но визуально есть некоторые проблемы.

У меня есть значок 512x512 (самый большой размер, который я смог найти), находящийся в папке res / на том же уровне каталогов, что и папка src /. (Я использую IntelliJ в качестве моей IDE). Когда я получаю значок, он появляется на FAR больше, чем 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

Вот как это выглядит в настоящее время. Как я могу убедиться, что значок отображается и имеет правильный размер?

UPDATE: Этот код получить работоспособный результат. Я могу настроить макет отсюда, чтобы сделать его идеальным. Спасибо всем!

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 голосов
/ 26 апреля 2018
  1. Используйте ImageIO, чтобы прочитать файл как BufferedImage.
  2. Затем вы можете масштабировать изображение до любого размера, который вы хотите. Это можно сделать с помощью метода getScaledInstance() объекта BufferedImage. Или вы можете создать второй BufferedImage в нужном вам размере, а затем нарисовать первое изображение в масштабе.
  3. Создайте иконку, используя масштабированное изображение.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...