Notes – опублікував первопис на github.com

Опублікував первопис свого записника на github.com.

=-=-=-=-=
Powered by Blogilo

Advertisements

Поєднання зручності візуального проектування та динамічного оновлення даних JTable

Поєднання зручності візуального проектування та динамічного оновлення даних JTable.

Проектування візуальних форм із застосуванням NetBeans IDE має безліч переваг над “ручним” кодуванням. Але іноді виникають ситуації коли доводиться шукати компроміс між гнучкістю “ручного” кодування та швидкістю і зручністю застосування IDE.

Ось приклад:

  • створюємо в NetBeans IDE форму (на приклад JFrame),
    • додаємо на форму компонет таблицю (JTable),
      • потім заповнюємо модель таблиці:
        • додаємо необхідну кількість колонок,
        • підписуємо заголовки,
        • встановлюємо ширину,
        • типи даних.
  • створюємо в NetBeans IDE форму (на приклад JFrame)

jframe

  • додаємо на форму компонет таблицю (JTable)

  • потім заповнюємо модель таблиці

  • додаємо необхідну кількість колонок

  • підписуємо заголовки

  • встановлюємо ширину

  • типи даних

В редакторі форм зробити це все можна швидко і просто, але якщо необхідно в процесі роботи програми поновити дані в таблиці тут виникають деякі питання. Застосовуючи “ручне” кодування ми б використовували для формування моделі масиви із назвами колонок та іншою необхідною інформацією, а для оновлення таблиці на основі цих масивів завжди можна сформувати нову модель даних DefaultTableModel tm = new DefaultTableModel(Object[][] data, Object[] columnNames).

У випадку створення форми в NetBeans IDE модель таблиці буде описана в процедурі initComponents() і масиви цієї моделі не іменовані. Доступ до них є але код, як на мене, надто громіздкий, не прозорий, а деякі масиви доводиться дублювати.

Тому я використовую наступні методи:

1.

...
// спорожнити таблицю (знищити тільки дані)
DefaultTableModel tm = (DefaultTableModel) jTable1.getModel();
tm.getDataVector().clear();
...

2.

...
// заповнити таблицю інформацією із бази даних
int cc = tm.getColumnCount();
while (rs.next()) {
  Object r[] = new Object[cc];
  for (int c = 0; c < rs.getMetaData().getColumnCount(); c++) {
    r[c] = rs.getString(c+1);
  }
  tm.addRow(r);
}
...

3.

// вставити запис і перейти до цього нового запису
...
tm.insertRow(0, new Object[сс]);
jTable1.setRowSelectionInterval(0, 0);
jScrollPane1.getVerticalScrollBar().setValue(0);
...

Це дає можливість поєднання зручності візуального проектування та динамічного оновлення даних.

=-=-=-=-=
Powered by Blogilo

Про кілька проектів для роботи з DBF файлами

До кінця 90-х DBase і подібні йому формати були найкращою платформою бази даних для малих і навіть середніх корпоративних додатків. Вони не вимагали складної апаратної конфігурації і були дешеві для впровадження.

Структура DBF файлу проста і достатньо добра для своєї мети.

З часом розвинулося багато, різного рівня складності та масштабованості, систем керування базами даних із різноманітними форматами зберігання і обміну даними.

І все ж формат DBF файлів залишається одним з найпростіших способів зберігання і передачі даних.

Докладний опис DBF файлів можна знайти на сайті Xbase File Format Description.

Далі коротко про кілька проектів для роботи з DBF файлами на Java:

1. csvjdbc

CsvJdbc простий із можливістю тільки читання JDBC драйвер, який використовує файли із значеннями, розділеними комами (CSV) як таблиці бази даних. Він ідеально підходить для написання програм імпорту даних. Драйвер дозволяє отримати доступ до каталогу або ZIP-файлу, що містить файли CSV, так ніби це база даних, що містить таблиці.

Має методи для роботи з DBF файлами.

2. jdbfdriver-source

Драйвер Java, який може читати, змінювати і створювати файли XBase версії III DBF. Використання дуже схоже на XBase (наприклад: append blank, replace, і т.п.). Читання і запис здійснюється через канали і прямим обміном із буфером для підвищення продуктивності. DBT (memo) поля підтримується. В даний час індекси не підтримуються.

3. DbasePsql або Simple DBase SQL

DbasePsql конвертор .dbf файлів у PostgreSQL. Генерує SQL текст.

4. JavaDBF

JavaDBF являє собою бібліотеку Java для читання і запису dbf файлів (XBase). Є безліч старих програм, які використовують DBF в якості основного формату зберігання даних. JavaDBF спочатку був написаний для передачі даних з таких додатків.

5. xBaseJ

Java об’єкти для читання і запису dbf файлів. xBaseJ клас пропонує кілька методів обробки DBase III і IV файлів і файлів FoxPro. Підтримує індекси. Пакет поставляється із сервером додатків на основі RMI, методами для роботи із файлами баз даних і класами клієнтського інтерфейсу. Ці класи дозволяють віддаленим клієнтам отримувати доступ до баз даних на серверних машинах. У той час як пакет RMI дуже швидкий, він не має ні механізмів безпеки, ні механізми блокування.

=-=-=-=-=
Powered by Blogilo

Завантаження файлу у blob-поле із застосуванням драйверу jdbc Oracle

Процедура завантаження файлу у blob-поле із застосуванням драйверу

jdbc Oracle або jdbc H2 database

...
    // sql-оператор
    String sqltext = "insert into t (id,nazva,zdt,img) values (?,?,?,?)";
    try {
      // 1. вимкнути автокоміт
      conn.setAutoCommit(false);
      // 2. підготувати оператор
      PreparedStatement ps = conn.prepareStatement(sqltext);
      // 3. ініціалізувати параметри
      ps.setInt(1, id);       // ідентифікатор
      ps.setString(2, nazva); // назва
      ps.setString(3, zdt);   // звітна дата
      // 4. завантажити файл або ініціалізувати поле порожнім blob
      if (true) {
         File f = new File(filename);
         FileInputStream fis = new FileInputStream(f);
      // 4.1. завантаження файлу у blob-поле
        ps.setBinaryStream(4, fis, (int) f.length()); // файл
      } else {
      // 4.2. ініціалізувати поле порожнім blob
        ps.setNull(4, OracleTypes.BLOB);
      }
      // 5. вставити запис в таблицю
      ps.execute();
      // 6. зафіксувати зміни
      conn.commit();
      ps.close();
      // 7. увімкнути автокоміт
      conn.setAutoCommit(true);
      ifs.close();
    }
...

=-=-=-=-=
Powered by Blogilo

Помилка “Duplicate class: pkgname.ClassName” в NetBeans

Повідомлення про помилку “Duplicate class: pkgname.ClassName” в NetBeans і її вирішення.

У одному з проектів NetBeans я необережно перейменував файл класу і після цього він повідомив мені “Duplicate class: pkgname.ClassName”.

Щоб вирішити проблему знищував файл класу і за допомогою рефакторингу NetBeans, і за допомогою файлового менеджера, та все марно.

Коли я створював файл, який так необережно перейменував, NetBeans повідомляв про ту ж саму помилку.

Вирішення виявилося простим, необхідно вийти з NetBeans і знищити теку cache із всім її вмістом.

Зробити це можна в консолі за допомогою команди:

user@host:~$ rm -R ~/.netbeans/7._/var/cache

або скористатися файловим менеджером.

=-=-=-=-=
Powered by Blogilo

Notes – програма для нотаток

Існує безліч текстових редакторів і записників. Усі вони мають свої переваги і недоліки.

Основна відмінність notes полягає у тому, що нотатки зберігаються не у файлах, а в базі даних sqlite;

 Вільна програма для набору музичних партитурВже не вперше бачу на своєму блозі людей, які шукають “програму для написання нот”. Іншими словами, якщо ви шукаєте “програму для набору музичних партитур” то вам сюди.

Отримати та встановити програму-записник

Програма написана на Java. Тому для роботи програми необхідно встановити JRE.

Якщо в репозитарії вашої системи немає JRE то його можна завантажити з офіційного сайту.

Програма notes знаходиться тут.

Первопис програми можна знайти на github.com.

Для отримання первису виконайте наступні операції:
створіть теку, наприклад:

user@host$ mkdir notes

перейдіть до створеної теки:

user@host$ cd notes

виконайте команду:

user@host$ git clone https://github.com/wellboyvg/notes

Запустити програму можна з командного рядка:

java -jar notes.jar

Склад програми (файли обов’язкові для роботи програми):

notes/notes.jar

notes/notes.db

notes/lib/sqlitejdbc-v054.jar

notes/lib/swing-layout-1.0.3.jar

Додаткових налаштувань програма не вимагає.

Загальний вигляд записника

Функціональні можливості

– створення і зберігання нотаток;

– кожна замітка може складатися із одного-трьох елементів: заголовок, первопис, джерело;

– завантаження у якості нотатки текстового файлу;

– імпорт нотаток та словника з іншого файлу бази даних (notes.db) розташованого у теці ./impexp;

– повнотекстовий пошук у заголовку та в тексті нотатки;

– вбудований словник;

– доповнення та редагування словника;

– автоматичний пошук у словнику слова виділеного в тексті джерела;

– зображення списку знайдених варіантів перекладу з можливістю вибору необхідного результату;

– вставка результату перекладу слова в текст нотатки;

– згорнута програма зображається значком в треї;

=-=-=-=-=
Powered by Blogilo

Список ресурсів у jar-файлі

Як отримати список ресурсів у jar-файлі.

варіант: 1

      String jarPath = "filename.jar";
      JarFile jar = new JarFile(URLDecoder.decode(jarPath, "UTF-8"));
      Enumeration<JarEntry> entries = jar.entries();
      while(entries.hasMoreElements()) {
        System.out.println(entries.nextElement().getName());
      }

варіант: 2

      ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
      assert classLoader != null;
      String path = "resources";
      Enumeration<URL> resources = classLoader.getResources(path);
      while (resources.hasMoreElements()) {
        URL resource = resources.nextElement();
        String[] ff = new File(resource.toURI()).list();
        for (int i=0;i<ff.length;i++)
        System.out.println(ff[i]);
      }

=-=-=-=-=
Powered by Blogilo

Кілька перевтілень StrSum()

Спробував знайти першу версію і порахувати скільки ж їх було, але безуспішно. Знайшов файлик SUMFRAZA.PRG 1996 року написаний на Clipper, та в ньому зберігся коментар з цікавим рядком "clipper sumkrb.prc". Тобто попередня версія знала карбованці. Тому, чергове, перевтілення StrSum(). Активно використовується версія на VBA для Excel. Тепер на Java.

StrSum версія Java.

StrSum версія VBA Excel.

StrSum версія Clipper.

=-=-=-=-=
Powered by Blogilo

Перевтілення StrSum: Java

StrSum версія Java

package org;

/**
 * @Створено 2011.11.02
 * @назва StrSum
 * @author vw
 *
 * застосування: System.out.println("*" + new StrSum(123.45).getStrSum() + "*");
 *
 */
public class StrSum {
  Double nsum = 0.0;

  String akop[] = {"","коп.","коп.","коп."};
  // String akop[] = {"","копійка","копійки","копійок"};
  String agrn[][] = {
    {"грн.","","","","t"},
    {"тисяч","а","i","","t"},
    {"мiльйон","","и","iв","f"},
    {"мiльярд","","и","iв","f"},
    {"трильйон","","и","iв","f"}
    // масив можна доповнити http://users.skynet.be/nizgorur/very_big_numbers.htm
  };
  //
  String adigits[][] = {
    {"","один","два","три","чотири","п'ять","шiсть","сiм","вiсiм","дев'ять",
     "десять","оди","два","три","чотир","п'ят","шiст","сiм","вiсiм","дев'ят"},
    {"двадцять","тридцять","сорок","п'ятдесят","шiстдесят","сiмдесят","вiсiмдесят","дев'яносто"},
    {"","сто","двiстi","триста","чотириста","п'ятсот","шiстсот","сiмсот","вiсiмсот","дев'ятсот"}};
  String adigitst[] = {"","одна","двi"};
  String Over10 = "надцять";
  String csum = "";

  public StrSum(Double sum) {
    //
    nsum = Math.abs(sum);
    // String ssgn = (sum < 0) ? "Мінус " : "";
    String ssum = String.valueOf(nsum).trim(); // "#################0.00"
    String nkop = ssum.substring(ssum.indexOf(".")+1); // видiляю копiйки
    String sgrn = ssum.substring(0, ssum.indexOf(".")); // видiляю гривнi
    // System.out.println(nsum);
    // System.out.println("грн.       - " + sgrn);
    // System.out.println("коп.       - " + nkop);
    // System.out.println("довжина    - " + sgrn.length());
    //
    // визначаю кiлькiсть трiад
    int ntriads = (int) Math.ceil(((double) sgrn.length())/3); // Math.round(sgrn.length()/3);
    // System.out.println("тріад      - " + ntriads);
    //
    if (Integer.valueOf(sgrn)!=0) { // є гривні?
      String s = "";
      // додати пробіли неповній т.
      for (int i=0; i<(ntriads*3 - sgrn.length()); i++) s = s + " ";
      sgrn = s + sgrn;
     // System.out.println(sgrn);
      if (ntriads <= agrn.length) {
        // Debug.Print UBound(agrn)
        String st = "";
        for (int ntriad = 0; ntriad < ntriads; ntriad++) {
          // видiляю трiаду
          int p = ntriad*3;
          st = sgrn.substring(p, p+3);
          //System.out.println("-" + st + "-");
          int r = ntriads-ntriad-1;
         // System.out.println("r: " + r + " -" + st + "-");
         // System.out.println("agrn: " + agrn[r][0]);
         // System.out.println("----: " + agrn[r][ind(Integer.valueOf(st.substring(1).trim()))]);
          csum += ("000".equals(st) ? "" : strtriad(st, agrn[r][4])) + " " +
                  agrn[r][0] + agrn[r][ind(Integer.valueOf(st.substring(1).trim()))] + " ";
        }
        // дописати назву грошової одиниці коли остання тріада '000'
        csum += ("000".equals(st) ? agrn[ntriads + 1][1] + agrn[ntriads + 1][ind(Integer.valueOf(st))] + " " : "");
        // дописати копійки
        csum += nkop + " " + akop[ind(Integer.valueOf(nkop))];
      }
    } else { csum = "дуже багато гривень"; }
    // csum = sgrn + "-" + nkop;    
  }

  public String getStrSum() {
    return csum;
  }

  private String strtriad(String st, String ltriad) {
    //     st: тріада
    // ltriad: .f. тріада чоловічого роду, .t. тріада жіночого роду
    // return: тріада словами

    int digit, t;
    String c = "";
    t = Integer.valueOf(st.trim());
    // Debug.Print "stt st,t,c  —"; st, t, c
    if (t > 99) {
       digit = (int) t / 100;
       c = adigits[2][digit] + " "; // [3][digit + 1]
       t = t % 100; // t%
    }
    // Debug.Print "stt t,c  —"; t, c
    if (t > 19) {
       digit = (int) t / 10;
       c = c + adigits[1][digit - 2] + " "; // [2][digit - 1]
       t = t % 10; //            ' t%
    }
    // Debug.Print "stt t,c  —"; t, c
    if ("t".equals(ltriad) & t < 3) {      // трiада ж. роду
       c = c + adigitst[t];
    } else {
       c = c + adigits[0][t] + (t > 10 ? Over10 : "");
    }
    // Debug.Print "==", t, c
    return c;
  }

  private int ind(int n) {
    //  in: n - число                 // n - цiле число<20
    // out: iндекс закiнчення
    int i = n < 20 ? n : (n % 10);
    int x = i == 1 ? 1 : ((i >= 2) & (i <= 4)) ? 2 : 3;
    return x;
  }
}

=-=-=-=-=
Powered by Blogilo