Nano Hash - криптовалюты, майнинг, программирование

Как вытащить изображение из поля вложения Access и поместить его в JLabel

Я новичок в Java, поэтому мои знания ограничены. У меня есть это задание, где я должен получить данные из базы данных Access и заполнить диалоговое окно, полное полей. У меня не было проблем с типичными полями, но я зашел в тупик, пытаясь заставить работать поле вложения.

Я пытался использовать методы .getByte(), которые я видел в Интернете, и я еще не совсем понимаю метод класса Attachment uncanaccess. Может ли кто-нибудь помочь мне или направить меня в правильном направлении, пожалуйста? Вот некоторый код для справки о том, как я заполнил другие поля:

JTextField_cod_distrib.setText(result.getLong("Cod_distribuitor")+"");  
JCheckBox_in_stoc.setSelected(result.getBoolean("In_stoc"));
JTextField_pret.setText(result.getFloat("Pret")+"");     JTextField_denumire_produs.setText(result.getString("Denumire_produs")+"");
JTextField_cod_produs.setText(result.getInt("Cod_produs")+"");
JTextField_ambalaj.setText(result.getString("Ambalaj")+"");  

  • Согласно веб-сайту UCanAccess, вы должны получить вложение через ResultSet.getObject(columnName). Тогда у вас есть элемент net.ucanaccess.complex.Attachment. JavaDoc для этого класса показывает getData метод для байтов. Но вы не указали, что вы хотите сделать с вложением. 23.05.2019
  • Я хочу поместить его в JLabel (как в моем примере). По сути, у меня есть JDialogBox с полями и кнопками, и я могу циклически просматривать каждый элемент в таблице базы данных, показывая его свойства. Я хочу извлечь вложение каждого элемента и поместить его в JLabel внутри этого диалогового окна, как я сделал выше с TextFields. Как преобразовать этот объект вложения в изображение и сохранить его внутри этой метки? 23.05.2019
  • Что-то вроде этого должно работать: jlabel.setIcon(new ImageIcon(((Attachment)result.getObject("attachment")).getData())); 23.05.2019
  • @Sascha — Access позволяет вкладывать несколько вложений в строку в поле Attachment, поэтому getObject возвращает массив из net.ucanaccess.complex.Attachment объектов. 23.05.2019
  • Пожалуйста, смотрите мой ответ для этого. 24.05.2019

Ответы:


1

Если вы знаете, что в массиве всегда есть ровно одно вложение, вы можете сделать

jlabel.setIcon(new ImageIcon(getScaled(ImageIO.read(new ByteArrayInputStream(((Attachment[])result.getObject("attachment"))[0].getData())),120,120)));

В противном случае вам придется добавлять JLabel для каждого вложения:

JPanel attachmentPanel=new JPanel(new FlowLayout(FlowLayout.LEFT));
Attachment[] attachments=(Attachment[])result.getObject("attachment");
for(Attachment attachment:attachments) {
    Image original=ImageIO.read(new ByteArrayInputStream(attachment.getData()));
    attachmentPanel.add(new JLabel(new ImageIcon(getScaled(original,120,120))));
}
//add the attachmentPanel to your component

Из https://docs.oracle.com/javase/tutorial/uiswing/examples/components/IconDemoProject/src/components/IconDemoApp.java

/**
     * 
     * Resizes an image using a Graphics2D object backed by a BufferedImage.
     * @param srcImg - source image to scale
     * @param w - desired width
     * @param h - desired height
     * @return - the new resized image
     */
    private BufferedImage getScaledImage(BufferedImage srcImg, int w, int h){
        double sw=srcImg.getWidth();
        double sh=srcImg.getHeight();
        double fw=w/sw;
        double fh=h/sh;
        if(fw<fh) w=(int)(sw*fh);
        else if(fh<fw) h=(int)(sh*fw);
        BufferedImage resizedImg = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
        Graphics2D g2 = resizedImg.createGraphics();
        g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
        g2.drawImage(srcImg, 0, 0, w, h, null);
        g2.dispose();
        return resizedImg;
    }
24.05.2019
  • Удивительно. Работает как шарм. Единственная проблема в том, что изображения не все одинакового размера, поэтому мне нужно их масштабировать. Любая идея, как это сделать с объектом вложения? 27.05.2019
  • Глядя на Код учебника по Oracle Icon Я скопировал метод getScaledImage в свой ответ. 28.05.2019
  • Кажется, не работает. Я получаю сообщение об ошибке Несовместимые типы: ImageIcon не может быть преобразован в изображение. Вот строка кода: JLabel_poza.setIcon(new ImageIcon(getScaledImage(new ImageIcon(((Attachment[])result.getObject(Poza))[0].getData()),120,120))); 31.05.2019
  • Ой, мой плохой. Это должно быть изображение: JLabel_poza.setIcon(new ImageIcon(getScaled(ImageIO.read(new ByteArrayInputStream(((Attachment[])result.getObject("Poza"))[0].getData())),120,120))). 31.05.2019
  • Работает как шарм. Единственная проблема заключается в том, что не все мои изображения квадратные. Как сделать так, чтобы масштабированная высота адаптировалась к ширине? 31.05.2019
  • Я добавил часть пропорционального масштабирования. 03.06.2019
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

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

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..