Размер Java ImageIcon

Я загрузил картинку в свой GUI, который отображается на JLabel. Размер маркировки установлен только 100 100, в то время как изображение намного больше, поэтому когда я загружаю его в маркировку, это расширяется.

Там должен так или иначе сделать, это автоматический изменяет размер к размеру маркировки?

Ниже слушатель действия для Изображения Загрузки JButton

class UploadHandler implements ActionListener 
{
    public void actionPerformed(ActionEvent e)
    {
        int returnVal = fc.showOpenDialog(frame2);
        file = fc.getSelectedFile();
        pathname = file.getPath();
        icon = new ImageIcon(pathname);
        lblDisPic.setIcon(icon);    
    }
}

btnUpload = new JButton("Upload Picture");
lblDisPic = new JLabel();
lblDisPic.setBorder(raisedetched);
lblDisPic.setPreferredSize(d); 

btnUpload.addActionListener(new UploadHandler());
15
задан Nunser 1 July 2014 в 16:54
поделиться

3 ответа

Конечно, просто переопределите метод paintComponent и вы сможете масштабировать и раскрашивать его как вам угодно.

myLabel = new JLabel (/*whatever*/) {

    @Override
    public void paintComponent (Graphics g) {
        super.paintComponent (g);
        g.drawImage (myImageIcon.getImage(), 0, 0, getWidth (), getHeight (), null);
    }
};

Источник от здесь.

EDIT

Для добавления в код измените:

lblDisPic = new JLabel();

На:

lblDidPic = new JLabel() {

    @Override
    public void paintComponent (Graphics g) {
        super.paintComponent (g);
        if (icon != null) {
            g.drawImage (icon.getImage(), 0, 0, getWidth(), getHeight(), null);
        }
    }
};
5
ответ дан 1 December 2019 в 01:45
поделиться

В примере кода можно изменить размер изображения для отображения на JLabel перед setIcon вызывается метод.

Один из способов - изменить метод actionPerformed , чтобы изображение загружалось из указанного файла, используя метод ImageIO.read для чтения изображения, а затем изменяя размер изображения. перед созданием ImageIcon .

Image img = ImageIO.read(fc.getSelectedFile());

Затем размер загруженного изображения можно изменить до размера JLabel , используя Image.getScaledInstance .

Image resizedImage = 
    img.getScaledInstance(lblDisPic.getWidth(), lblDisPic.getHeight(), null);

Теперь можно создать ImageIcon для использования в JLabel .

lblDisPic.setIcon(new ImageIcon(resizedImage));

Ограничение этого метода заключается в том, что если размер JLabel каким-либо образом изменить, то изображение, содержащееся в JLabel , не будет изменено. Однако, поскольку JLabel будет использовать уменьшенное изображение оригинала, это будет означать, что объем требуемой памяти будет уменьшен (если это вызывает беспокойство), и исходное изображение не должно быть изменяется размер каждый раз при отображении изображения, как в случае переопределения метода paintComponent .

Предпочтительный метод решения поставленной задачи будет зависеть от требований относительно того, понадобится ли исходное изображение позже или нет.

25
ответ дан 1 December 2019 в 01:45
поделиться

Двумя наиболее важными элементами любого решения динамического программирования являются:

  1. Определение правых подпроблем
  2. Определение отношения повторения между ответом на подзадачу и ответом на меньшие подзадачи
  3. Поиск базовых случаев , наименьших подзадач, ответ на которые не зависит от других ответов
  4. Определение порядка сканирования , в котором необходимо решить подзадачи (чтобы вы никогда не использовали отношение повторения на основе неинициализированных данных )

Вы узнаете, что у вас есть правильные подпроблемы, определенные, когда

  • Проблема, на которую вам нужен ответ, это одна из них
  • Базовые случаи действительно тривиальны
  • Повторение легко оценить
  • Порядок сканирования прост

В вашем случае просто указать подпроблемы. Поскольку это, вероятно, домашнее задание, я просто дам вам подсказку, что вы можете пожелать, чтобы у N было меньше цифр, чтобы начать с .

-121--3866204-

Может быть, если ваши префиксы имеют одинаковую длину, тогда вы можете сделать , где ПРАВО(число) в ('123456', '234456', 'etc', 'etc', 'etc')

-121--1475110-

Можно переопределить метод paintIcon на самом значке -

ImageIcon icon = new ImageIcon(...) {

    @Override
    public void paintIcon( Component c, Graphics g, int x, int y ) {
        g.drawImage(getImage(), x, y, c.getWidth(), c.getHeight(), c);
    }

    @Override 
    public int getIconHeight() {
        // see below...
    }

    @Override
    public int getIconWidth() {
        // see below...
    }

};

Edit -

Я понял, что первоначальный размер изображения учитывается, когда Метка решает, где разместить x, y Также необходимо переопределить методы getIconWidth () и getIconHeight ().

Однако их невозможно переопределить, чтобы вернуть размер метки, так как в этих методах нет ссылки на сам компонент.

Одним из подходов было бы создание нового класса, который расширяет ImageIcon и передает компонент в - не большой выбор, потому что это нарушает «многократно используемые между многими компонентами» аспекты Icon.

Другой вариант состоит в том, чтобы просто переопределить эти методы во внутреннем классе, как описано выше, но поместить жестко закодированную ссылку на компонент как поле объекта или как окончательную локальную переменную. Опять же, это ломает аспект «многократного использования между многими компонентами» и кажется немного «хакерским» в целом, но, поскольку это одноразовый внутренний класс, это может быть допустимо.

2
ответ дан 1 December 2019 в 01:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: