Ответы пользователя по тегу Java
  • Обработка фото на Java, какие есть библиотеки?

    @odissey_nemo
    Программист, ГИС-системы, растры, космоснимки
    Стандартные библиотеки Java для работы с библиотеками существуют несколько десятилетий и послужили основой для большинство прочих библиотек, доступных сегодня в других средствах программирования.

    Для чтения в память и записи на диск изображений - класс ImageIO для самых разнообразных форматов, существующих для растров.
    Далее работает широчайший набор классов, описывающих все возможные варианты хранения глубины цветности, от 1 бита (BINARY) до 32 бит (RGBA), но может и больше, давно не смотрел туда. Почти все варианты хранения цветов одного пиксела (interleaved, bands и т.д.) внутри растра и т.д.

    Реально даже встроенные библиотеки Java уже сложны для полного освоения, настолько глубоко и полно там всё продумано и абстрагировано. Начать можно отсюда.
    Вообще документации про Java 2D графику в Оракле - море.
    Но базовые операции просты для освоения и запоминания последовательности действий при получении устойчивых и приятных результатов.

    Существуют и многие внешние библиотеки, доступные в Java и других языках и средах программирования. Пример тут.
    GDAL - один из мощных примеров специализированной библиотека по работе с данными ДЗЗ (дистанционного зондирования Земли), легко доступной из Java.
    Ответ написан
    Комментировать
  • Как разбить значение на 3 части?

    @odissey_nemo
    Программист, ГИС-системы, растры, космоснимки
    Можно так:
    ...
            // Test to change datetime items in text form
    
            SimpleDateFormat sdfIn  = new SimpleDateFormat( "dd.mm.yyyy" );
            SimpleDateFormat sdfOut = new SimpleDateFormat( "yyyy.mm.dd" );
    
            String strIn = "25.11.2023";
            Date dt = sdfIn.parse( strIn );
            String strOut = sdfOut.format( dt );
    
            System.out.printf( "+++ Convert date format: '%s' -> '%s'%n", strIn, strOut );
    ...

    Результат: +++ Convert date format: '25.11.2023' -> '2023.11.25'
    Ответ написан
    Комментировать
  • Как удалить из hashmap все элементы с одинаковым значением?

    @odissey_nemo
    Программист, ГИС-системы, растры, космоснимки
    Создаёшь новый пустой HashMap newMap - это будет результат.
    Создаёшь пустой Set newSet - через него будем фильтровать значения.
    Из заданного HashMap oldMap получаем все ключи из oldMap (key) как keySet - это набор всех ключей твоего oldMap.
    Проходишь по oldMap с помощью keySet, извлекая поочерёдно значения (val) из oldMap.
    Каждое значение val проверяешь на наличие его в newSet.
    Если оно там присутствует, ты нашёл ключ к дублированному в oldMap значению val и не сохраняешь его.
    Если val в newSet отсутствует, помещаешь его туда и копируешь пару key<->val из oldMap в newMap;

    После конца алгоритма в newMap имеешь набор только уникальных значений.
    Ответ написан
  • Как сделать интерфейс к программе на Java?

    @odissey_nemo
    Программист, ГИС-системы, растры, космоснимки
    Обычно большую прогу, с новой логикой и в спокойной обстановке (без бешенства манагеров и директоров) начинаю писать с того, что на интерфейсах описываю абстрактную необходимую функциональность. А потом уже её реализую.
    Особенно это полезно, когда пишешь не один. В этом случае, ты реализуешь свои, согласованные с командой интерфейсы, спокойно обращаясь к нереализованным, которые реализуют другие, не тормозя тебя в начале начал.

    В вашем случае можно (знаю это только для JIdea) создать и отладить реально работающий класс. А затем, щелчком пПКМ по имени этого класса и далее из всплывшего меню "Refactor"->"Extract interface". И вуаля, если нет плохих зависимостей, то интерфейс (в смысле синтаксиса Java и как отдельный файл класса) готов. Осталось его грамотно откомментировать и, может быть, реализовать некоторые дефолтные методы, перенеся их из уже написанного кода. Или ещё что потребуется. Но главное , интерфейс для рабочих методов , уже есть.

    А уж реализовать интерфейс в плагине - дело техники. Загрузить плагин и вызвать как инстанс класса интерфейса - тоже не сложно.
    Ответ написан
    Комментировать
  • Как оптимизировать данный код?

    @odissey_nemo
    Программист, ГИС-системы, растры, космоснимки
    1. Памяти под внутренние переменные в приведённых примерах практически не выделяется. вообще
    Если требование по памяти относится именно к памяти под данные, то условие однозначно выполнено!
    А вот требование по памяти всего процесса, под систему, код и данные, и если 50 мегабайт не хватило, то проблема явно не в данных, а настройках компилятора. Например. можно уменьшить размер стека из хипа, который тут практически не требуется.
    2. Как проверяется условие по памяти? У меня на версии Java 8 следующий код сообщает, что занято 20 мегабайт:
    Runtime rt = Runtime.getRuntime();
            long usedMB = (rt.totalMemory() - rt.freeMemory()) / 1024 / 1024;
            System.out.printf("Usage mamory %d Mb%n", usedMB);

    3. Возможно, для уменьшения потребности в памяти следует взять менее прожорливую версию Java. Уверен, что от версии к версии требования к памяти чисто под системные модули однозначно растёт в большую сторону. Хотя с т.з. Java вообще затруднительно отделить память рантайма и кода с данными пользователя. Т.е. 50 мегабайт - это может быть размер программы типа "Hellо World" для Java 8+.
    Ответ написан
    Комментировать
  • Изменить цвет краёв в JMenu?

    @odissey_nemo
    Программист, ГИС-системы, растры, космоснимки
    Попробуйте вызывать такой метод:
    /**
         * Sets the current system look and feel properties
         */
        public static void setSystemLookAndFeel() {
            /* Get the default operation system style */
            final String uiName = UIManager.getSystemLookAndFeelClassName();
            /* Set this default current style for our task */
            try {
                UIManager.setLookAndFeel( uiName );
            } catch ( Exception ex ) {
                System.err.printf( "--- Can't set GUI default system style (%s):%s%n", uiName, ex.getMessage() );
            }
        }

    Где нибудь в начале конструктора JFrame главного окна программы.
    Может, проблема отпадёт и всё станет хорошо.
    Ответ написан
    Комментировать
  • Плавное появление окна JFrame?

    @odissey_nemo
    Программист, ГИС-системы, растры, космоснимки
    Прозрачность работает, да.
    Ответ написан
  • Как зашифровать посредством javax.crypto.Cipher с помощью своего ключа?

    @odissey_nemo
    Программист, ГИС-системы, растры, космоснимки
    Вот такая штука работает, зашифровывает и расшифровывает :

    package su.common.crypto;
    
    import org.apache.commons.lang.StringUtils;
    import su.common.misc.Text;
    
    import javax.crypto.Cipher;
    import javax.crypto.KeyGenerator;
    import javax.crypto.NoSuchPaddingException;
    import javax.crypto.SecretKey;
    import java.security.NoSuchAlgorithmException;
    
    /**
     * Created in su.common.crypto.<br>
     * User: ******<br>
     * Date: 30.08.2011<br>
     * Time: 17:12:45<br>
     */
    public class SimpleEncDec {
        private static final String DEFAULT_ALGO_NAME = "AES";
        //	private static final String DEFAULT_CIPHER_NAME = "AES/ECB/PKCS5Padding";
        private static final String DEFAULT_CIPHER_NAME = "AES/ECB/NoPadding";
        private KeyGenerator m_keygen;
        private SecretKey m_key = m_keygen.generateKey();
        private Cipher m_cipherIn;
        private Cipher m_cipherOut;
    
        public SimpleEncDec( String algorithmName ) throws NoSuchAlgorithmException {
    //        KeyGenerator m_keygen;
            if ( Text.isEmpty( algorithmName ) )
                m_keygen = KeyGenerator.getInstance( DEFAULT_ALGO_NAME );
            else
                m_keygen = KeyGenerator.getInstance( algorithmName );
    
            // Create the cipher
            try {
                m_cipherIn = Cipher.getInstance( DEFAULT_CIPHER_NAME );
                m_cipherIn.init( Cipher.ENCRYPT_MODE, m_key );
                m_cipherOut = Cipher.getInstance( DEFAULT_CIPHER_NAME );
                m_cipherOut.init( Cipher.DECRYPT_MODE, m_key );
            } catch ( Exception e ) {
                e.printStackTrace();
            }
        }
    
        public SimpleEncDec() throws NoSuchAlgorithmException, NoSuchPaddingException {
            this( null );
        }
    
        public String encrypt( String arg, String password ) {
            try {
                byte[] res = m_cipherIn.doFinal( arg.getBytes() );
                return Base64.encode( res );
            } catch ( Exception e ) {
                System.err.println(e);
            }
            return null;
        }
    
        public String decrypt( String arg, String password ) {
            byte[] res = Base64.decode( arg );
            try {
                res = m_cipherOut.doFinal( res );
                return new String( res );
            } catch ( Exception e ) {
                System.err.println(e);
            }
            return null;
        }
    
        public static String strPad16( String strToPad ) {
            final int len = strToPad.length();
            if (len % 16 == 0)
                return strToPad;
            return StringUtils.rightPad( strToPad, (len + 16 - (len%16)) );
        }
    
        public static void main( String[] args ) throws NoSuchAlgorithmException {
    
            SimpleEncDec sed = new SimpleEncDec( "AES" );
            // check functionality
            final String password = "simple_password";
    
            String checkStr = "String to encode/decode for algorithms test";
            System.out.println( String.format( "String to encrypt: \"%s\"", strPad16(checkStr) ) );
    
            // encode string
            String encStr = sed.encrypt( strPad16(checkStr), password );
            System.out.println(String.format( "Encrypted into \"%s\"", encStr ) );
    
            final String decrypt = sed.decrypt( encStr, password );
            String decStr = Text.trimRight( decrypt );
            System.out.println( String.format( "Decrypted to \"%s\"", decStr ) );
    
            if ( decStr.equals( checkStr ) )
                System.out.println( "+++ Encryption/decryption works well +++" );
            else
                System.err.println( "--- Encryption/decryption doesn't work ---" );
        }
    
    }

    Делал давно и все детали забыл напрочь :o) .
    Не указанный Text.trimRight(String) просто убирает все пустые символы справа, от последнего значащего символа. Text.isEmpty(String) проверяет, пуста ли строка ("", null) или нет.
    Класс Base64 переводит байтовые массивы в массив символов Basе64 и обратно.

    В выбранном Вами алгоритме требуются входные строки длиной кратной 16 символам, т.е. 16,32,48,64 и т.д.
    Ответ написан
    Комментировать
  • Как выучить java?

    @odissey_nemo
    Программист, ГИС-системы, растры, космоснимки
    В своё время обучение программированию осуществлялось по иному, более человеческому алгоритму.
    Тебе являлся старший или просто более опытный товарищ, своеобразный гуру, который отвечал тебе на все твои вопросы, но не писал программы за тебя.

    Потыкавшись , с его помощью пару недель, ты вдруг начинал понимать, что пишешь!

    Возможно, на периферии бывшей великой страны, вне чёрного города жёлтого дьявола Москвабада, что-то ещё и сохранилось из тех, человечных времен. Поищите, а вдруг)))
    Ответ написан
    Комментировать
  • Java swing. как переопределять paintComponent() несколько раз, в зависимости от нажатой кнопки?

    @odissey_nemo
    Программист, ГИС-системы, растры, космоснимки
    Давно Свингом не занимался, но скоро буду)) Пока есть только предложение - раз есть один BufferedImage, что мешает заменять его на другой прямо по ссылке, не перерисовывая имеющийся (создав-закачав нужное предварительно из ресурса или с диска), и потом уже вызывать paintCоmponent (repaint?) сразу после замены?

    И не проще ли использовать файлы Icon, а не BufferedImаge, который достаточно низкоуровневый? Но это, конечно, только для случая, когда иконки статические, не динамически рисуемые.

    Или даже назначать для всех кнопок разный статус и после этого вызывать repaint в обработчиках нажатия, в котором уже по свитчу статуса отрисовывать и графику, соответствующую оному (идентификатору последней нажатой кнопки, практически).

    Сами механизмы забыл, пишу только общие соображения. Позже найду примеры собственные и вспомню))
    Ответ написан
    Комментировать
  • Как отслеживать время в приложении?

    @odissey_nemo
    Программист, ГИС-системы, растры, космоснимки
    Может, время исполнения, т.е. время с момента старта программы?
    Если да, то удобно org.apache.commons.lang.time.StopWatch.
    Ответ написан
    Комментировать
  • На чем строить GUI?

    @odissey_nemo
    Программист, ГИС-системы, растры, космоснимки
    Swing вполне самодостаточен, легко эмулирует GUI любой ОС, что Windows, что другие. Кроме Андроид и прочих смартфоных.
    Ответ написан
    Комментировать
  • Как вывести на экран изображение?

    @odissey_nemo
    Программист, ГИС-системы, растры, космоснимки
    Попробуй это, потом что-нибудь ещё. То что хочешь, вполне возможно и на Жабел:
    package tests;
    
    import java.awt.*;
    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;
    
    /**
     * <pre>
     * Class name: Demo
     * Created by SYGSKY for package ru.ts.tests
     * Date: 17.12.2010
     * Time: 16:47:55
     * <p/>
     * ... remove as soon as possible as it is only for testing purposes ...
     * <p/>
     * Changes:
     * </pre>
     */
    public class FullScreen extends java.applet.Applet
    {
      private Label l;
      private Window w;
      private boolean running;
      private int clicks;
      private String[] messages = new String[]{
        "Прикольно, да?",
        "ты хочешь меня... удалить…",
        "Ты знаешь, я не должна, но, но...",
        "Я прекрасна, прсто кликни по мне ещё раз :)"
      };
    
      public synchronized void start()
      {
        w = new Window( new Frame() );
        l = new Label( "PWND" );
        l.setFont( new Font( "Serif", Font.BOLD, 120 ) );
        l.setAlignment( l.CENTER );
        l.setForeground( Color.white );
    
        l.addMouseListener( new MouseAdapter()
        {
          public void mouseClicked( MouseEvent me )
          {
            clicked();
          }
        }
        );
        l.setCursor( Cursor.getPredefinedCursor( Cursor.HAND_CURSOR ) );
    
        w.setBackground( Color.CYAN );
        w.setOpacity( 0.7f );
        w.setLayout( new BorderLayout() );
        w.add( l, BorderLayout.CENTER );
    
        Dimension ss = Toolkit.getDefaultToolkit().getScreenSize();
        w.setBounds( 0, -128, ss.width, ss.height + 256 );
    
        w.setVisible( true );
    
        running = true;
        new Thread()
        {
          public void run()
          {
            while ( isRunning() )
            {
              try
              {
                EventQueue.invokeAndWait( toFront );
                sleep( 10 );
              }
              catch ( Exception ex )
              {
                ex.printStackTrace();
                return;
              }
            }
          }
        }.start();
    
        try
        {
          w.setAlwaysOnTop( true );
        }
        catch ( Throwable t )
        {
          // it was just an attempt, we know this should be forbidden to Applets
        }
      }
    
      private Runnable toFront = new Runnable()
      {
        public void run()
        {
          w.toFront();
        }
      };
    
      private synchronized boolean isRunning()
      {
        return running;
      }
    
      private synchronized void clicked()
      {
        if ( clicks >= messages.length )
        {
          running = false;
          w.dispose();
          return;
        }
        if ( clicks == 1 )
        {
          l.setFont( new Font( "Serif", Font.BOLD, 40 ) );
        }
        l.setText( messages[ clicks++ ] );
      }
    }
    Ответ написан
    Комментировать
  • Как реализовать общение двух и больше компьютеров в java?

    @odissey_nemo
    Программист, ГИС-системы, растры, космоснимки
    Если есть общая БД, то достаточно просто реализовать получение и обработку через неё. С монопольным захватом данных, передачей данных, синхронизацией и т.д.. БД это всё поддерживают. И никаких сокетов, это плюс. Только доступ к БД, который, несомненно, тоже надо администрировать. Но это неизбежно и не даёт дополнительных затрат времени.
    Ответ написан
    Комментировать
  • Как модели связать форму отображения (полигон, линия, точка) с элементом?

    @odissey_nemo
    Программист, ГИС-системы, растры, космоснимки
    Пространственные метеорологические явления отображаются обычно в виде изолинейных полей. Или в виде ареалов с плавным переменным фоном (его проще строить).
    Всё это относится к ГИС-системам и наработано огромное множество методов и библиотек для реализации графики.
    Правда, классический вариант ГИС-системы не подразумевает динамических изображений, максимум - построение информационных срезов для разных моментов времени для единого географического региона.

    Или можно использовать просто GeoServer, в который загружаются лишь геометрия, а статистику он отображает уже сам, из полученных данных
    Ответ написан
    Комментировать
  • Почему при обращении из локального класса к переменной окружающего класса, после её явной инициализации показывает её как null?

    @odissey_nemo
    Программист, ГИС-системы, растры, космоснимки
    Всё логично, хотя и запутано. Устанавливается переменная одного класса (Test), а считывается другого (Test1).
    Если в main вызвать itest.setName("Имя2"), то itest.getName() напечатает "Имя2" :o)
    Ответ написан
    Комментировать
  • Куда писать методы из main(String args[]) jar-приложения в веб-приложении?

    @odissey_nemo
    Программист, ГИС-системы, растры, космоснимки
    Не слишком понятно, что имелось в виду про
    то где писать то, что я писал в main(String args[])
    . Но если предположить, что ищется метод, где всё инициализируется и код пользователя запускается в первый раз, то это вполне может быть класс в HTTP-сервере (написанном на Java), расширяющий системный класс HTTPServlet и перекрывающий его метод init. Наподобие ниже приведённого:
    public final class CustomerDispatcher extends HttpServlet {
    ...
       // Вызывается при инициализации сервлета!
       public void init(ServletConfig config) throws ServletException {
          super.init(config);
          this.context = config.getServletContext();
          this.contextPath = this.context.getContextPath();
          this.rp = new RequestProcessor(this.context);
          this.sman = FssServiceFactory.getFactory().getSecurityManager();
       }
    ...
    Ответ написан
    Комментировать
  • Как изменить размер изображения Java?

    @odissey_nemo
    Программист, ГИС-системы, растры, космоснимки
    Похоже, что масштаб уменьшения Вы установили, но ни к какой картинке его не применили.
    Ответ написан
    Комментировать
  • Проблемы с форматом времени в SimpleDateFormat. Где накосячил?

    @odissey_nemo
    Программист, ГИС-системы, растры, космоснимки
    Тогда уж следовало сразу писать:
    Date date = new Date();
        SimpleDateFormat hoursmins = new SimpleDateFormat("HHmm");
        String stringHoursMins = hoursmins .format(date);
        int hourandminute = Integer.parseInt(hoursmins );


    Не понятно, почему SimpleDateFormat выдаёт в 12 часовом формате. Всегда и везде выдавал в формате 0-23.
    Также непонятно, почему требуется умножать часы на 100. Получается какая-то инопланетная система времяисчисления. Так, вместо наших 12 часов 30 минут = 750 минут, получится 1230 = 20 часов 30 минут. Но это уже могут быть особенности реализации или исторические особенности счёта в разных отраслях экономики (жд. моряки...)
    Ответ написан
    1 комментарий
  • Java. Каким способом объединить xml больших обьемов?

    @odissey_nemo
    Программист, ГИС-системы, растры, космоснимки
    Если имеется в вижу, что есть множество мелких файлов XML общим объёмом 100Мб-1Гб, то применял следующие методы:
    1. StringBuilder с заголовком, далее в него дописываю выдранные с помощью RegEx содержимые каждого из XML. В конце записываю в StringBuilder в шапку что требуется (например, число обработанных файлов), добавляю хвост интегрального XML - и вуаля.
    2.Если не требуется шапку менять в конце работы, то открываю новый ZIP файл и пишу в его поток, который идёт сразу на диск (или в память, как требуется по ситуации). Получается ещё компактнее, раз так в 20-30 по памяти.
    3. Можно и просто в буферизованный файловый поток писать, опять-же (см. пункт 2).

    Выдирал всегда RegEx'ом только потому, что условия были простыми: найти начальный и замыкающий теги нужного куска XML. Если желательно форматирование, то можно слегка подшаманить при добавлении очередного найденного куска с дополнительными пробелами, табуляциями и \n(\r).
    Ответ написан
    Комментировать