Русский
Русский
English
Статистика
Реклама

Netbeans

Минимизация кликов и горячие клавиши для жизни разработчика Темнее Тёмной Темноты

02.07.2020 08:05:44 | Автор: admin
Хороший разработчик/аналитик/просто пользователь ПК стремится к оптимизации любого процесса. Будь то хоть включение чайника на кухне, пока снимаешь куртку зимой, а также к улучшению и модернизации рабочего места или ПО.
Медленный компьютер, тормозящие приложения, узкое использование инструментов с огромнейшими возможностями всё это демотивирует.
Попробуем расширить кругозор и оптимизировать каждый клик.



В статье разобраны 5 IDE, 2 приложения для работы с БД, 2 ОС, 2 браузера и 2 SSH программы и хранитель паролей.



Навигация
PhpStorm 2020.1.2
Notepad++ v7.8.7
Apache Netbeans 12
Sublime Text 3
Visual Studio Code 1.46.1
Redmine
Atlassian (Trello, Bitbucket, SourceTree 3.3.9, Jira, Confluence)
Windows 10
Linux
Google Chrome 83.0
Mozilla (Firefox 78.0b9, Thunderbird 68.9.0)
PL SQL Developer 13
DBeaver 7.1.0
Keepass 2.45
WinSCP 5.17.6
Putty 0.73
Прокачиваем мобильник

Я разбил каждый пункт на подпункты и сделал их раскрывающимися меню, чтоб каждый смог посмотреть только то, чем пользуется или в чём заинтересован.

Вот основные подпункты:
  • Описание. Основное, что делает программа либо выжимка с Википедии
  • Горячие клавиши Совокупность клавиш, при одновременном нажатии которых происходит запрограммированное действие
  • Главное меню Оптимизация рабочего пространства
  • Выравнивание/Табуляция Автоформатирование отступов
  • Шаблоны кода Заранее написанные блоки кода, вызываемые по аббревиатурам и запрограммированной клавише, обычно Tab
  • Ссылки Ссылки на официальный сайт, сайт откуда можно скачать, описание в Википедии, мобильная версия если такая есть, а также просто полезные ссылки, допустим на статьи о приложении


ТТТ
Отдельно хочу выделить подпункт, который я везде называю ТТТ Темнее Тёмной Темноты.
Окрашивание в тёмный цвет всего, что можно + полезные ссылки, в основном на тёмные
темы с userstyles.org (почему-то прямая ссылка даёт иногда 504 ошибку, а ссылки на темы работают нормально), предварительно поставив плагин Stylus в Chrome или в Mozilla
Общие примеры:
Глобальные темы для браузеров:
darkreader
global-dark
ВК
Google Script
скрин



IDE


PhpStorm 2020.1.2




ТТТ
File Settings Editor Color Scheme Material Darker

Выравнивание/Табуляция
  • Code Reformat Code или CTRL+ALT+L
  • File Settings Editor Code Style


Горячие клавиши

Главное меню
File Settings Menus and Toolbars

Шаблоны кода
File Settings Editor Live Templates

Тестирование REST запросов внутри программы
Очень удобно если важна не визуальная составляющая ответа, внутрянка.
Tools HTTP Client Test RESTful Web Service


БД
View Tool Windows Database



SSH
Tools Deployment Browse Remote Host

GIT
  • Если установлен гит, то правой кнопкой мыши в любом файле GIT
  • VCS Git
  • В нижней панели Version Control


Экспорт настроек


Командная строка
Снизу вкладка Terminal

Тайм-трекинг
File Settings Tools Tasks Servers




Notepad++ v7.8.7



Плагины
Плагины Управление плагинами. Есть полезные:
  • XML Tools
  • QuickText (Это шаблоны кода)
  • Snippets
  • Customize Toolbar (Это настройка главного меню)
  • Compare (Diff)


Выравнивание/Табуляция
Опции Настройки Синтаксисы

Горячие клавиши
Опции Сочетание клавиш

ТТТ
Опции Определение стилей




Apache Netbeans 12




Горячие клавиши
Tools Options Keymap

Выравнивание/Табуляция
Tools Options Editor Formatting

Шаблоны кода
Tools Options Editor Code Templates (бонусом выставление курсора)

Главное меню
Tools Options Appearance Document Tabs, а также в вкладке Window

Командная строка
Window IDE Tools Terminal

ТТТ






Sublime Text 3




ТТТ
  • Preferences Color Scheme Monokai
  • Preferences Theme


Горячие клавиши
Preferences Key Bindings

Шаблоны кода
Tools Snippets




Visual Studio Code 1.46.1




Горячие клавиши
File Preferences Keyboard Shortcuts

Консоль
Terminal New terminal

Расширешия
View Extensions

Репозиторий
View SCM


Ссылки



Аналитика


Redmine


новый




ТТТ
При создании нового проекта есть выбор светлой или тёмной темы.


старый


ТТТ
Не забываем подправлять URL если он у нас домашний



Шаблоны
Скачиваем и устанавливаем Redmine.
Создаём, что надо, проекты и т.д.
Допустим нам надо заполнить по шаблону поля при создании новой задачи.
Для этого нам опять помогут UserScript`ы.
Устанавливаем TamperMonkey по аналогии с статьёй habr.com/ru/post/504664 (пункт Юзерскрипты в браузере), вставляем
код
// ==UserScript==// @name         redmineTemplate// @namespace    http://127.0.0.1/redmine*// @version      0.1// @author       You// @match        http://127.0.0.1/redmine*// ==/UserScript==var d = document.createElement('span');document.querySelector('#issue_tracker_id').parentNode.appendChild(d);d.style['color'] = 'red';d.style.width = '100px';d.style.cursor = 'pointer';d.style.paddingLeft = '30px';d.textContent = 'Шаблон'; d.addEventListener('click', function () {   //Трекер   $('#issue_tracker_id :contains(\'Поддержка\')').attr('selected', 'selected');   // Описание   $('#issue_description').val('Полное описание. \nПример:...');   // Срок завершения   $('#issue_due_date').attr('value',$('#issue_start_date').attr('value'));   // Готовность   $('#issue_done_ratio :contains(\'30 %\')').attr('selected', 'selected'); });



Появляется кнопка, жмём, автозаполняются поля теми значениями, которые мы указали.


Скрипт простой, но времени экономит вагон.
Можно в любой части редмайна вставить подобные скрипты и автоматизировать часто используемые части.




Atlassian


У Atlassian есть хаб в хабре, некоторые статьи будут из него

Confluence








Trello




Горячие клавиши

Шаблоны



Bitbucket







SourceTree 3.3.9




ТТТ
Инструменты Настройки Общее Theme

Шаблоны кода
Инструменты Настройки Пользовательские действия

Горячие клавиши
Подсвечены в главном меню у каждого пункта



Jira




Шаблоны кода
Через TamperMonkey по аналогии с старым редмайном (выше)
document.querySelector('#summary').value = 'Новая тема'







ОС


Windows 10




bat
Очень много батников нашлось в интернете и много статей в Хабре. Кому интересно, просто заходим в Хабр, вводим в поиск bat (либо сразу по ссылке) и изучаем возможности.


ТТТ


Пуск Параметры Персонализация Цвета Тёмный.
Как изменить цвет выделения в Windows 10
Как изменить цвет окон Windows 10

Ускорение


Оптимизация действий
  • Автозагрузка нынче перенеслась из WIN+R msconfig в Диспетчер задач (CTRL+SHIFT+ESC либо переходим в Пуск Параметры Приложения Автозагрузка).
  • Скрипт настройки Windows 10


Отключаем ненужные приложения
Если мы хотим, чтоб при запуске Windows сразу открывались нужные нам приложения, добавляем их в папку автозагрузки.
Обычно она по адресу C:\Users\ВАШ_ПОЛЬЗОВАТЕЛЬ\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup, либо можно так: WIN+R Вводим shell:startup, в папку вставляем приложения (лучше ярлыки)
Добавить приложение для автоматического запуска при начальной загрузке Windows 10
Отключить подтверждение перед установкой приложений (UAC контроль учётных записей). Жмём лупу справа от Пуска, вводим UAC, жмём Изменение параметров контроля учётных записей, бегунок вниз.

Внешний вид
Приводим рабочий стол в порядок, удаляем лишнее, переносим ярлыки, чтоб все были под рукой. Тоже самое делаем и с папками, сколько бы временных затрат это ни стоило. Упорядоченные папки, без шуток, экономят массу времени (но я до сих пор не могу разобрать злосчастную папку На потом).
Если вам мало места или вы ведёте двойную/тройную жизнь, допустим дизайнер и БДшник, используйте несколько рабочих столов



Linux




Да простят меня все, но я не Линуксоид. Собрал, что знал, думаю хоть что-то, да будет полезным




Браузеры


Google Chrome 83.0




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




Mozilla


Firefox Developer 78.0b9


Также, как и в Chrome для ускорения обмена настройками между разными компьютерами заводим аккаунт и настраиваем синхронизацию. И также объединяем закладки в папки для экономии места.
ТТТ


Ссылки



Thunderbird 68.9.0


Папки и фильтры
Если нам приходится много работать с почтой, системное разделение на папки по темам очень ускоряет работу и не отвлекает на ненужную почту.
Инструменты Фильтры сообщений. Настройка антиспама и пересылки раскладывания сообщений по папкам настраивается тут.

ТТТ
Инструменты Дополнения Темы Dark




Database


PL SQL Developer 13




Шаблоны кода
Они чуть другие, чем обычные шорткаты. Вставляются либо двойным кликом либо перетаскиванием в рабочее окно.
Вид Список шаблонов





DBeaver 7.1.0




ТТТ
  • Окна Настройки Общие Внешний вид Dark
  • Окна Настройки Общие Внешний вид Цвета и шрифты


Горячие клавиши
Окна Настройки Общие Клавиши

Выравнивание/Табуляция
  • Окна Настройки Общие Текстовые редакторы
  • Окна Настройки DBeaver Редакторы Редактор SQL Форматирование


Шаблоны кода
Окна Настройки DBeaver Редакторы Редактор SQL Templates

Диаграммы связей
Собственно из-за чего я и оставил DBeaver. Жмём на таблицу с CTRL, выбираем вкладку Диаграмма и видим все соединения с выбранной таблицей.




Храним пароли


Keepass 2.45




Храним пароли в одном месте.



FTP + SSH


WinSCP 5.17.6




Чтоб меняться подключениями между рабочими местами, пользуемся выгрузкой Инструменты Экспорт настроек
ТТТ
Внешний вид Интерфейс Theme Dark

Горячие клавиши
В главном меню Команды





Putty 0.73




Обмен подключениями между рабочими местами нашёл пока только такой способ через реестр Computer\HKEY_CURRENT_USER\Software\SimonTatham\PuTTY\Sessions
ТТТ
Window Colours




Прокачиваем мобильник


Уделяем внимание папкам и объединению приложений. Лишний клик забывается, как только привыкаешь и запоминаешь, где что.
Если у вас уже настроена почта по папкам, то с мобильного телефона удобней смотреть уже сортированное. То есть настраиваем на компьютере, пользуемся на компьютере и на мобильном.
Боты в телеграм. Скептически к ним относился, пока пару штук не сделал и не понял всех возможностей. Склеивать их с различными Google-сервисами можно на ура, главное придумать, как оптимизировать время, создав или найдя уже существующего полезного бота.
Календарь. Тут всё просто. Используем его везде.
Чеклист допустим TickTick
Список дел, допустим Простой список дел или Задачи: Список задач. Нужны, чтоб не держать всё в голове и если не нравится календарь.

Итог


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

Полезные ссылки, которые также могут пригодится


Tabsbook
www.tabsbook.ru Пока для меня самый удобный менеджер закладок, работающий как в Chrome, так и в Mozilla. Если есть инструмент, объединяющий закладки кроссбраузерно, буду признателен поделившимся.


Adminer
www.adminer.org очень хорошая альтернатива www.phpmyadmin.net, умещается в один файл php.


Heroku
www.heroku.com облачная PaaS-платформа

Miro
Miro (до 2019 года RealtimeBoard) платформа для совместной работы распределенных команд (в том числе при дистанционной работе отдельных сотрудников), разработанная в России и вышедшая на международный рынок.
Официальный сайт
Википедия
Андроид

Airtable
Airtable представляет собой гибрид базы данных и электронной таблицы.
Официальный сайт
Википедия
Андроид

AWD - Android Web Developer
AWD PHP/HTML/CSS/JS IDE Android Web Developer (AWD) это IDE (интегрированная среда разработки) для веб разработчиков. Поддерживаются следующие языки и форматы: PHP, CSS, JS, HTML, JSON
Подробнее..

Радио с записью станций на языке Java

19.03.2021 14:20:53 | Автор: admin

Привет всем! Как я уже говорил в своем первом посте, я не программист, а скорее любитель. Пробовал писать свои поделки на разных языках, но начинал я с Java. Больше всего из семейства Java мне понравилась платформа JavaFX. Точнее сказать, связка JavaFX + FXML, где в контроллере расписываем логику, а графический интерфейс описываем в отдельном fxml-файле. Радио как раз написано с помощью этой связки.

Для воспроизведения применяется библиотека JLayer. Встроенный класс MediaPlayer почему-то отказался у меня работать. Запись и воспроизведение сделаны в отдельных потоках. Ради эксперимента пробовал запустить воспроизведение в основном потоке приложения. Получил намертво зависший интерфейс. То же самое получил и при попытке записи в основном потоке.

Полностью код приложения доступен в репозитории GitHub. Приложение было создано с помощью среды разработки NetBeans 8.2 и конструктора Scene Builder от компании Gluon. В этом посте я не ставил целью полностью рассмотреть код приложения, а лишь остановился на некоторых, самых интересных, на мой взгляд, моментах.

Внешний вид

Вот так программа выглядит:

В меню Station находятся пункты для создания, удаления и изменения станции. В меню Record можно найти пункты для начала и остановки записи, а также для изменения директории записи. В меню Reference имеется пункт для выхода из программы и пункт О Программе, показывающий некоторую информацию о приложении.

Содержимое файла разметки интерфейса. Все очень лаконично и понятно. Какие-то пояснения, я думаю, излишни.

<?xml version="1.0" encoding="UTF-8"?><?import javafx.scene.control.Button?><?import javafx.scene.control.Label?><?import javafx.scene.control.ListView?><?import javafx.scene.control.Menu?><?import javafx.scene.control.MenuBar?><?import javafx.scene.control.MenuItem?><?import javafx.scene.layout.AnchorPane?><?import javafx.scene.text.Font?><AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="300.0" prefWidth="535.0" xmlns="http://personeltest.ru/away/javafx.com/javafx/8.0.171" xmlns:fx="http://personeltest.ru/away/javafx.com/fxml/1" fx:controller="radioplayer.PlayerController">   <ListView fx:id="stationsListView" focusTraversable="false" layoutX="14.0" layoutY="36.0" prefHeight="246.0" prefWidth="200.0" AnchorPane.bottomAnchor="14.0" AnchorPane.leftAnchor="14.0" AnchorPane.topAnchor="36.0" />   <Button fx:id="playButton" focusTraversable="false" layoutX="240.0" layoutY="177.0" mnemonicParsing="false" onAction="#playAction" prefHeight="103.0" prefWidth="130.0" text="PLAY" AnchorPane.bottomAnchor="14.0" AnchorPane.rightAnchor="165.0">      <font>         <Font name="System Bold" size="22.0" />      </font></Button>   <Button fx:id="stopButton" focusTraversable="false" layoutX="391.0" layoutY="177.0" mnemonicParsing="false" onAction="#stopAction" prefHeight="103.0" prefWidth="130.0" text="STOP" AnchorPane.bottomAnchor="14.0" AnchorPane.rightAnchor="14.0">      <font>         <Font name="System Bold" size="22.0" />      </font></Button>   <Label fx:id="nameStation" layoutX="240.0" layoutY="46.0" prefHeight="113.0" prefWidth="279.0" wrapText="true" AnchorPane.bottomAnchor="141.0" AnchorPane.rightAnchor="14.0" AnchorPane.topAnchor="36.0">      <font>         <Font name="System Bold Italic" size="24.0" />      </font></Label>   <MenuBar prefHeight="29.0" prefWidth="535.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">     <menus>       <Menu mnemonicParsing="false" text="Station">         <items>           <MenuItem mnemonicParsing="false" onAction="#addAction" text="Add" />           <MenuItem mnemonicParsing="false" onAction="#editAction" text="Edit" />           <MenuItem mnemonicParsing="false" onAction="#deleteAction" text="Delete" />         </items>       </Menu>       <Menu mnemonicParsing="false" text="Record">         <items>           <MenuItem fx:id="recordItem" mnemonicParsing="false" onAction="#recordAction" text="To begin" />           <MenuItem fx:id="stopRecordItem" mnemonicParsing="false" onAction="#stopRecordAction" text="Stop" />           <MenuItem mnemonicParsing="false" onAction="#directoryRecordAction" text="Records Directory" />         </items>       </Menu>       <Menu mnemonicParsing="false" text="Reference">         <items>           <MenuItem mnemonicParsing="false" onAction="#appInfoAction" text="About the program" />           <MenuItem mnemonicParsing="false" onAction="#exitAction" text="Exit" />         </items>       </Menu>     </menus>   </MenuBar></AnchorPane>

Файл стилей (toast это всплывающие сообщения. О них позже):

.root{    -fx-background-color: grey;}.button{    -fx-background-radius: 40;    -fx-border-radius: 40;    -fx-text-fill: white;}.button:hover{    -fx-background-color: derive(-fx-base, 18%);    -fx-border-style: solid;    -fx-border-width: 1;    -fx-border-color: derive(-fx-base, -15%);    -fx-cursor: hand;}.button:pressed{    -fx-text-fill: black;}.list-view, .list-view .viewport, .list-view .content{    -fx-background-color: gainsboro;}.list-view:hover{    -fx-cursor: hand;}.toast{    -fx-background-radius: 30;    -fx-border-radius: 30;    -fx-background-color: black;    -fx-padding: 20;}#nameStation{    -fx-text-fill: white;}#playButton{    -fx-background-color: blue;}#stopButton{    -fx-background-color: red;}

Воспроизведение и запись

Воспроизведение происходит с помощью этого кода:

taskPlayer = new Task() {            @Override            public Void call() {                try {                    radioUrl = new URL(urlString);                    InputStream in = radioUrl.openStream();                    InputStream is = new BufferedInputStream(in);                    player = new Player(is);                    player.play();                } catch (FileNotFoundException e) {                    e.getMessage();                } catch (IOException | JavaLayerException e) {                    e.getMessage();                }                return null;            }        };        new Thread(taskPlayer).start();

В отличие от воспроизведения, при записи никаких сторонних библиотек не используется. Как уже говорилось, для воспроизведения применяется библиотека JLayer. Запись происходит так:

taskRecord=new Task() {            @Override            public Void call() throws FileNotFoundException, IOException{                    output = new FileOutputStream(reader(file.getAbsolutePath())+                            separator+nameStation.getText()+"-"+new Date().toString().replace(":","-")+".mp3");                    InputStream in = radioUrl.openStream();                    InputStream is = new BufferedInputStream(in);                    byte data[] = new byte[1024];                    int count;                    while ((count = is.read(data)) != -1) {                        output.write(data, 0, count);                    }                output.flush();                return null;            }        };        new Thread(taskRecord).start();

Станции

Станции хранятся в виде текстовых файлов, где имя файла представляет собой название станции, а содержимое это ее URL. Вот метод, который создает станции при первом запуске:

private void createDefaultStations(){         String[] stationNames = {"NonStopPlay","Classical Music","Fip Radio","Jazz Legends","Joy Radio","Live-icy","Music Radio","Radio Electron","Dubstep","Trancemission"};         String[] stationUrls = {"http://stream.nonstopplay.co.uk/nsp-128k-mp3","http://stream.srg-ssr.ch/m/rsc_de/mp3_128","http://direct.fipradio.fr/live/fip-midfi.mp3","http://jazz128legends.streamr.ru/","http://airtime.joyradio.cc:8000/airtime_192.mp3","http://live-icy.gss.dr.dk:8000/A/A05H.mp3","http://ice-the.musicradio.com/CapitalXTRANationalMP3","http://radio-electron.ru:8000/128","http://air.radiorecord.ru:8102/dub_320","http://air.radiorecord.ru:8102/tm_320"};         for(int i=0;i<10;i++){             writer(path+separator+stationNames[i], stationUrls[i]);         }    }

Вызов этого метода происходит из другого метода dirCreator, который создает директорию RadioStations, где хранятся файлы станций. Вот этот метод:

private void dirCreator(final String fPath) {        final File file = new File(fPath);        if (!file.exists()) {            file.mkdir();            if(file.exists()){                alertWindow("The <RadioStations> directory has been created.\nYour radio stations will be here:\n"+fPath);                createDefaultStations();            }else{                alertWindow("Error!\nThe <RadioStations> directory will not be created.\n" +                        "Try creating the specified directory manually in the following path:\n"+fPath+"\nThe program will be closed.");                System.exit(0);            }        }    }

Разрешения на чтение и запись

Следующие методы проверяют разрешения на чтение и запись. Если разрешение отсутствует, то пытаются установить его:

private boolean permissionRead(File file){        if(!file.canRead()){            file.setReadable(true);            return !file.canRead();        }        return false;    }    private boolean permissionWrite(File file){        if(!file.canWrite()){            file.setWritable(true);            return !file.canWrite();        }        return false;    }

Применяются эти методы в инициализаторе для проверки разрешений для папки RadioStations:

@Override    public void initialize(URL url, ResourceBundle rb) {        parentPath = System.getProperty("user.home");        path=parentPath+separator+"RadioStations";        this.dirCreator(this.path);        File f=new File(path);        if(permissionRead(f)||permissionWrite(f)){            if(permissionRead(f)&&permissionWrite(f)){                alertWindow("Failed to get permission to read and write files to the <RadioStations> directory.\nTry to give permission manually.");            }else if(permissionRead(f)){                alertWindow("Failed to get permission to read files in directory <RadioStations>.\nTry to give permission manually.");            }else{                alertWindow("Failed to get permission to write files to <RadioStations> directory.\nTry to give permission manually.");            }            System.exit(0);        }        showStationsList();        stopButton.setDisable(true);        recordItem.setDisable(true);        stopRecordItem.setDisable(true);    }   

Диалоги

Для построения диалогов я не использовал визуальный конструктор, а писал все вручную. Например, вот диалог, который появляется перед записью. Программа спрашивает куда сохранять запись:

final Alert alert = new Alert(Alert.AlertType.CONFIRMATION);        alert.setResizable(true);        alert.getDialogPane().setPrefSize(500,200);        alert.setTitle("Saving Recordings");        alert.setHeaderText("");        alert.setContentText("The default path for your recordings is:\n"+f.getAbsolutePath()+"\nChange?");                ButtonType buttonTypeEdit = new ButtonType("Edit", ButtonBar.ButtonData.OK_DONE);        ButtonType buttonTypeDefault = new ButtonType("Default", ButtonBar.ButtonData.FINISH);        ButtonType buttonTypeCancel = new ButtonType("Cancel", ButtonBar.ButtonData.CANCEL_CLOSE);                alert.getButtonTypes().setAll(buttonTypeEdit, buttonTypeDefault, buttonTypeCancel);                final Optional<ButtonType> resultAlert = alert.showAndWait();

Вот окно диалога:

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

Вот еще пример диалога. Это диалог добавления станции:

Dialog dialog = new Dialog<>();        dialog.setTitle("Station Creation");        dialog.setHeaderText("Enter the name and url of the radio station");        ButtonType createButtonType = new ButtonType("Create", ButtonBar.ButtonData.OK_DONE);        ButtonType cancelButtonType  = new ButtonType("Cancel", ButtonBar.ButtonData.CANCEL_CLOSE);        dialog.getDialogPane().getButtonTypes().addAll(createButtonType,cancelButtonType);        GridPane grid = new GridPane();        grid.setHgap(10);        grid.setVgap(10);        grid.setPadding(new Insets(20, 150, 10, 10));        TextField stationName = new TextField();        TextField url = new TextField();        grid.add(new Label("Title:"), 0, 0);        grid.add(stationName, 1, 0);        grid.add(new Label("Url:"), 0, 1);        grid.add(url, 1, 1);        dialog.getDialogPane().setContent(grid);        Optional<ButtonType> result = dialog.showAndWait();

Здесь все просто. Получаем окно с двумя текстовыми полями. Вот такое:

Окно диалога для изменения станций такое же, только поля заполнены данными изменяемой станции.

Заставка

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

package radioplayer;import javafx.application.Application;import java.awt.*;import javafx.stage.Stage;/** * * @author alex */public class Splash extends Application{        public static void main(final String[] args) {        SplashScreen splash = SplashScreen.getSplashScreen();        try {            Thread.sleep(3000L);        }        catch (InterruptedException ex) {            ex.getMessage();        }        if (splash != null) {            splash.close();            Application.launch(RadioPlayer.class, args);        }    }    @Override    public void start(Stage primaryStage) throws Exception {        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.    }}

Сама заставка:

Там же в настройках нужно указать следующие параметры для виртуальной машины:

-splash:src/images/splash.png

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

SplashScreen-Image: images/splash.png

Всплывающие сообщения, как в Android

В приложении имеются всплывающие сообщения, которые выглядят как подобные сообщения в Android OS. Вот пример сообщения:

За их появления отвечает отдельный класс:

package radioplayer;import javafx.animation.KeyFrame;import javafx.animation.KeyValue;import javafx.animation.Timeline;import javafx.scene.Scene;import javafx.scene.layout.StackPane;import javafx.scene.paint.Color;import javafx.scene.text.Font;import javafx.scene.text.Text;import javafx.stage.Stage;import javafx.stage.StageStyle;import javafx.util.Duration;/** * * @author alex */public class Toast {    void setMessage(final String toastMsg){        Stage toastStage=new Stage();        toastStage.setResizable(false);        toastStage.initStyle(StageStyle.TRANSPARENT);        Text t = new Text(toastMsg);        t.setFont(Font.font("Verdana",20));        t.setFill(Color.WHITE);        StackPane root = new StackPane(t);        root.getStyleClass().add("toast");        root.setOpacity(0);        Scene scene = new Scene(root);        scene.getStylesheets().add((getClass().getResource("style.css")).toExternalForm());        scene.setFill(null);        toastStage.setScene(scene);        toastStage.show();        Timeline tl1 = new Timeline();        KeyFrame fadeInKey1 = new KeyFrame(Duration.millis(500),new KeyValue (toastStage.getScene().getRoot().opacityProperty(), 1));        tl1.getKeyFrames().add(fadeInKey1);        tl1.setOnFinished((ae) ->                new Thread(() -> {                    try {                        Thread.sleep(3000);                    } catch (InterruptedException e) {                        e.getMessage();                    }                    Timeline tl2 = new Timeline();                    KeyFrame fadeOutKey1 = new KeyFrame(Duration.millis(500), new KeyValue(toastStage.getScene().getRoot().opacityProperty(), 0));                    tl2.getKeyFrames().add(fadeOutKey1);                    tl2.setOnFinished((aeb) -> toastStage.close());                    tl2.play();                }).start());        tl1.play();    }}

Сборка

Если создавать исполняемый архив, просто нажав в NetBeans кнопку очистки и сборки проекта, мы получим архив, который не будет содержать в себе классы библиотеки JLayer. В манифесте этого архива будет прописан путь до библиотеки. Программа будет работать, только если библиотека будет расположена по этому пути.

Чтобы классы библиотеки JLayer запаковать в исполняемый архив, нужно в файле build.xml дописать следующее:

<target name="package-for-store" depends="jar">    <property name="store.jar.name" value="Radio"/>    <property name="store.dir" value="store"/>    <property name="store.jar" value="${store.dir}/${store.jar.name}.jar"/>    <echo message="Packaging ${application.title} into a single JAR at ${store.jar}"/>    <delete dir="${store.dir}"/>    <mkdir dir="${store.dir}"/>    <jar destfile="${store.dir}/temp_final.jar" filesetmanifest="skip">        <zipgroupfileset dir="dist" includes="*.jar"/>        <zipgroupfileset dir="dist/lib" includes="*.jar"/>        <manifest>            <attribute name="Main-Class" value="radioplayer.Splash"/>            <attribute name="SplashScreen-Image" value="images/splash.png"/>        </manifest>    </jar>    <zip destfile="${store.jar}">        <zipfileset src="${store.dir}/temp_final.jar"        excludes="META-INF/*.SF, META-INF/*.DSA, META-INF/*.RSA"/>    </zip>    <delete file="${store.dir}/temp_final.jar"/></target>

Для сборки в меню нужно выбрать выполнить цель, а в подменю найти package-for-store. В папке store появится готовый архив.

Дополнительная ссылка на SourceForge. До встречи в следующих постах!

Подробнее..

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru