Модераторы: LSD, AntonSaburov

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Маленькие классы, Помощники 
:(
    Опции темы
sergejzr
Дата 6.1.2006, 15:38 (ссылка) |    (голосов:7) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 6
Всего: 360



 Вот подумал, все мы пишем таких помощников каждый день заного. Почему бу не собирать их здесь. Критерий? Скажем максимум 5 функций на класс + main для тестов. 
Если идея покажется бредовой - сорри smile Просто на прктике чаще всего "ре-юзаются" минимальные компоненты
Этот класс генерирует пароли, состоящие только из букв и цифр.
Код

package repository;

import java.util.Random;
/**
 * @author http://vingrad.ru/@sergej.z
 * Generator of human readable passwords.
 * Examples:
 * 11wzG9V, Hp6cE, yI0GL, LMIojMQ
 */
public class PasswordGenerator {
/**
 * Generated password consists only of letters and/or numbers.
 * Ex: 6n3k0ZjY
 * Генерирует читаемый пароль, состоящий только из букв и цифр
 * @param from : minimum letters
 * @param to : maximum letters
 * @return Password of length to-from letters
 */
public static String generate(int from, int to)
{
    String pass="";
    Random ran = new Random();
    int cntchars = from + ran.nextInt(to - from+1);
    
    for (int i = 0; i < cntchars; i++) {
        char next=0;
        int range=10;
        switch(ran.nextInt(3))
        {
        case 0:{next='0';range=10;}break;
        case 1:{next='a';range=26;}break;
        case 2:{next='A';range=26;}break;
        }
        pass+=(char)((ran.nextInt(range))+next);
    }
    return pass;
}
public static void main(String argv[])
{
    //сгенерирует пароль от 5 - 10 знаков
    String t=generate(5,10);
    System.out.println(t);
}
}
 


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
chief39
Дата 6.1.2006, 16:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


карманная тигра
***


Профиль
Группа: Участник Клуба
Сообщений: 1631
Регистрация: 20.5.2005
Где: Киев

Репутация: 15
Всего: 77



Обеими ногами - ЗА!
Только предлагаю сделать отдельный раздел.
Классы закидывать в отдельную спец. тему и описывать что это и зачем он.

А модераторы, после рассмотрения, выносят вердикт в какой подраздел его кинуть. Добавить в "ВАЖНО" темку с набором упорядоченных решений(сырцов). Ну и отдельно ещё дерево всего накопленного устроить.
Распихивать их по пакетам ru.vingrad.utils.text, ru.vingrad.swing.tree и т.п.
В итоге будет виноградная библиотека smile Свободная для скачивания и доступная виноградарям и прочим земледельцам.
А?


--------------------
Люди - это свечи. Они либо горят, либо их - в жопу!(с)

PM MAIL   Вверх
Exception
Дата 6.1.2006, 19:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 4525
Регистрация: 26.12.2004

Репутация: нет
Всего: 186



Интересно. Java Vingrad Framework? smile
PM   Вверх
sergejzr
Дата 6.1.2006, 19:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 6
Всего: 360



Идея ИМХО хорошая. Слово за модераторами раздела smile


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
Guest
Дата 7.1.2006, 15:58 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











А тут www.codezoo.com и тут freewarejava.com/applets/index.shtml этого нет?
  Вверх
Mayk
Дата 7.1.2006, 17:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: нет
Всего: 134



Цитата(sergej.z @ 6.1.2006, 23:41 Найти цитируемый пост)

Идея ИМХО хорошая. Слово за модераторами раздела

+1

Цитата(Guest @ 7.1.2006, 19:58 Найти цитируемый пост)

А тут www.codezoo.com и тут freewarejava.com/applets/index.shtml этого нет?

Вы еще self.brain.applets и self.hands.classes.generators вспомните.



--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
batigoal
Дата 7.1.2006, 20:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нелетучий Мыш
****


Профиль
Группа: Участник Клуба
Сообщений: 6423
Регистрация: 28.12.2004
Где: Санктъ-Петербургъ

Репутация: 24
Всего: 151



Модераторы воспринимают идею с восторгом smile
...однако, к сожалению, не имеют сейчас времени ею заниматься smile
Поэтому ждем инициативы от вас. Если идея пойдет - будем делать отдельный раздел, или вообще оформлять отдельным винградным проектом.

Я завтра закреплю тему с соответствующим предложением-обращением к участникам форума. Ну а наполняемость зависит только от нас.


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
Guest
Дата 7.1.2006, 20:58 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











А это не подойдет?
  Вверх
Exception
Дата 7.1.2006, 21:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 4525
Регистрация: 26.12.2004

Репутация: нет
Всего: 186



Guest, ты кажется вообще не въехал. Вопрос состоит в создании своей библиотеки.
PM   Вверх
Guest
Дата 8.1.2006, 20:45 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Exception
Но если уже есть такой же класс в свободном доступе, зачем выдумывать свой? Не проще ли взять готовый?

Я не против библиотеки тех классов, которых еще нет в свободном доступе, или например русскоязычноспецифичных.
  Вверх
Lеstat
Дата 9.1.2006, 23:35 (ссылка) |  (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 76
Регистрация: 28.12.2005
Где: Москва

Репутация: нет
Всего: нет



Guest, не... свое оно лучше!!! русские доки будут =) мессаги на форуме по которым понятно что для чего
кстати, нету ни у кого маленького класса, который файлы с настройками читает
ну что-то типа

Код

host=localhost
port=8000
login=user
password=pass

и тд
PM MAIL ICQ   Вверх
LSD
Дата 9.1.2006, 23:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15708
Регистрация: 24.3.2004

Репутация: 209
Всего: 537



Цитата(Guest @ 8.1.2006, 20:45 Найти цитируемый пост)

Но если уже есть такой же класс в свободном доступе, зачем выдумывать свой? Не проще ли взять готовый?

1. Искать надо.
2. Всегда можно спросить автора, что да как.
3. Лицензирование.
4. А почему бы и нет smile


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
chief39
Дата 10.1.2006, 11:44 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


карманная тигра
***


Профиль
Группа: Участник Клуба
Сообщений: 1631
Регистрация: 20.5.2005
Где: Киев

Репутация: 15
Всего: 77



Lеstat, Такое в дждка есть :

Код

import java.util.Properties;
import java.util.Enumeration;
import java.io.*;

public class Test {

    public static void main(String[] args) {
        try{            
            Properties prop = new Properties();
            FileInputStream fin = new FileInputStream("prop.txt");
            prop.load(fin);

            Enumeration enum = prop.propertyNames();

            // весь список
            while(enum.hasMoreElements()){
                System.out.println(enum.nextElement());
            }
            // значение конкретного
            System.out.println("aaa=" + prop.getProperty("aaa") );

        }catch(IOException ioe){
            System.out.println("Лажа вышла :(((");
        }
    }
}



Дждка всем винградом переписывать - времени на работу не останется smile



--------------------
Люди - это свечи. Они либо горят, либо их - в жопу!(с)

PM MAIL   Вверх
3,14
Дата 10.1.2006, 13:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1614
Регистрация: 18.6.2004
Где: Н. Новгород

Репутация: 6
Всего: 24



Класс для распечатки стэк трейсов:

Код

import java.io.*;

/**    
 * @author http://vingrad.ru/@3,14    
 * Class prints statck trace. 
 * Insert the call of class methods in to the place where you want to get
 * stack trace :)
 */
public class StackTrace
{
    protected static String message = "Printing stack trace";

    public static void printTrace(OutputStream out)
    {
        new Exception(message).printStackTrace(new PrintWriter(out, true));
    }

    public static void printTrace(File out) throws java.io.FileNotFoundException
    {
        new Exception(message).printStackTrace(new PrintWriter(new FileOutputStream(out), true));
    }

    public static void printTrace(File out, boolean append) throws java.io.FileNotFoundException
    {
        new Exception(message).printStackTrace(new PrintWriter(new FileOutputStream(out, append), true));
    }

    public static void printTrace()
    {
        new Exception(message).printStackTrace(new PrintWriter(System.out, true));
    }
}



--------------------
Может быть, это только мой бред,
Может быть, жизнь не так хороша,
Может быть, я не выйду на свет,
Но я летал, когда пела душа...
PM MAIL   Вверх
LSD
Дата 10.1.2006, 14:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15708
Регистрация: 24.3.2004

Репутация: 209
Всего: 537



А закрыть файлы?


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
3,14
Дата 10.1.2006, 14:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1614
Регистрация: 18.6.2004
Где: Н. Новгород

Репутация: 6
Всего: 24



LSD, не согласен что файлы должны закрываться в этом классе, ибо в нём они не открываются.


--------------------
Может быть, это только мой бред,
Может быть, жизнь не так хороша,
Может быть, я не выйду на свет,
Но я летал, когда пела душа...
PM MAIL   Вверх
LSD
Дата 10.1.2006, 15:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15708
Регистрация: 24.3.2004

Репутация: 209
Всего: 537



Цитата(3 @ 14, 10.1.2006, 14:27 Найти цитируемый пост)
LSD, не согласен что файлы должны закрываться в этом классе, ибо в нём они не открываются.

А это?
Код
new Exception(message).printStackTrace(new PrintWriter(new FileOutputStream(out), true));



--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
3,14
Дата 10.1.2006, 15:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1614
Регистрация: 18.6.2004
Где: Н. Новгород

Репутация: 6
Всего: 24



Подожди, по-моему создание FileOutputStream не открывает файл, файл уже передаётся в ф-ию открытым, или я что-то путаю?

Это сообщение отредактировал(а) 3,14 - 10.1.2006, 15:13


--------------------
Может быть, это только мой бред,
Может быть, жизнь не так хороша,
Может быть, я не выйду на свет,
Но я летал, когда пела душа...
PM MAIL   Вверх
LSD
Дата 10.1.2006, 15:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15708
Регистрация: 24.3.2004

Репутация: 209
Всего: 537



FileOutputStream открывается именно при создании, у него же нет специальных методов для открытия, только для закрытия. И вообще, раз ты пишешь в него StackTrace, то он же должен быть открыт.
Добавлено @ 15:19
А File, это просто указатель на файл, он не открывает файл. Сам файл может и не существовать.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
3,14
Дата 11.1.2006, 13:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1614
Регистрация: 18.6.2004
Где: Н. Новгород

Репутация: 6
Всего: 24



Не знал, тогда вот поправленный вариант:

Код

import java.io.*;

/**    
 * @author http://vingrad.ru/@3,14    
 * Class prints statck trace. 
 * Insert the call of class methods in to the place where you want to get
 * stack trace :)
 */
public class StackTrace
{
    protected static String message = "Printing stack trace";

    public static void printTrace(OutputStream out)
    {
        new Exception(message).printStackTrace(new PrintWriter(out, true));
    }

    public static void printTrace(File out) throws java.io.FileNotFoundException, java.io.IOException
    {
        OutputStream outputStream = new FileOutputStream(out);
        new Exception(message).printStackTrace(new PrintWriter(outputStream, true));
        outputStream.close();
    }

    public static void printTrace(File out, boolean append) throws java.io.FileNotFoundException, java.io.IOException
    {
        OutputStream outputStream = new FileOutputStream(out, append);
        new Exception(message).printStackTrace(new PrintWriter(outputStream, true));
        outputStream.close();
    }

    public static void printTrace()
    {
        new Exception(message).printStackTrace(new PrintWriter(System.out, true));
    }
}


Это сообщение отредактировал(а) 3,14 - 17.1.2006, 10:52


--------------------
Может быть, это только мой бред,
Может быть, жизнь не так хороша,
Может быть, я не выйду на свет,
Но я летал, когда пела душа...
PM MAIL   Вверх
chief39
Дата 14.1.2006, 15:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


карманная тигра
***


Профиль
Группа: Участник Клуба
Сообщений: 1631
Регистрация: 20.5.2005
Где: Киев

Репутация: 15
Всего: 77



Цитата(Lamer George @ 7.1.2006, 20:35 Найти цитируемый пост)

Я завтра закреплю тему с соответствующим предложением-обращением к участникам форума. Ну а наполняемость зависит только от нас.

Ииии??? ;) Напоминаю, ибо скоро тема уползёт далеко вниз и уже никто не вспомнит smile



--------------------
Люди - это свечи. Они либо горят, либо их - в жопу!(с)

PM MAIL   Вверх
Domestic Cat
Дата 14.1.2006, 15:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 50
Всего: 172



Цитата(chief39 @ 14.1.2006, 06:04 Найти цитируемый пост)

Ииии??? ;) Напоминаю, ибо скоро тема уползёт далеко вниз и уже никто не вспомнит smile

Закрепил.


--------------------

PM   Вверх
batigoal
Дата 14.1.2006, 20:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нелетучий Мыш
****


Профиль
Группа: Участник Клуба
Сообщений: 6423
Регистрация: 28.12.2004
Где: Санктъ-Петербургъ

Репутация: 24
Всего: 151



Да я помню все, расслабьтесь smile

Просто есть сразу несколько новостей, Я их скопом проанонсирую. Да и эту тему немного реорганизуем. Лучше делать так, как Доместик делал с паттернами - в одном (закрытом) топике материал, в другом - обсуждение.


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
Guest
Дата 15.1.2006, 15:55 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Цитата(LSD @ 9.1.2006, 23:41)
1. Искать надо.
2. Всегда можно спросить автора, что да как.

1. А здесь, на форуме, что искать не придется?

2. Ага, щаз, автор отдал класс, дописал проект, потом свалил на другой форум и спросишь ты его. Лучше заставлять подробно комментить код перед приемом его в библиотеку
  Вверх
Guest
Дата 15.1.2006, 15:57 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Ну вот. И как теперь в этой теме что-то путнее найти? Если сползли на обсуждение закрытия файлов, то непонятно, какая же версия класса последняя и правильная
  Вверх
3,14
Дата 16.1.2006, 12:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1614
Регистрация: 18.6.2004
Где: Н. Новгород

Репутация: 6
Всего: 24



Цитата(Guest @ 15.1.2006, 15:57 Найти цитируемый пост)

Если сползли на обсуждение закрытия файлов, то непонятно, какая же версия класса последняя и правильная

Guest, их всего 2, последняя и есть правильная smile


--------------------
Может быть, это только мой бред,
Может быть, жизнь не так хороша,
Может быть, я не выйду на свет,
Но я летал, когда пела душа...
PM MAIL   Вверх
sergejzr
Дата 16.1.2006, 16:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 6
Всего: 360



Набер
Цитата(Guest @ 15.1.2006, 13:57 Найти цитируемый пост)

Ну вот. И как теперь в этой теме что-то путнее найти? Если сползли на обсуждение закрытия файлов, то непонятно, какая же версия класса последняя и правильная

Не расстраивайся. Пока проект в стадии разработки - это всегда так. Соберунтся ещё пара-тройка классов, модераторы подчистят топик, и буде всё пучком. На то он и форум, чтобы обсуждать. smile


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
Guest
Дата 16.1.2006, 21:28 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Тогда предлагаю обсуждать каждый "маленький класс" в своей ветке, а эту сделать рид-онли и складывать в нее готовые версии
  Вверх
batigoal
Дата 16.1.2006, 22:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нелетучий Мыш
****


Профиль
Группа: Участник Клуба
Сообщений: 6423
Регистрация: 28.12.2004
Где: Санктъ-Петербургъ

Репутация: 24
Всего: 151



Имменно так и будет сделано. Как только на работе чуть-чуть снизится давление...


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
Zandr
Дата 17.1.2006, 11:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 433
Регистрация: 16.7.2004
Где: Новосибирск

Репутация: 9
Всего: 13



По поводу закрытия файла... Наши американские коллеги писали что-то типа:
Код

try {
    File myFile = new File("....");
} catch (Exception e) {
    System.out.println("File doesn't exists");
}

Писец, и они ведь за это деньги получают...
По поводу комментов на русском языке... Нет комментов. Лично я против. Комменты на русском делайте к 1С Бухгалтерии.
Ну а по существу... Метод хорошо применять к пользовательскому вводу. Он тримает пробельные символы в начале и в конце строки (это и String класс умеет), плюс ко всему заменяет дублирующиеся пробельные символы одиночным пробелом. Немного противоречит Java CodeStyle guidlines, не обессутте.
Код

    public static String normalizeWhitespaces(String s) {
        char c;
        boolean needSpace = false;
        int index = 0, length = s.length();
        StringBuffer normalized = new StringBuffer(length);
        while (index < length && Character.isWhitespace(normalized.charAt(index))) {
            index++;
        }
        while (index < length) {
            if (Character.isWhitespace(c = s.charAt(index++))) {
                needSpace = true;
            } else {
                if (needSpace) {
                    needSpace = false;
                    normalized.append(' ');
                }
                normalized.append(c);
            }
        }
        return normalized.toString();
    }

PM MAIL   Вверх
LSD
Дата 17.1.2006, 13:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15708
Регистрация: 24.3.2004

Репутация: 209
Всего: 537



Цитата(Zandr @ 17.1.2006, 11:57 Найти цитируемый пост)
По поводу комментов на русском языке... Нет комментов. Лично я против. Комменты на русском делайте к 1С Бухгалтерии.

Спокуха, без фанатизма smile
Я сам на работе бьюсь, за то чтобы коментарии к коду писались по английски (но меня все игнорируют). Но тут проблема вот в чем, мы русскоязычный форум, мы статьи в FAQ пишем по русски, мы в топиках отвечаем тоже по русски (что у нас бывает за транслит ты знаешь). Да многие из нас могут читать док на английском, так же легко как и на русском.
Но новички не могут. И многие просто не станут пользоваться этими классами, или продолжат задавать вопросы, просто потому, что не поняли комменариев.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
chief39
Дата 17.1.2006, 14:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


карманная тигра
***


Профиль
Группа: Участник Клуба
Сообщений: 1631
Регистрация: 20.5.2005
Где: Киев

Репутация: 15
Всего: 77



Цитата(LSD @ 17.1.2006, 13:19 Найти цитируемый пост)

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

Джавадок - инглиш
+ перевод на русский отдельно( ой как лень всем будет... smile )
И отдельный счётчик под репутацией - опубликованное(факи/статьи/сорцы)
(Если кто реализует smile )

Lamer George и иже с ним(вобщем, кто баги форума устранял) - сенки за нормальное отображение и функциональность в ФФ smile



--------------------
Люди - это свечи. Они либо горят, либо их - в жопу!(с)

PM MAIL   Вверх
batigoal
Дата 17.1.2006, 15:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нелетучий Мыш
****


Профиль
Группа: Участник Клуба
Сообщений: 6423
Регистрация: 28.12.2004
Где: Санктъ-Петербургъ

Репутация: 24
Всего: 151



Цитата(chief39 @ 17.1.2006, 15:49 Найти цитируемый пост)

И отдельный счётчик под репутацией - опубликованное(факи/статьи/сорцы)

Имхо, рано пока. Репутации достаточно.

Цитата(chief39 @ 17.1.2006, 15:49 Найти цитируемый пост)

Lamer George и иже с ним(вобщем, кто баги форума устранял) - сенки

Я тут не причем, там ПХПисты и веб-мастера в основном работают.


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
LSD
Дата 17.1.2006, 17:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15708
Регистрация: 24.3.2004

Репутация: 209
Всего: 537



Итак предлагаю рыбу, для оформления классов.
====================8<==============================8<====================
Название: Генератор паролей
Тип: автономное приложение/библиотека
Язык: Java
Версия: 2.0
Версия JDK: 1.5
Требуемые библиотеки: нет
Автор: LSD
Примечания: код оформлен с использованием синтаксиса 1.5, но допускает переделку под более ранни версии JDK, вплоть до 1.1

1. Описание класса(ов)

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

Для запуска класса в версиях JDK ранее 1.5 надо:
  • заменить везде char[] ... characters на char[][] characters
  • заменить везде StringBuilder на StringBuffer
  • заменить ArrayList<char[]> list = new ArrayList<char[]>() на ArrayList list = new ArrayList(), PasswordGenerator pg = new PasswordGenerator(length, list.toArray(new char[list.size()][])) на PasswordGenerator pg = new PasswordGenerator(length, (char[][]) list.toArray(new char[list.size()][]))
  • для JDK ранее 1.2, в предыдущем пункте вместо ArrayList использовать Vector
2. Рекомендации по использованию, примеры

Класс рекомендуется к использованию, везде где надо задавать пароль пользователя. Лучше мы ему сгенерируем пароль, чем он нам введет qwerty или 123456 smile

Пример использования класса: сгенерируем два пароля. Простой 8 символов, только строчные латинские буквы. И сложный 16 символов, цифры, латинские буквы в нижнем и верхнем регистре.
Код
PasswordGenerator passGen = new PasswordGenerator(8, PasswordGenerator.LATIN_LOWERCASE);
String simplePassword = passGen.generateAsString();
passGen.setLength(16);
passGen.setSymbols(PasswordGenerator.LATIN_LOWERCASE, PasswordGenerator.LATIN_UPPERCASE, PasswordGenerator.DIGITS);
String complexPassword = passGen.generateAsString();


Пример использования из командной строки: сгенерируем 3 пароля длинны 8 состоящие из заглавных латинских букв и цифр.
Код
java PasswordGenerator -Cud -L8 -N3


3. Код, руководство по сборке

Код
/*
Password generator - class for generating passwords
Copyright (C) 2006 LSD

<здесь будет копилефт>

Vingrad Programmers Forum
WEB: http://forum.vingrad.ru/
e-mail: lsd (гав) vingrad.ru
*/
package ru.vingrad.utils;

import java.util.ArrayList;
import java.util.Random;

/**
 * Класс предназначенный для генерации паролей, указанной длинны и набором символов.
 * В классе реализован метод main(), чтобы его можно было использовать как утилиту
 * командной строки. Класс не потокобезопасный, при использовании в многопоточном
 * приложении, требуется внешняя синхронизация.
 */
public class PasswordGenerator
{
  /**
   * Предопределенная костанта для заглавных латинских букв
   */
  public static final char[] LATIN_UPPERCASE =
      {'A' , 'B' , 'C' , 'D' , 'E' , 'F' , 'G' , 'H' , 'I' , 'J' , 'K' , 'L' , 'M' ,
       'N' , 'O' , 'P' , 'Q' , 'R' , 'S' , 'T' , 'U' , 'V' , 'W' , 'X' , 'Y' , 'Z'};

  /**
   * Предопределенная костанта для строчных латинских букв
   */
  public static final char[] LATIN_LOWERCASE =
      {'a' , 'b' , 'c' , 'd' , 'e' , 'f' , 'g' , 'h' , 'i' , 'j' , 'k' , 'l' , 'm' ,
       'n' , 'o' , 'p' , 'q' , 'r' , 's' , 't' , 'u' , 'v' , 'w' , 'x' , 'y' , 'z'};

  /**
   * Предопределенная костанта для арабских цифр
   */
  public static final char[] DIGITS =
      {'0' , '1' , '2' , '3' , '4' , '5' , '6' , '7' , '8' , '9'};

  /**
   * Предопределенная костанта для спецсимволов
   */
  public static final char[] SYMBOLS =
      {'!' , '@' , '#' , '$' , '%' , '^' , '&' , '*' , '(' , ')' , '_' , '+' , '-' , '=' , '[' ,
       ']' , '{' , '}' , ';' , '\'' , ':' , '"' , ',' , '.' , '/' , '<' , '>' , '?' , '`' , '~'};

  /**
   * Массив содержащий множество символов из которых генерируется пароль
   */
  private char[] symbols;
  /**
   * Генератор случайных чисел
   */
  private Random rnd;
  /**
   * Длянна пароля
   */
  private int length;

  /**
   * Коструктор класса принимает в качестве аргумента длянну пароля и список массивов char[]
   * с набором символов для генерации пароля. Проверка на дублирование символов не производится.
   *
   * @param length     длинна пароля, должна быть больше нуля
   * @param characters список массивов char[] используемых для генерации пароля
   * @throws IllegalArgumentException если длинна отрицательная или ноль, или входное множество
   *                                  символов пустое
   */
  public PasswordGenerator(int length, char[] ... characters)
  {
    setLength(length);
    rnd = new Random();
    setSymbols(characters);
  }

  /**
   * Получить текущую длинну пароля используемую для генерации.
   *
   * @return длинна пароля
   */
  public int getLength()
  {
    return length;
  }

  /**
   * Установить текущую длинну пароля. Новые пароли будут указанной длинны.
   *
   * @param length
   * @throws IllegalArgumentException если длинна отряцательная или ноль
   */
  public void setLength(int length)
  {
    if(length <= 0)
      throw new IllegalArgumentException("Length mast be > 0");
    this.length = length;
  }

  /**
   * Возвращает набор символов используемых для генерации пароля.
   * @return массив содержащий символы используемые для генерации пароля
   */
  public char[] getSymbols()
  {
    return symbols;
  }

  /**
   * Задает набор символов используемых для генерации пароля.
   * @param characters список массиво символов
   * @throws IllegalArgumentException если результирующее множество символов пустое
   */
  public void setSymbols(char[] ... characters)
  {
    int i = 0;
    for(char[] ch : characters)
      i += ch.length;
    if(i <= 0)
      throw new IllegalArgumentException("Empty character set");
    symbols = new char[i];
    i = 0;
    for(char[] ch : characters)
    {
      System.arraycopy(ch, 0, symbols, i, ch.length);
      i += ch.length;
    }
  }

  /**
   * Сгенерировать новый пароль, в виде String.
   *
   * @return новый пароль
   */
  public String generateAsString()
  {
    StringBuilder buffer = new StringBuilder(length);
    for(int i = 0; i < length ; i++)
      buffer.append(symbols[rnd.nextInt(symbols.length)]);
    return buffer.toString();
  }

  /**
   * Сгенерировать новый пароль, в виде char[].
   *
   * @return новый пароль
   */
  public char[] generateAsCharArray()
  {
    char[] buffer = new char[length];
    for(int i = 0; i < length ; i++)
      buffer[i] = symbols[rnd.nextInt(symbols.length)];
    return buffer;
  }

  /**
   * Метод для генерации паролей из командной строки. Способ запуска:
   * java PasswordGenerator <ключи>
   * Где ключи:
   * <p/>
   * -C<символы> - задает использкемое множество символов
   * <символы> любой набор из:
   * L - латиница, нижний регистр
   * U - латиница, верхний регистр
   * D - цифры
   * S - спецсимволы
   * <p/>
   * -N<число> - задает количество генерируемых паролей
   * <p/>
   * -L<число> - задает длинну генерируемых паролей
   * <p/>
   * Все параметры не регистрозависимые, если како-то параметр опущен, то используется значение
   * по умолчанию. По умолчанию генерируется один пароль, состоящий из строчных латинских букв и
   * цифр, длинной 10 символов.
   *
   * @param args параметры запуска
   */
  public static void main(String[] args)
  {
    boolean useUppercase = false;
    boolean useLowercase = true;
    boolean useDigits = true;
    boolean useSymbols = false;
    int length = 10;
    int num = 1;
    for(String arg : args)
    {
      String larg = arg.toLowerCase();
      if(larg.startsWith("-c"))
      {
        useUppercase = larg.indexOf('u') != -1;
        useLowercase = larg.indexOf('l') != -1;
        useDigits = larg.indexOf('d') != -1;
        useSymbols = larg.indexOf('s') != -1;
      }
      else if(larg.startsWith("-n"))
      {
        try
        {
          num = Integer.parseInt(arg.substring(2));
          if(num < 0)
          {
            System.err.println("Invalid passwords count: " + num);
            System.exit(3);
          }
        }
        catch(NumberFormatException e)
        {
          System.err.println("Invalid number format '" + arg + "'");
          System.exit(2);
        }
      }
      else if(larg.startsWith("-l"))
      {
        try
        {
          length = Integer.parseInt(arg.substring(2));
          if(length <= 0)
          {
            System.err.println("Invalid password length: " + length);
            System.exit(3);
          }
        }
        catch(NumberFormatException e)
        {
          System.err.println("Invalid number format '" + arg + "'");
          System.exit(2);
        }
      }
      else
      {
        System.err.println("Unknown command line switch '" + arg + "'");
        System.exit(1);
      }
    }
    ArrayList<char[]> list = new ArrayList<char[]>();

    if(useUppercase)
      list.add(LATIN_UPPERCASE);
    if(useLowercase)
      list.add(LATIN_LOWERCASE);
    if(useDigits)
      list.add(DIGITS);
    if(useSymbols)
      list.add(SYMBOLS);

    PasswordGenerator pg = new PasswordGenerator(length, list.toArray(new char[list.size()][]));
    for(int i = 0; i < num ; i++)
      System.out.println(pg.generateAsString());
  }
}

====================8<==============================8<====================
Думаю заголовок надо жестко задать, и обязать всех к его обязательному заполнению. Только надо продумать его структуру.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
batigoal
Дата 17.1.2006, 17:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нелетучий Мыш
****


Профиль
Группа: Участник Клуба
Сообщений: 6423
Регистрация: 28.12.2004
Где: Санктъ-Петербургъ

Репутация: 24
Всего: 151



Цитата(LSD @ 17.1.2006, 18:35 Найти цитируемый пост)

Версия: 2.0

Имхо, лишнее. Понадобится только в случае расширения на другие языки или, скажем, при указании версии ant, если это будет build.xml.

Многие ли будут задумываться об инструкции для даунгрейда под старые версии?

Это сообщение отредактировал(а) Lamer George - 17.1.2006, 17:48


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
LSD
Дата 17.1.2006, 18:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15708
Регистрация: 24.3.2004

Репутация: 209
Всего: 537



Цитата(Lamer George @ 17.1.2006, 17:42 Найти цитируемый пост)
Имхо, лишнее. Понадобится только в случае расширения на другие языки или, скажем, при указании версии ant, если это будет build.xml.

Я его 2 раза переписывал, а об этом никто не узнает smile
Вдруг мы захотим хранить 2 версии, старую и доработанную (например выйдет Mustang и мы захотим доработать класс под него)?

Цитата(Lamer George @ 17.1.2006, 17:42 Найти цитируемый пост)
Многие ли будут задумываться об инструкции для даунгрейда под старые версии?

Не знаю, но я периодически получаю пинки из-за того что пишу под 1.5, т.к. основной сервак у нас под 1.4, поэтому и написал. Но если не актуально можно удалить.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
chief39
Дата 17.1.2006, 19:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


карманная тигра
***


Профиль
Группа: Участник Клуба
Сообщений: 1631
Регистрация: 20.5.2005
Где: Киев

Репутация: 15
Всего: 77



LSD, джавадок в англ. может всётки? smile
+ русский ещё куда-нить впихнуть smile

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

Цитата(LSD @ 17.1.2006, 17:35 Найти цитируемый пост)

Версия: 2.0

ЗЫ! А ЦВС-сервер не того... не получится? smile
Хотя, наверное, не сейчас. Сначала понаписывать надо smile



--------------------
Люди - это свечи. Они либо горят, либо их - в жопу!(с)

PM MAIL   Вверх
LSD
Дата 17.1.2006, 19:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15708
Регистрация: 24.3.2004

Репутация: 209
Всего: 537



Цитата(chief39 @ 17.1.2006, 19:02 Найти цитируемый пост)
LSD, джавадок в англ. может всётки?

Легко, если кто нибудь это потом переведет на русский.

Цитата(chief39 @ 17.1.2006, 19:02 Найти цитируемый пост)
И это... когда писать будете свои классы...

Что значит будете, а ты сам что не участвуешь? smile


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
chief39
Дата 17.1.2006, 21:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


карманная тигра
***


Профиль
Группа: Участник Клуба
Сообщений: 1631
Регистрация: 20.5.2005
Где: Киев

Репутация: 15
Всего: 77



Цитата(LSD @ 17.1.2006, 19:14 Найти цитируемый пост)

Легко, если кто нибудь это потом переведет на русский.

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

Цитата(LSD @ 17.1.2006, 19:14 Найти цитируемый пост)

Что значит будете, а ты сам что не участвуешь?

Буду-буду. Только разгружусь немножно. Исп. срок закончится, москвичам вета-верс отдадим - и сразу руки ослобонятся.
Я к тому чтоб все не забывали. Гораздо приятнее код читать. И понятнее. А иногда без таких комментов и не понять smile






--------------------
Люди - это свечи. Они либо горят, либо их - в жопу!(с)

PM MAIL   Вверх
Stampede
Дата 17.1.2006, 21:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гносеолог
**


Профиль
Группа: Участник Клуба
Сообщений: 963
Регистрация: 25.4.2005
Где: Calgary, Alberta, Canada

Репутация: 24
Всего: 144



Цитата(Zandr @ 17.1.2006, 11:57 Найти цитируемый пост)

По поводу закрытия файла... Наши американские коллеги писали что-то типа:


А мои американские коллеги писали еще круче:

Код

public String getName() {
    /* Returns the name property value. */
    if (fieldName == null) {
        try {
            fieldName = new String();
        } catch (Throwable exception) {
            System.err.println("Exception creating name property.");
        }
    };
    return fieldName;
}


И ведь тоже деньги получают, что характерно smile

PM WWW   Вверх
Stampede
Дата 17.1.2006, 21:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гносеолог
**


Профиль
Группа: Участник Клуба
Сообщений: 963
Регистрация: 25.4.2005
Где: Calgary, Alberta, Canada

Репутация: 24
Всего: 144



LSD, молодец, все грамотно и пр., но у меня один вопрос:

Цитата(LSD @ 17.1.2006, 17:35 Найти цитируемый пост)

Код

     buffer.append(symbols[(int) (rnd.nextDouble() * symbols.length)]);



Зачем было делать промежуточные преобразования с double, когда можно было просто написать:

Код

     buffer.append(symbols[rnd.nextInt(len)]);


Ведь специально же в API предусмотрели такой метод:

Цитата

nextInt(int n)
          Returns a pseudorandom, uniformly distributed int value between 0 (inclusive) and the specified value (exclusive), drawn from this random number generator's sequence.

PM WWW   Вверх
LSD
Дата 18.1.2006, 00:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15708
Регистрация: 24.3.2004

Репутация: 209
Всего: 537



Цитата(Stampede @ 17.1.2006, 21:50 Найти цитируемый пост)
LSD, молодец, все грамотно и пр., но у меня один вопрос:
...

Эээ...
Ну как бы тебе объяснить, дело в том что я этот метод не замечал просто. И все время удивлялся, почему его не предусмотрели.
Вообщем спасибо, что открыл глаза smile
Добавлено @ 00:31
Кстати, давайте пока не будем сильно увлекаться обсуждением классов. Лучше подумать над предложениями по поводу организации, этой подборки классов. Что стоит добавить, что удалить, правила оформления и т.д.

P.S. а если хотите посмеяться над ляпами программистов, зайдите в эту тему.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Stampede
Дата 18.1.2006, 01:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гносеолог
**


Профиль
Группа: Участник Клуба
Сообщений: 963
Регистрация: 25.4.2005
Где: Calgary, Alberta, Canada

Репутация: 24
Всего: 144



Цитата(LSD @ 18.1.2006, 00:18 Найти цитируемый пост)

Вообщем спасибо, что открыл глаза


Я сам не так давно узнал об этом из книжки Блоха "Effective Java":

Цитата

109
Item 30: Know and use the libraries

Suppose you want to generate random integers between 0 and some upper bound. Faced with
this common task, many programmers would write a little method that looks something like
this:

Код

static Random rnd = new Random();
// Common but flawed!
static int random(int n) {
return Math.abs(rnd.nextInt()) % n;
}


This method isn't bad, but it isn't perfect, either—it has three flaws. The first flaw is that if n is
a small power of two, the sequence of random numbers it generates will repeat itself after
a fairly short period. The second flaw is that if n is not a power of two, some numbers will, on
average, be returned more frequently than others. If n is large, this flaw can be quite
pronounced. This is graphically demonstrated by the following program, which generates
a million random numbers in a carefully chosen range and then prints out how many of
the numbers fell in the lower half of the range:

Код

public static void main(String[] args) {
int n = 2 * (Integer.MAX_VALUE / 3);
int low = 0;
for (int i = 0; i < 1000000; i++)
if (random(n) < n/2)
low++;
System.out.println(low);
}


If the random method worked properly, the program would print a number close to half
a million, but if you run it, you'll find that it prints a number close to 666,666. Two thirds of
the numbers generated by the random method fall in the lower half of its range!

The third flaw in the random method is that it can, on rare occasion, fail catastrophically,
returning a number outside the specified range. This is so because the method attempts to map
the value returned by rnd.nextInt() into a nonnegative integer with Math.abs. If
nextInt() returns Integer.MIN_VALUE, Math.abs will also return Integer.MIN_VALUE, and
the remainder operator (%) will return a negative number, assuming n is not a power of two.
This will almost certainly cause your program to fail, and the failure may be difficult to
reproduce.

To write a version of random that corrects these three flaws, you'd have to know a fair amount
about linear congruential pseudorandom number generators, number theory, and two's
complement arithmetic. Luckily, you don't have to do this—it's already been done for you. It's
called Random.nextInt(int), and it was added to the standard library package java.util in
release 1.2.


Вообще, очень правильная книжка, абсолютно обязательная для любого, кто пишет APIs. И как я раньше о ней не знал?

ЗЫ. Выложу-ка я ее ненадолго. Авось, моего трафика сильно не убудет. Через недельку уберу. Качать отсюда: http://real-english.ru/data/bloch.zip. Энджойте smile
PM WWW   Вверх
chief39
Дата 18.1.2006, 12:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


карманная тигра
***


Профиль
Группа: Участник Клуба
Сообщений: 1631
Регистрация: 20.5.2005
Где: Киев

Репутация: 15
Всего: 77



Цитата(LSD @ 18.1.2006, 00:18 Найти цитируемый пост)

Эээ...
Ну как бы тебе объяснить, дело в том что я этот метод не замечал просто. И все время удивлялся, почему его не предусмотрели.

Те же яйца, вид сбоку!!! Идея в дропдауне отображает только nextInt(). (Интересно, почему?)
Ну а в исходники никто, понятное дело, не лазил... smile
Добавлено @ 12:26

ЗЫ: я надеюсь, эту тему потом подчистят от спама? smile

Это сообщение отредактировал(а) chief39 - 18.1.2006, 12:27


--------------------
Люди - это свечи. Они либо горят, либо их - в жопу!(с)

PM MAIL   Вверх
LSD
Дата 18.1.2006, 12:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15708
Регистрация: 24.3.2004

Репутация: 209
Всего: 537



Цитата(chief39 @ 18.1.2006, 12:26 Найти цитируемый пост)
ЗЫ: я надеюсь, эту тему потом подчистят от спама?

Да.
А спаммеров, забаним smile


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
jer1
Дата 1.2.2006, 10:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 123
Регистрация: 24.1.2005
Где: Харьков Украина

Репутация: 4
Всего: 5



Название: Утилита для смены кодировок
Тип: автономное консольное приложение
Язык: Java
Версия: 1.0
Версия JDK: 1.5
Требуемые библиотеки: нет
Автор:jer1
Примечания: код оформлен с использованием синтаксиса 1.5


1. ОПИСАНИЕ класса(ов)
Класс предназначен для смены кодировок файлов.
Похожие программы: iconv (Linux), Штирлиц (Windows).
Программу можно изменить под более старую версию jdk, но не ниже
1.4 ( причина: зависимость от пакета java.nio )

2. РЕКОМЕНДАЦИИ по использованию, примеры
Это вспомогательная утилита к уже имеющимся средствам перекодирования.
Обладает всеми преимуществами программы написанной на языке java :^)

java ru.vingrad.util.CharsetConverter -h
- выводит справку по использованию:
Usage: UseCharset [-options] [FILES]
where options include:
-f <input encoding> if missed default encoding is used
-t <output encoding> if missed default encoding is used
-l list all supported charsets according to IANA Charset Registry
-h this help

java ru.vingrad.util.CharsetConverter -l
- выводит список поддерживаемых charsetov:
Name: Big5
Aliases: [csBig5]

Name: Big5-HKSCS
Aliases: [big5-hkscs, big5hk, big5-hkscs:unicode3.0, big5hkscs, Big5_HKSCS]

Name: EUC-JP
Aliases: [eucjis, x-eucjp, csEUCPkdFmtjapanese, eucjp,
Extended_UNIX_Code_Packed_Format_for_Japanese, x-euc-jp, euc_jp]
...


java ru.vingrad.util.CharsetConverter -f windows-1251 hunter.html | more
- переводит содержимое файла hunter.html из кодировки windows-1251
можно использовать также алиасы: ansi-1251, cp1251, cp5347
в текущую кодировку, стандартный вывод затем передаётся на вход программе
more

java ru.vingrad.util.CharsetConverter -t iso-8859-5
- переводит стандартный ввод в кодировку iso-8859-5

java ru.vingrad.util.CharsetConverter -f koi8-r CharsetConverter.java -t utf8 > \
CharsetConverter.utf.java
- переводит содержимое файла CharsetConverter.java из кодировки koi8-r в utf8,
результат затем сохраняется в файле CharsetConverter.utf.java


3. КОД, руководство по сборке

Код


package ru.vingrad.util;

import static java.lang.System.*;
import java.io.*;
import java.nio.*;
import java.nio.channels.*;
import java.nio.charset.*;
import java.util.*;
import java.util.logging.*;


/**
  Перекодировщик файлов или стандартного ввода. 
  
  <p>На вход получает входную, выходную кодировку и набор файлов (если файлы не заданы
  используется стандартный ввод). Результат - файлы (консольный ввод) в выходном потоке с
  параметрической кодировкой.   
  
  @author jer1
  @version 1.0
*/
public final class CharsetConverter {
    static final String HELP_MESSAGE = 
        "Usage:  UseCharset [-options] [FILES] \n" +
        "where options include: \n" +
        "    -f <input encoding>     if missed default encoding is used\n" +
        "    -t <output encoding>    if missed default encoding is used \n" +
        "    -l    list all supported charsets according to IANA Charset Registry\n" +
        "    -h    this help \n";
    static final String UNSUPPORTED_CHARSET_MESSAGE = "Sorry, charset [%s] is not supported yet.\n";                     
    static final int UNSUPPORTED_CHARSET_ERROR_CODE = 1;                     

    List<String> files = new ArrayList<String>(); 
    Charset inCharset  = Charset.defaultCharset() ;
    Charset outCharset = Charset.defaultCharset() ;

    private CharsetConverter() {} // prevent creation

    /** 
       Устанавливает входную кодировку. 
       Если указаная кодировка не поддерживается вводится соответствующее сообщение и 
       выход из приложения по ошибке с номером {@link CharsetConverter#UNSUPPORTED_CHARSET_ERROR_CODE}.

       @param charsetName имя кодировки
     */
    void setInCharset(String charsetName) {
        if (Charset.isSupported(charsetName)) {
            inCharset = Charset.forName(charsetName);
        } else {
            err.printf(UNSUPPORTED_CHARSET_MESSAGE, charsetName );
            System.exit(UNSUPPORTED_CHARSET_ERROR_CODE);
        }
    }

    /** 
       Устанавливает выходную кодировку. 
       Если указаная кодировка не поддерживается вводится соответствующее сообщение и 
       выход из приложения по ошибке с номером {@link CharsetConverter#UNSUPPORTED_CHARSET_ERROR_CODE}.

       @param charsetName имя кодировки
     */
    void setOutCharset(String charsetName) {
        if (Charset.isSupported(charsetName)) {
            outCharset = Charset.forName(charsetName);
        } else {
            err.printf(UNSUPPORTED_CHARSET_MESSAGE, charsetName );
            System.exit(UNSUPPORTED_CHARSET_ERROR_CODE);
        }
    }

    /** Добавляет файл к списку файлов, которые необходимо перекодировать. */  
    void addFile4Recoding(String fname) { 
        if (! new File(fname).exists()) { 
            System.err.printf("file [%s] does not exist\n", fname );
        } else files.add(fname);
    }  

    /** 
       Говорит есть ли файлы для перекодирования.
       @return true - есть файлы для перекодирования, false - иначе 
     */
    boolean hasFiles() { return files.size() > 0; }

    /**
       Изменяет кодировку файлов.
       Результат отправляется в стандартный вывод (т.е. сами файлы не меняются).

       @throws IOException при возникновении таковых
     */
    void recodeFiles() throws IOException {
        CharsetDecoder charDecoder = inCharset.newDecoder();
        CharsetEncoder charEncoder = outCharset.newEncoder();
        for (String fname: files) { 
            RandomAccessFile raf = new RandomAccessFile( fname, "r" );
            FileChannel fc = raf.getChannel();
            MappedByteBuffer inData = fc.map( FileChannel.MapMode.READ_ONLY, 0, fc.size() );
            CharBuffer tmpCharBuffer = charDecoder.decode(inData);
            ByteBuffer outData = charEncoder.encode(tmpCharBuffer);
            while(outData.hasRemaining()) {
                out.write(outData.get());
            }
            raf.close();
        }   
    }

    /**
       Читает стандартный поток ввода и применяет к нему соответствующую кодировку,

       @throws IOException при возникновении таковых
     */
    void recodeConsoleInput() throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();
        String s;
        while ( (s=br.readLine()) != null) sb.append(s).append("\n");
        CharsetEncoder encoder = outCharset.newEncoder(); 
        String input = sb.toString(); 
        CharBuffer cb = CharBuffer.wrap(input);
        ByteBuffer outData = encoder.encode( cb );

        while(outData.hasRemaining()) {
            out.write(outData.get());
        }
    }

    /** Выводит в стандартный поток вывода все поддерживаемые кодировки. */
    void listAllCharsets() {
        SortedMap<String, Charset> charsets = Charset.availableCharsets();
        for (String canonicalName:charsets.keySet()) {
            out.println("Name: " + canonicalName);      
            out.print("Aliases: ");
            out.println(charsets.get(canonicalName).aliases());
            out.println();
        }
    }

    /** Выводит справку по программе. */
    static void help() {
        err.println(HELP_MESSAGE);
        System.exit(0);
    }


    static public void main( final String args[] ) throws IOException {
        CharsetConverter converter = new CharsetConverter();
        int idx = 0;
        while (idx < args.length) {
            if ("-l".equalsIgnoreCase(args[idx])) {
                converter.listAllCharsets();
                System.exit(0);
            } else
            if ("-h".equalsIgnoreCase(args[idx])) {
                    CharsetConverter.help();
            } else 
            if ("-f".equalsIgnoreCase(args[idx])) {
                 converter.setInCharset(args[++idx]);
                  ++idx;
            } else 
            if ("-t".equalsIgnoreCase(args[idx])) {
                converter.setOutCharset(args[++idx]);
                ++idx;
            } else { 
                 converter.addFile4Recoding(args[idx]);
                 ++idx;
            }
        }
        if (converter.hasFiles()) converter.recodeFiles();
        else converter.recodeConsoleInput();
    }
}




--------------------
:w!q
PM MAIL   Вверх
Wowa
Дата 9.2.2006, 02:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
Group Icon


Профиль
Группа: Админ
Сообщений: 15017
Регистрация: 14.9.2000
Где: Винград

Репутация: 1
Всего: 290



Цитата(Guest @ 16.1.2006, 19:28 Найти цитируемый пост)

Тогда предлагаю обсуждать каждый "маленький класс" в своей ветке, а эту сделать рид-онли и складывать в нее готовые версии

У меня есть предложение сделать для классов отдельный подфорум может... В котором на каждый класс будет создаваться отдельная тема. А сам класс помещать в ФАК. Там можно создать древовидное меню.

Цитата(Zandr @ 17.1.2006, 09:57 Найти цитируемый пост)

По поводу комментов на русском языке... Нет комментов. Лично я против. Комменты на русском делайте к 1С Бухгалтерии.

Хм.. Ну как бы и да, и нет. Вообще на русском очень мало инфы по программированию, поэтому поддержать было бы неплохо.
Хотя конечно - англ. - это стандарт.

Цитата(LSD @ 17.1.2006, 16:05 Найти цитируемый пост)

Вдруг мы захотим хранить 2 версии, старую и доработанную (например выйдет Mustang и мы захотим доработать класс под него)?

Правильно. Я думаю, что версию класса обязательно следует указывать. Т.к. класс может быть скопирован с винграда и где-либо еще размещен.
Тогда с версиями путаница будет. Поэтому - указываем.


P.S. А что касается CVS, то у нас стоит на сервере Subversion. Если его как-то можно к библиотеке классов присоединить - давайте подумаем.
Тогда получится, что каждый будет в состоянии редактировать чужие классы. Дорабатывать их и и под тем же именем записывать. Что нехорошо, поэтому публикация тогда под другим именем и названием должна происходить. Но иметь в наличии 10 аналогичных классов - имхо тоже нехорошо..
PM WWW   Вверх
jer1
Дата 5.4.2006, 11:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 123
Регистрация: 24.1.2005
Где: Харьков Украина

Репутация: 4
Всего: 5



hi,
вот нашел простой апргрейт: следует в исходном коде ru.vingrad.util.CharsetConverter

заменть 1 блок на 2 блок - это позволит игнорировать ошибки связаные с преобразованиями символов и безмятежно продолжить выполнение программы

smile

Код



// 1 блок 
 void recodeFiles() throws IOException {
        CharsetDecoder charDecoder = inCharset.newDecoder();
        CharsetEncoder charEncoder = outCharset.newEncoder();

// 2 блок 
 void recodeFiles() throws IOException {
        CharsetDecoder charDecoder = inCharset.newDecoder()
                .onMalformedInput(CodingErrorAction.IGNORE)
                .onUnmappableCharacter(CodingErrorAction.IGNORE);

        CharsetEncoder charEncoder = outCharset.newEncoder()
                .onMalformedInput(CodingErrorAction.IGNORE)
                .onUnmappableCharacter(CodingErrorAction.IGNORE);


--------------------
:w!q
PM MAIL   Вверх
ShamanTrirukiy
Дата 20.4.2006, 13:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 12.4.2006
Где: Харьков

Репутация: 3
Всего: 5



Название: Модель, обеспечивающая ввод дробных чисел
Тип: класс
Язык: Java
Версия: 1.5.0_06
Версия JDK: 1.5
Требуемые библиотеки: нет
Авторы: ShamanTrirukiy && Ortega
Примечания: будет ли работать на версиях, ранее 1.43 - неизвестно (PlainDocument в таком виде, в каком он используется, появился в 1.43)

1. Описание класса

Класс предназначен для обеспечения ввода текста в виде дробного числа.
Конструктор класса принимает в качестве аргумента максимальное количество знаков после запятой(по умолчанию Integer.MAX_VALUE). Количество знаков после запятой должно быть больше нуля, иначе будет выброшено исключение(IllegalArgumentException).

2. Рекомендации по использованию, примеры

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

Пример использования класса: Создадим JTextField, в который будет возможным вводить только дробные числа

Код

JTextField tempTextField = new JTextField();
tempTextField.setDocument(new FloatDocument());


установим количество знаков после запятой равным 3:

Код

((FloatDocument)tempTextField.getDocument()).setAfterPointPositionCount(3);


Этого же можно достичь следующим образом:

Код

JTextField tempTextField = new JTextField();
tempTextField.setDocument(new FloatDocument(3));


3. Код
Код

package project.ui.design;

import javax.swing.text.*;

/**
 * Модель, обеспечивающая ввод дробных чисел
 * <p>
 * На вход получает максимальное допустимое количество символов после точки
 * (поумолчанию <code>Integer.MAX_VALUE</code>)
 * 
 * @author ShamanTrirukiy && Ortega
 * @see Document
 * @see AbstractDocument
 * @see PlainDocument
 */
public class FloatDocument extends PlainDocument {
  private int afterPointPositionsCount = 0;

  public FloatDocument() {
    this(Integer.MAX_VALUE);
  }

  public FloatDocument(int afterPointPositionCount) {
    super();
    setAfterPointPositionCount(afterPointPositionCount);
  }

  /**
   * Перегруженный метод <code>PlainDocument</code>, обеспечивающий
   * правильность ввода
   */
  @Override
  public void insertString(int offs, String str, AttributeSet a)
      throws BadLocationException {
    if (str == null)
      return;
    Content c = getContent();
    String text = c.getString(0, c.length() - 1) + str;
    if (!text.matches(buildRegEx()))
      return;
    if (text.replace(',', '.').charAt(0) == '.')
      str = "0" + str;
    super.insertString(offs, new String(str.replace(',', '.')), a);
  }

  /**
   * Метод, возвращающий регулярное выражение, необходимое для проверки ввода с
   * учетом количества знаков после точки(в случае, если оно меньше нуля
   * выбрасывает <code>IllegalArgumentException</code>)
   */
  private String buildRegEx() {
    if (afterPointPositionsCount < 0)
      throw new IllegalArgumentException(
          "afterPointPositionsCount couldn't be less than 0");
    return "\\d+([\\.,]\\d{0," + afterPointPositionsCount + "})?";
  }

  /**
   * Устанавливает максимальное допустимое количество знаков после
   * точки
   */
  public void setAfterPointPositionCount(int afterPoint) {
    this.afterPointPositionsCount = afterPoint;
  }
}


 
PM MAIL   Вверх
ShamanTrirukiy
Дата 20.4.2006, 14:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 12.4.2006
Где: Харьков

Репутация: 3
Всего: 5



Более общий случай:

Код

import javax.swing.text.*;

/**
 * Модель, обеспечивающая ввод строки в формате, заданном регулярным выражением
 * <p>
 * На вход получает регулярное выражение
 *  
 * @author ShamanTrirukiy
 * @see Document
 * @see AbstractDocument
 * @see PlainDocument
 */
public class RegExDocument extends PlainDocument {

  String regularExpression;

  public RegExDocument(String regularExpression) {
    super();
    setRegularExpression(regularExpression);
  }

  /**
   * Перегруженный метод <code>PlainDocument</code>, обеспечивающий
   * правильность ввода
   */
  @Override
  public void insertString(int offs, String str, AttributeSet a)
      throws BadLocationException {
    if (str == null)
      return;
    Content c = getContent();
    String text = c.getString(0, c.length() - 1) + str;
    if (!text.matches(getRegularExpression()))
      return;
    super.insertString(offs, new String(str.replace(',', '.')), a);
  }

  /**
   * Метод, возвращающий регулярное выражение
   */
  public String getRegularExpression() {
    return regularExpression;
  }

  /**
   * Метод, устанавливающий регулярное выражение
   */
  public void setRegularExpression(String regularExpression) {
    this.regularExpression = regularExpression;
  }
}


Например, для ввода только чисел все сведется к 
Код

...setDocument(new RegExDocument("\\d+"));


По-моему, очень даже удобно 
PM MAIL   Вверх
Sleepy_PIP
Дата 26.4.2006, 13:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 512
Регистрация: 30.6.2004
Где: Moscow

Репутация: 4
Всего: 12



Вниманию предлагается микро библиотечка,
куда собрал кое-что уровня "велосипед", дабы эти велосипеды народ не изобретал опять и опять.
Может буду дальше расширять - не знаю.
В библиотечке на сей момент есть:.
1. округление с заданной точностъю
2. копирование и переименование ф., работающее и между томами
3. Сумма прописью для USD и RUR - в принципе ее можно расширять и далее.

Вроде все работает ...

такие вот дела.  

Документация прилагается (внутри архива).
 

Присоединённый файл ( Кол-во скачиваний: 16 )
Присоединённый файл  piplib.rar 44,96 Kb


--------------------
--
Sleepy_PIP. Pavel Pryazhentsev (ex. 2:5020/141) "... Лучше быть нужным, чем
свободным ..."
PM MAIL ICQ   Вверх
Sleepy_PIP
Дата 27.4.2006, 11:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 512
Регистрация: 30.6.2004
Где: Moscow

Репутация: 4
Всего: 12



извините, поправил грамм. ошибку в наименовании доллора smile.
Что-б сильно не злились - добавил 2 полезных метода для изменения даты на дни или месяца.


 

Присоединённый файл ( Кол-во скачиваний: 27 )
Присоединённый файл  piplib.rar 48,53 Kb


--------------------
--
Sleepy_PIP. Pavel Pryazhentsev (ex. 2:5020/141) "... Лучше быть нужным, чем
свободным ..."
PM MAIL ICQ   Вверх
powerOn
Дата 1.5.2006, 16:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


Профиль
Группа: Участник
Сообщений: 4367
Регистрация: 7.10.2005

Репутация: 47
Всего: 159



Название:  Градиентная полоса прогресса
Тип: класс
Язык: Java
Версия: 1.0
Версия JDK: 1.5
Требуемые библиотеки: нет
Автор: MoonCat

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

Код Полосы Прогресса:

Код


import java.awt.Color;
import java.awt.GradientPaint;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import java.awt.image.BufferedImage;
import javax.swing.JProgressBar;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.plaf.ComponentUI;

/**
 *
 * @author MoonCat
 */
public class GradientProgressBar extends JProgressBar implements Runnable {
    
    // Используется для внеэкранной прорисовки изображения прогресс полосы.
    BufferedImage bi = null;
    // Начальный цвет градиента
    private Color color1 = Color.WHITE;
    // Конечный  цвет градиента.
    private Color color2 = Color.RED;
    // Используется при режиме Indeterminate для сохранения старой позиции полоски.
    private int oldPos = 0;
    
    // Установить Начальный цвет градиента
    public void setColor1(Color color) {
        color1 = color;
    }
    // Получить Начальный цвет градиента
    public Color getColor1() {
        return color1;
    }
    // Установить Конечный цвет градиента
    public void setColor2(Color color) {
        color2 = color;
    }
    // Получить Конечный цвет градиента
    public Color getColor2() {
        return color2;
    }
    
    // Создание компонента.
    // Здесь добавляем слушателя изменения размера, что бы синхронизировать размеры
    // компонента и внеэкранного буфера.
    public GradientProgressBar() {
        addComponentListener(new ComponentAdapter() {
            public void componentResized(ComponentEvent e) {
                super.componentResized(e);
                bi = new BufferedImage(getWidth() + 1, getHeight() + 1, BufferedImage.TYPE_INT_RGB);
                repaint();
            }
        });
    }
    
    
    // Метод отвечает за прорисовку изображения компонента, переопределим его для прорисовки
    // полосы прогресса.
    public void paint(Graphics g) {
        double abs_len = getMaximum() - getMinimum();
        int y = getHeight();
        int x = getWidth();
        double otn = 0;
        int s = 0;
        
        // Если состояние Indeterminate.
        if (isIndeterminate()) {
            int len = (int) x / 5;
            Graphics2D g2 = (Graphics2D) bi.getGraphics();
            g2.setBackground(null);
            
            g2.clearRect(0, 0, x, y);
            GradientPaint paint = new GradientPaint(0, y/2, color1, x, y/2, color2);
            g2.setPaint(paint);
            g2.fillRect(oldPos, 0, len, y);
            
            g.drawImage(bi, 0, 0, null);
            paintBorder(g);
            return;
        }
        
        // Если нет состояния Indeterminate.
        double v = getValue();
        
        if (v != 0) {
            otn = v / abs_len;
            s = (int) (otn * x);
        }
        Graphics2D g2 = (Graphics2D) bi.getGraphics();
        g2.setBackground(null);
        g2.clearRect(0, 0, x, y);
        GradientPaint paint = new GradientPaint(0, y/2, color1, x, y/2, color2);
        g2.setPaint(paint);
        g2.fillRect(0, 0, s, y);
        g.drawImage(bi, 0, 0, null);
        paintBorder(g);
    }
    
    // Метод run выполняется в отдельном потоке, если полоса прогресса находится
    // в состоянии Indeterminate. Этот метод изменяет позицию полоски.
    public void run() {
        while (isIndeterminate()) {
            try {
                Thread.sleep(20);
            } catch (InterruptedException ex) {
                ex.printStackTrace();
            }
            
            int x = getWidth();
            int len = x / 5;
            if (oldPos > x) {
                oldPos = -len;
            }
            oldPos += 3;
            repaint();
        }
    }
    
    // Переопределяем метод setIndeterminate, чтобы запускать поток изменения позиции полоски в
    // состоянии Indeterminate.
    public void setIndeterminate(boolean newValue) {
        
        if (!isIndeterminate()) {
            if (newValue) {
                (new Thread(this)).start();
            }
        }
        super.setIndeterminate(newValue);
    }
    
}




Пример работы с прогресс баром:

Код


import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Font;
import javax.swing.JButton;
import javax.swing.JColorChooser;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JWindow;

/**
 *
 * @author  MoonCat
 */
public class ForProgressBar extends javax.swing.JFrame {
    
    public ForProgressBar() {
        initComponents();
    }
    
    private void initComponents() {
        jSlider1 = new javax.swing.JSlider();
        jToggleButton1 = new javax.swing.JToggleButton();
        gradientProgressBar1 = new swingtest.GradientProgressBar();
        jButton1 = new javax.swing.JButton();
        jButton2 = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setTitle("Test Frame");
        jSlider1.setMinorTickSpacing(10);
        jSlider1.setPaintTicks(true);
        jSlider1.addChangeListener(new javax.swing.event.ChangeListener() {
            public void stateChanged(javax.swing.event.ChangeEvent evt) {
                jSlider1StateChanged(evt);
            }
        });

        getContentPane().add(jSlider1, java.awt.BorderLayout.SOUTH);

        jToggleButton1.setText("Indeterminate!");
        jToggleButton1.addItemListener(new java.awt.event.ItemListener() {
            public void itemStateChanged(java.awt.event.ItemEvent evt) {
                jToggleButton1ItemStateChanged(evt);
            }
        });

        getContentPane().add(jToggleButton1, java.awt.BorderLayout.NORTH);

        getContentPane().add(gradientProgressBar1, java.awt.BorderLayout.CENTER);

        jButton1.setText("Color 1");
        jButton1.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                jButton1MouseClicked(evt);
            }
        });

        getContentPane().add(jButton1, java.awt.BorderLayout.WEST);

        jButton2.setText("Color 2");
        jButton2.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                jButton2MouseClicked(evt);
            }
        });

        getContentPane().add(jButton2, java.awt.BorderLayout.EAST);

        pack();
    }

    private void jButton1MouseClicked(java.awt.event.MouseEvent evt) {
        JColorChooser cc = new JColorChooser();
        Color c = cc.showDialog(this, "Select first color.", Color.WHITE);
        jButton1.setForeground(c);
        gradientProgressBar1.setColor1(c);
    }

    private void jButton2MouseClicked(java.awt.event.MouseEvent evt) {
        JColorChooser cc = new JColorChooser();
        Color c = cc.showDialog(this, "Select second color.", Color.WHITE);
        jButton2.setForeground(c);
        gradientProgressBar1.setColor2(c);
    }
    
    private void jToggleButton1ItemStateChanged(java.awt.event.ItemEvent evt) {                                                
        if (jToggleButton1.isSelected()) {
           gradientProgressBar1.setIndeterminate(true);
        } else {
            gradientProgressBar1.setIndeterminate(false);
        }
    }                                               
    
    private void jSlider1StateChanged(javax.swing.event.ChangeEvent evt) {                                      
        gradientProgressBar1.setValue(jSlider1.getValue());
        repaint();
    }                                     
    
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new ForProgressBar().setVisible(true);
            }
        });
    }
    
      
    // Variables declaration - do not modify
    private swingtest.GradientProgressBar gradientProgressBar1;
    private javax.swing.JButton jButton1;
    private javax.swing.JButton jButton2;
    private javax.swing.JSlider jSlider1;
    private javax.swing.JToggleButton jToggleButton1;
    // End of variables declaration
    
}

  

Это сообщение отредактировал(а) MoonCat - 1.5.2006, 16:09


--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
Ortega
Дата 29.5.2006, 16:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 115
Регистрация: 5.11.2005
Где: Харьков, Украина

Репутация: 4
Всего: 6



Название:  Панель для удобной работы с GridBagLayout
Тип: класс
Язык: Java
Версия: 1.0
Версия JDK: 1.4
Требуемые библиотеки: нет
Авторы: Ortega, ShamanTrirukiy

1. Описание класса

Класс предназначен для уменьшения громоздкости и увеличения читабельности кода при работе с GridBagLayout. 

2. Код класса

Код

import java.awt.*;

import javax.swing.*;

class GridBagPanel extends JPanel {

  GridBagConstraints constraints = new GridBagConstraints();

  public GridBagPanel() {
    super(new GridBagLayout());
    setDefaultConstraints();
  }

  public void setDefaultConstraints() {
    constraints.fill = GridBagConstraints.BOTH;
    constraints.anchor = GridBagConstraints.CENTER;
    constraints.weightx = 100;
    constraints.weighty = 0;
    constraints.insets.left = 2;
    constraints.insets.right = 2;
    constraints.insets.top = 2;
    constraints.insets.bottom = 2;
  }

  public void add(Component what, int x, int y, int w, int h) {
    constraints.gridx = x;
    constraints.gridy = y;
    constraints.gridwidth = w;
    constraints.gridheight = h;
    this.add(what, constraints);
  }

  /**
   * @param fill
   *          может принимать одно из значений GridBagConstraints.BOTH
   *          GridBagConstraints.NONE; GridBagConstraints.VERTICAL;
   *          GridBagConstraints.HORIZONTAL;
   */
  public void setFill(int fill) {
    constraints.fill = fill;
  }

  /**
   * @param anchor
   *          GridBagConstraints.EAST; GridBagConstraints.WEST;
   *          GridBagConstraints.SOUTH GridBagConstraints.NORTH,
   *          GridBagConstraints.NORTHEAST; GridBagConstraints.NORTHWEST;
   *          GridBagConstraints.SOUTHEAST; GridBagConstraints.SOUTHWEST
   */
  public void setAnchor(int anchor) {
    constraints.anchor = anchor;
  }

  /**
   * @param weightx
   *          0..100
   */
  public void setWeightx(int weightx) {
    constraints.weightx = weightx;
  }

  /**
   * @param weighty
   *          0..100
   */
  public void setWeighty(int weighty) {
    constraints.weighty = weighty;
  }

  public void setLeftInset(int left_inset) {
    constraints.insets.left = left_inset;
  }

  public void setRightInset(int right_inset) {
    constraints.insets.right = right_inset;
  }

  public void setBottomInset(int bottom_inset) {
    constraints.insets.bottom = bottom_inset;
  }

  public void setTopInset(int top_inset) {
    constraints.insets.top = top_inset;
  }

  public void setInsets(int left_inset, int right_inset, int top_inset,
      int bottom_inset) {

    constraints.insets.left = left_inset;
    constraints.insets.right = right_inset;
    constraints.insets.top = top_inset;
    constraints.insets.bottom = bottom_inset;
  }

  public int getFill() {
    return constraints.fill;
  }

  public int getAnchor() {
    return constraints.anchor;
  }

  public double getWeightx() {
    return constraints.weightx;
  }

  public double getWeighty() {
    return constraints.weighty;
  }

  public int getLeftInset() {
    return constraints.insets.left;
  }

  public int getRightInset() {
    return constraints.insets.right;
  }

  public int getBottomInset() {
    return constraints.insets.bottom;
  }

  public int getTopInset() {
    return constraints.insets.top;
  }

}


3. Пример использования
Код

import javax.swing.*;

public class Test {

  public static void main(String[] args) {
    GridBagPanel gp = new GridBagPanel();
    gp.setWeightx(0);
    gp.add(new JLabel("Value 1:"), 0, 0, 1, 1);
    gp.add(new JLabel("Value 2:"), 0, 1, 1, 1);
    gp.add(new JLabel("Value 3:"), 0, 2, 1, 1);
    gp.setWeightx(100);
    gp.add(new JTextField(), 1, 0, 3, 1);
    gp.add(new JTextField(), 1, 1, 3, 1);
    gp.add(new JTextField(), 1, 2, 3, 1);
    gp.add(Box.createHorizontalGlue(), 1, 3, 1, 1);
    gp.setWeightx(0);    
    gp.add(new JButton("Ok"), 2, 4, 1, 1);
    gp.add(new JButton("Cancel"), 3, 4, 1, 1);
    gp.setWeighty(100);
    gp.add(Box.createGlue(), 0, 3, 4, 1);
    JFrame f = new JFrame();
    f.setContentPane(gp);
    f.setVisible(true);
    f.pack();
  }
}
  

Это сообщение отредактировал(а) Ortega - 29.5.2006, 20:00
--------------------
Всему свое время (с) ЧайфНе парься, будь счастлив (с) Пеппи Длинный Чулок
PM MAIL WWW ICQ Skype GTalk   Вверх
Ortega
Дата 29.5.2006, 19:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 115
Регистрация: 5.11.2005
Где: Харьков, Украина

Репутация: 4
Всего: 6



Название:  Панель, позволяющая вызовом одного метода установить свойство enabled для всех компонентов на ней
Тип: класс
Язык: Java
Версия: 1.0
Версия JDK: 1.5
Авторы: Ortega, ShamanTrirukiy

1. Описание класса
Назначение указано в названии. Метод setEnbled перегружен следующим образом: перебираются все компоненты, лежащие на панели и для каждого вызывается метод processComponent(). В данной реализации особым образом обрабатываются JTabbedPane и JSplitPane, а JButton просто прячется. Остальным просто устанавливается указанное значение enabled.

2. Код класса:
Код

import java.awt.*;

import javax.swing.*;

public class EnablingPanel extends JPanel {

  public EnablingPanel() {
    super();
  }

  public EnablingPanel(boolean isDoubleBuffered) {
    super(isDoubleBuffered);
  }

  public EnablingPanel(LayoutManager layout, boolean isDoubleBuffered) {
    super(layout, isDoubleBuffered);
  }

  public EnablingPanel(LayoutManager layout) {
    super(layout);
  }

  @Override
  public void setEnabled(boolean enabled) {
    for (int i = 0; i < getComponentCount(); ++i) {
      processComponent(getComponents()[i], enabled);
    }
    super.setEnabled(enabled);
  }

  protected void processComponent(Component c, boolean enabled) {
    if (c instanceof JLabel)
      return;
    if (c instanceof JTabbedPane) {
      for (int j = 0; j < ((JTabbedPane) c).getTabCount(); ++j)
        ((JTabbedPane) c).getComponentAt(j).setEnabled(enabled);
      return;
    }
    if (c instanceof JButton) {
      c.setVisible(enabled);
      return;
    }
    if (c instanceof JSplitPane) {
      ((JSplitPane) c).getLeftComponent().setEnabled(enabled);
      ((JSplitPane) c).getRightComponent().setEnabled(enabled);
      return;
    }
    c.setEnabled(enabled);

  }

}

 
--------------------
Всему свое время (с) ЧайфНе парься, будь счастлив (с) Пеппи Длинный Чулок
PM MAIL WWW ICQ Skype GTalk   Вверх
_Y_
Дата 23.1.2007, 15:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1651
Регистрация: 27.11.2006

Репутация: 5
Всего: 34



В другой ветке мне предложили выложить здесь пару классов позволяющих выводить в JTable цветные ячейки. Предупреждаю:
1) Я в Java не гуру. Так что код может быть далеко не идеальным.
2) Классы писались под собственные нужды. Следовательно кому-то придется дописать методы. Для того, чтобы пропостиь их здесь я дописал только комментарии.
3) Выводятся только текстовые данные. В принципе, у меня есть и классы под другие типы данных (Float, Integer, и т.п.), но они просто являются наследниками класса ColoredString (его код ниже). В принципе, логичнее было бы написать класс ColoredObject и наследовать от него, но я писал под свои задачи.

Это класс содержащий текст и цвета:
Код

import java.awt.Color;
import java.io.Serializable;

/**
 * The class unites String with its color scheme. It has been designed to serve for
 * filling of JTable (and may be some other GUI objects) with colored strings.
 * Besides of the text, an object of this class keeps foreground and background
 * colors for both selected and no-selected cases.
 * Needs a special cell renderer (for example, CellRendererColorBkg) to work.
 * @author Y
 * @version 2007-01-23
 */
public class ColoredString implements Comparable, Serializable {
    private static final long serialVersionUID = 2299659561613380545L;

    private String text;
    
    //Define colors and assign them some default values
    
    public Color 
        foreground = new Color(51,51,51),
        background = Color.WHITE,
        selectedForeground = new Color(51,51,51),
        selectedBackground = new Color(184, 207, 229);
    
    //CONSTRUCTORS
    
    /**
     * Constructor creating null-object
     */
    public ColoredString() {        
        text = null;
    }
    
    /**
     * Constructor creating text-containing object that uses default color scheme
     * @param t object representing the string. It is kept ONLY as a string representation.
     */
    public ColoredString(Object t) {
        text = t.toString();        
    }

    /**
     * Constructor creating text-containing object with suser-defined color scheme.
     * @param t object representing the text. It is kept ONLY as a string representation.
     * @param f foreground color.
     * @param b background color.
     * @param sf foreground color when the cell of JTable is selected.
     * @param sb background color when the cell of JTable is selected.
     */
    public ColoredString(Object t, Color f, Color b, Color sf, Color sb) {
        
        this(t);
                
        if(f != null) foreground = f;
        if(b != null) background = b;
        if(sf != null) selectedForeground = sf;
        if(sb != null) selectedBackground = sb;        
    }
    
    //GET METHODS
    
    public Color getBackground() {
        return background;
    }
    
    public Color getSelectedBackground() {
        return selectedBackground;
    }
                
    //SET METHODS
    
    /**
     * Method sets background scheme without changing the text and foreground scheme.
     * @param b new background color.
     * @param sb new background color when the cell of JTable is selected.
     */
    public void setBackgrounds(Color b, Color sb) {
        if(b != null) background = b;
        if(sb != null) selectedBackground = sb;        
    }
    
    /**
     * Method sets text without changing the color scheme.
     * @param txt string representing the new text.
     */
    protected void setText(String txt) {
        text  = txt;
    }

    //IMPLEMENTED METHODS OF Comparable
    
    /**
     * Method allows to compare this object with other objects that are instances
     * of String or ColoredString. Objects of all other types are not comparable
     * and thus equility is supposed.
     * @param arg0 is object to compare with.
     * @return a negative integer, zero, or a positive integer as this object is 
     * less than, equal to, or greater than the specified object.
     */
    public int compareTo(Object arg0) {

        if (arg0 instanceof ColoredString)
            return this.toString().compareTo(((ColoredString)arg0).toString());
        
        if (arg0 instanceof String)
            return this.toString().compareTo(arg0.toString());                            
            
        return 0;
    }
    
    //OWERWRITTEN METHODS OF Object
    
    /**
     * @return a string contained in this object.
     */
    public String toString() {
        return text;
    }
}

Это один из моих рендереров, обрабатывющий ColoredString для показа в JTable:
Код

import java.awt.Color;
import java.awt.Component;

import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.TableCellRenderer;
/**
 * Cell renderer providing a possibility to assign colors to single cells of JTable
 * and may be some other GUI objects. Do do it, the object containing in the cell
 * must be an instance of ColoredString. If the object is an instance of Color, an
 * empty colored cell is exposed. This is useful if a whole row or column is selected
 * but some selected cells should not contain any information.
 * @author Y
 * @version 2006-10-25
 */
public class CellRendererColorBkg extends DefaultTableCellRenderer  implements  TableCellRenderer {
    private static final long serialVersionUID = 9209775804802125978L;

    //Define colors and set default color scheme
    
    private static final Color 
        DEFAULT_FOREGROUND = new Color(51,51,51),
        DEFAULT_BACKGROUND = Color.WHITE,
        DEFAULT_SELECTED_BACKGROUND = new Color(184, 207, 229);
    
    public CellRendererColorBkg() {
        setOpaque(true);
    }

    public Component getTableCellRendererComponent(JTable table, Object value,
                         boolean isSelected, boolean hasFocus, int row, int column) {
           
        super.getTableCellRendererComponent(table, value,
                isSelected, hasFocus, row, column);
        
        Object cellContent = table.getModel().getValueAt(row, column);

        if(cellContent instanceof Color) {
            
            this.setBackground((Color)cellContent);
            
        } else if (cellContent instanceof ColoredString){
            
            this.setBackground(((ColoredString)cellContent).background);
            
          if (isSelected) { 
               this.setForeground(((ColoredString)cellContent).selectedForeground);
               this.setBackground(((ColoredString)cellContent).selectedBackground);
           } else {
                this.setForeground(((ColoredString)cellContent).foreground);
                this.setBackground(((ColoredString)cellContent).background);
           }          
            
            this.setText(((ColoredString)cellContent).toString());
            
        } else {
 
            this.setForeground(DEFAULT_FOREGROUND);

         if (isSelected) { 
                this.setBackground(DEFAULT_SELECTED_BACKGROUND);
            } else {
                 this.setBackground(DEFAULT_BACKGROUND);
            }          

            this.setText((String)cellContent);                  
        }
        
        return this;
    }
}


2008-01-10: По просбе трудящихся добавляю маленький запускаемый класс, демонстрирующий работу рендерера:

Код

import java.awt.Color;

import javax.swing.JFrame;
import javax.swing.JTable;

public class Test extends JFrame {
    
    public Test(){
        super();
        
        //Create table
        
        JTable table = new JTable(2,3);
        table.setDefaultRenderer(Object.class, new CellRendererColorBkg());
        
        //Fill table
        
        table.setValueAt(new ColoredString("String 00", Color.BLACK, Color.YELLOW, Color.GRAY, Color.GREEN), 0, 0);
        table.setValueAt(new ColoredString("String 01", Color.RED, Color.WHITE, Color.CYAN, Color.BLACK), 0, 1);
        table.setValueAt(new ColoredString("String 02", Color.BLUE, Color.GRAY, Color.RED, Color.GRAY), 0, 2);
        table.setValueAt(new ColoredString("String 10", Color.BLUE, Color.MAGENTA, Color.GREEN, Color.GRAY), 1, 0);
        table.setValueAt(new ColoredString("Default 11"), 1, 1);
        table.setValueAt(new ColoredString("String 12", Color.YELLOW, Color.BLACK, Color.RED, Color.YELLOW), 1, 2);        
        
        //Add table
        
        this.add(table);    
        
        //Conventional operations of the window
        
        this.setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);        
        this.setSize(220, 80);
        this.setVisible(true);
    }

    public static void main(String[] args) {
        new Test();
    }
}


Это сообщение отредактировал(а) _Y_ - 10.1.2008, 13:56


--------------------
Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:)
PM MAIL WWW   Вверх
Lotrex
Дата 19.9.2007, 15:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 95
Регистрация: 9.2.2006
Где: Казань

Репутация: нет
Всего: 3



Цитата(Lеstat @  9.1.2006,  23:35 Найти цитируемый пост)
Guest, не... свое оно лучше!!! русские доки будут =) мессаги на форуме по которым понятно что для чего
кстати, нету ни у кого маленького класса, который файлы с настройками читает
ну что-то типа


Без подсветки    
1:    
2:    
3:    
4:    
host=localhost    
port=8000    
login=user    
password=pass    

и тд


Есть у меня такой класс, тока он совсем не махонький (а точнее, это пакет, содержащий 4 класса)
Вот что делают эти классы:

AkPrefs - собственно, сам класс чтения/сохранения настроек;
FileDump - читает файл в память и хранит его в виде массива байт;
EscConv - преобразует строки, содержащие символы unicode, кириллицу или какие-либо спец. символы (символ новой строки и т.п),  в ascii-строки с заменой не-ascii-символов соответствующими esc-последовательностями. Выполняется так же обратное преобразование (esc-последовательности заменяются соотв. символами). В набор спец. символов можно дополнительно добавить любые символы, и они будут заменятся esc-последовательностями;
PrefsFormat - используется для записи/чтения настроек в соответствующем формате;
изменив его реализацию (но сохранив интерфейс), можно изменить формат хранения настроек.

тип: пакет
Версия 1.0 от 19.09.2007
Версия JDK: 1.5

Это сообщение отредактировал(а) Lotrex - 20.9.2007, 08:14

Присоединённый файл ( Кол-во скачиваний: 12 )
Присоединённый файл  formats10_19_09_2007.zip 7,32 Kb
PM MAIL ICQ   Вверх
_Y_
Дата 8.10.2007, 16:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1651
Регистрация: 27.11.2006

Репутация: 5
Всего: 34



Название: Простейший самозагружающийся TreeMap, удобный для использования в качестве примитивного словаря. 
Тип: класс
Язык: Java
Версия: 2007-10-08
Требуемые библиотеки: нет
Автор: Y
Код

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.TreeMap;

import javax.swing.JOptionPane;

/**
 * A treemap with data loadable from a file. Used as a dictonary and
 * translit-converter table.
 * The dictonary file has a tab-separated text format.
 * 
 * @version 2007-10-08
 * @author Y
 */
public class SelfLoadingTreeMap extends TreeMap<String, String> {
    private static final long serialVersionUID = 5598499932904345282L;
    
    private static final String FIELDSEPARATOR = "\t";
    
    protected String filePass;
    
    /**
     *Default constructor loading the table from a unicode file "UTF-16"
     * @throws IOException 
     */     
    public SelfLoadingTreeMap(String filePass) throws IOException {
        this(filePass, "UTF-16");
    }
    
    /**
     * Constructor allowing selection of the text file coding system
     * @param filePass
     * @param codingSystem
     * @throws IOException 
     */
    public SelfLoadingTreeMap(String filePass, String codingSystem) throws IOException {
        
        super();
        
        this.filePass = filePass;
        
        BufferedReader in
           = new BufferedReader(new InputStreamReader(
                   new FileInputStream(filePass), codingSystem));
        
        String str;
        String[] str2;
        
        while ((str = in.readLine()) != null) {
      
            str2 = str.split(FIELDSEPARATOR);
      
            if(str2.length == 1) {
                str2 = new String[2];
                str2[0] = str;
                str2[1] = null;
            }
      
            this.put(str2[0], str2[1]);
        }
     
        in.close();
    }    
}



--------------------
Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:)
PM MAIL WWW   Вверх
Platon
Дата 27.3.2008, 11:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1801
Регистрация: 25.4.2006

Репутация: 16
Всего: 40



Предлагаю свой вариант работы с GridBagLayout

Код

package platon.gui.swing;

import javax.swing.*;
import java.awt.*;

public class GBCUtil {

    public int defaultGridX;

    public int defaultGridY;

    public int defaultGridWidth = 1;

    public int defaultGridHeight = 1;

    public double defaultWeightX;

    public double defaultWeightY;

    public int defaultAnchor = GBC.CENTER;

    public int defaultFill = GBC.NONE;

    public Insets defaultInsets = new Insets(2, 2, 2, 2);

    public int defaultPadX;

    public int defaultPadY;

    public GBCUtil() {}

    public GBCUtil(int defaultGridX, int defaultGridY, int defaultGridWidth, int defaultGridHeight, double defaultWeightX, double defaultWeightY, int defaultAnchor, int defaultFill, Insets defaultInsets, int defaultPadX, int defaultPadY) {
        this.defaultGridX = defaultGridX;
        this.defaultGridY = defaultGridY;
        this.defaultGridWidth = defaultGridWidth;
        this.defaultGridHeight = defaultGridHeight;
        this.defaultWeightX = defaultWeightX;
        this.defaultWeightY = defaultWeightY;
        this.defaultAnchor = defaultAnchor;
        this.defaultFill = defaultFill;
        this.defaultInsets = defaultInsets;
        this.defaultPadX = defaultPadX;
        this.defaultPadY = defaultPadY;
    }

    public GBC buildGBC() {
        return new GBC(defaultGridX, defaultGridY, defaultGridWidth, defaultGridHeight, defaultWeightX, defaultWeightY,
                defaultAnchor, defaultFill, defaultInsets, defaultPadX, defaultPadY);
    }

    public GBC buildGBC(int gridx, int gridy, int gridwidth, int gridheight, double weightx, double weighty, int anchor,
                        int fill, Insets insets, int ipadx, int ipady) {
        return new GBC(gridx, gridy, gridwidth, gridheight, weightx, weighty, anchor, fill, insets, ipadx, ipady);
    }

    public GBC buildGBC(int gridx, int gridy) {
        return new GBC(gridx, gridy, defaultGridWidth, defaultGridHeight, defaultWeightX, defaultWeightY,
                    defaultAnchor, defaultFill, defaultInsets, defaultPadX, defaultPadY);
    }

    public GBC buildGBC(int gridx, int gridy, int gridwidth, int gridheight) {
        return new GBC(gridx, gridy, gridwidth, gridheight, defaultWeightX, defaultWeightY,
                    defaultAnchor, defaultFill, defaultInsets, defaultPadX, defaultPadY);
    }

    public GBCUtil defaultGridX(int gridX) {
        defaultGridX = gridX;
        return this;
    }

    public GBCUtil defaultGridY(int gridY) {
        defaultGridY = gridY;
        return this;
    }

    public GBCUtil defaultGridWidth(int defaultGridWidth) {
        this.defaultGridWidth = defaultGridWidth;
        return this;
    }

    public GBCUtil defaultGridHeight(int defaultGridHeight) {
        this.defaultGridHeight = defaultGridHeight;
        return this;
    }

    public GBCUtil defaultWeightX(double defaultWeightX) {
        this.defaultWeightX = defaultWeightX;
        return this;
    }

    public GBCUtil defaultWeightY(double defaultWeightY) {
        this.defaultWeightY = defaultWeightY;
        return this;
    }


    public GBCUtil defaultAnchor(int defaultAnchor) {
        this.defaultAnchor = defaultAnchor;
        return this;
    }

    public GBCUtil defaultFill(int defaultFill) {
        this.defaultFill = defaultFill;
        return this;
    }

    public GBCUtil defaultInsets(Insets defaultInsets) {
        this.defaultInsets = defaultInsets;
        return this;
    }

    public GBCUtil defaultPadX(int defaultPadX) {
        this.defaultPadX = defaultPadX;
        return this;
    }

    public GBCUtil defaultPadY(int defaultPadY) {
        this.defaultPadY = defaultPadY;
        return this;
    }

    public static void main(String[] args) {
        JPanel panel = new JPanel(new GridBagLayout());
        GBCUtil util = new GBCUtil().defaultAnchor(GBC.WEST).defaultInsets(new Insets(2, 2, 2, 2));
        panel.add(new JLabel("Label1"), util.buildGBC(0, 0));
        panel.add(new JLabel("Label2"), util.buildGBC(0, 1));
        panel.add(new JLabel("Label3"), util.buildGBC(0, 2));
        panel.add(new JButton("..."), util.buildGBC(2, 2));
        util.defaultWeightX(1).defaultAnchor(GBC.CENTER).defaultFill(GBC.HORIZONTAL);
        panel.add(new JTextField(), util.buildGBC(1, 0, 2, 1));
        panel.add(new JTextField(), util.buildGBC(1, 1, 1, 1));
        panel.add(new JTextField(), util.buildGBC(1, 2, 1, 1));

        JFrame f = new JFrame();
        f.getContentPane().add(panel);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.pack();
        f.setLocationByPlatform(true);
        f.setVisible(true);
    }

}


Код

package platon.gui.swing;

import java.awt.*;

public class GBC extends GridBagConstraints {

    public GBC() {
    }

    public GBC(int gridx, int gridy, int gridwidth, int gridheight, double weightx, double weighty, int anchor, int fill, Insets insets, int ipadx, int ipady) {
        super(gridx, gridy, gridwidth, gridheight, weightx, weighty, anchor, fill, insets, ipadx, ipady);
    }


    public GBC(int gridx, int gridy) {
        this.gridx = gridx;
        this.gridy = gridy;
    }

    public GBC(int gridx, int gridy, int gridwidth, int gridheight) {
        this.gridx = gridx;
        this.gridy = gridy;
        this.gridwidth = gridwidth;
        this.gridheight = gridheight;
    }

    public GBC gridX(int gridx) {
        this.gridx = gridx;
        return this;
    }

    public GBC gridY(int gridy) {
        this.gridy = gridy;
        return this;
    }

    public GBC gridWidth(int gridwidth) {
        this.gridwidth = gridwidth;
        return this;
    }

    public GBC gridHeight(int gridheight) {
        this.gridheight = gridheight;
        return this;
    }

    public GBC weightX(double weightx) {
        this.weightx = weightx;
        return this;
    }

    public GBC weightY(double weighty) {
        this.weighty = weighty;
        return this;
    }

    public GBC anchor(int anchor) {
        this.anchor = anchor;
        return this;
    }

    public GBC fill(int fill) {
        this.fill = fill;
        return this;
    }

    public GBC ipadX(int ipadx) {
        this.ipadx = ipadx;
        return this;
    }

    public GBC ipadY(int ipady) {
        this.ipady = ipady;
        return this;
    }

    public GBC insets(Insets insets) {
        this.insets = insets;
        return this;
    }

}

Пример использования:
Код

JPanel panel = new JPanel(new GridBagLayout());
GBCUtil util = new GBCUtil().defaultAnchor(GBC.WEST).defaultInsets(new Insets(2, 2, 2, 2));
panel.add(new JLabel("Label1"), util.buildGBC(0, 0));
panel.add(new JLabel("Label2"), util.buildGBC(0, 1));
panel.add(new JLabel("Label3"), util.buildGBC(0, 2));
panel.add(new JButton("..."), util.buildGBC(2, 2));
util.defaultWeightX(1).defaultAnchor(GBC.CENTER).defaultFill(GBC.HORIZONTAL);
panel.add(new JTextField(), util.buildGBC(1, 0, 2, 1));
panel.add(new JTextField(), util.buildGBC(1, 1));
panel.add(new JTextField(), util.buildGBC(1, 2));

PM MAIL ICQ   Вверх
Hades
Дата 12.8.2008, 18:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 226
Регистрация: 8.8.2008

Репутация: нет
Всего: 37



Цитата(sergejzr @  6.1.2006,  15:38 Найти цитируемый пост)

Код

// ...
while((cntchars = (ran.nextInt() % to))<from);
// ...


Оригинальное решение, но зачем использовать цикл, ведь этот процесс может и затянутся.
ИМХО, лучше так:
Код

cntchars = from + Math.abs(ran.nextInt()) % (to - from);



Это сообщение отредактировал(а) Hades - 12.8.2008, 18:51
PM MAIL   Вверх
Platon
Дата 12.8.2008, 19:46 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1801
Регистрация: 25.4.2006

Репутация: 16
Всего: 40



я думаю, нам еще лучше подойдет вариант:
Код

from + ran.nextInt(to - from)

PM MAIL ICQ   Вверх
Hades
Дата 12.8.2008, 19:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 226
Регистрация: 8.8.2008

Репутация: нет
Всего: 37



Platon,  smile 
PM MAIL   Вверх
sergejzr
Дата 13.8.2008, 17:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 6
Всего: 360



Platon, действительно. smile какой-то индийский цикл получился. Даже не знаю, как он туда закрался smile)


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
Hades
Дата 13.8.2008, 17:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 226
Регистрация: 8.8.2008

Репутация: нет
Всего: 37



sergejzr
может стоит изменить и
Цитата(sergejzr @  6.1.2006,  15:38 Найти цитируемый пост)

Код

// ...
switch(Math.abs(ran.nextInt()) % 3)        
// ...
pass+=(char)((Math.abs(ran.nextInt()) % range)+next);
// ...


на
Код

// ...
switch(ran.nextInt(3))        
// ...
pass+=(char)(ran.nextInt(range) + next);
// ...


PM MAIL   Вверх
gelo86
Дата 17.10.2008, 12:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 388
Регистрация: 26.10.2007

Репутация: нет
Всего: нет



Мы ушли от ночалной идейи - java util framework. Как думаете, многоби билоби желающих просматривать код такого проекта, коментироват: где код плохой, где его и как можна улудшить, предлагать свайи методы и даже классы.
У меня есть желание чтото такого создать. Толко разумеется создоват для себя и аднаму просто глупо, но если билоби народу, каторий исползует и предлагает чтото нового, то билоби разумно чтото создать.
PM MAIL   Вверх
batigoal
Дата 17.10.2008, 17:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нелетучий Мыш
****


Профиль
Группа: Участник Клуба
Сообщений: 6423
Регистрация: 28.12.2004
Где: Санктъ-Петербургъ

Репутация: 24
Всего: 151



Цитата(gelo86 @  17.10.2008,  13:06 Найти цитируемый пост)
Толко разумеется создоват для себя и аднаму просто глупо, но если билоби народу, каторий исползует и предлагает чтото нового, то билоби разумно чтото создать. 

А по-другому и не получится. Если нет энтузиаста, который все тянет на себе, то проект захлебывается (тем более некоммерческий).


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
gelo86
Дата 17.10.2008, 22:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 388
Регистрация: 26.10.2007

Репутация: нет
Всего: нет



Поетому и спрашиваю. Сколко билоби одномисленников?
PM MAIL   Вверх
illarion
Дата 5.3.2009, 10:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 27.2.2009

Репутация: нет
Всего: нет



Название: Конфигуратор на основе Properties
Тип: пример класса
Язык: Java
Версия JDK: 1.6
Требуемые библиотеки: нет
Автор: Illarion

1. Описание класса(ов)

Пример предназначен для быстрого создания загрузчика файлов конфигураций, привожу только текст конструктора класса, который умеет заполнять свои поля на основе файла properties. Основная идея в  том, что вы создаете класс Config, в нем сколь угодно много поле (String и int), каких вам надо, с модификатором доступа public. А их значения выносите в файл пропертей, с такими же точно именами. После чего вызываете нижеописаный конструктор, он сам все заполнит.

 Зависимость от стандартных пропертей я убрал т.к. они ненормально поддерживают юникод - там приходится экранировать символы. 
2. Код properties (для примера)

Код

server=ya.ru
port=80
login=test_user


3. Код класса

Код

import java.io.BufferedReader;

public class Config {

/* Эти поля следует заменить на свои */

    public String server;
    public int port;
    public String login;

    public Config(String fileName) throws Exception {

        BufferedReader reader = new BufferedReader(new FileReader(fileName));
        String line = "";

        Field[] fieldsArray = this.getClass().getFields();
        Map<String, Field> fields = new HashMap<String, Field>();

        for (Field field : fieldsArray) {
            fields.put(field.getName(), field);
        }

        while (true) {
            line = reader.readLine();
            

            if (line == null) {
                break;
            }

            if (line.startsWith("#")) {
                continue;
            }

            if (!line.contains("=")) {
                continue;
            }

            String[] strings = line.split("=",2);

            if (strings.length < 2) {
                continue;
            }

            String key = strings[0];
            String valueString = strings[1];

            if (!fields.containsKey(key)) {
                continue;
            }

            Field field = fields.get(key);

            Object valueObject = valueString;

            if (field.getType().equals(int.class)) {
                valueObject = Integer.parseInt(valueString);
            }

            field.set(this, valueObject);

        }

    }
}




Это сообщение отредактировал(а) illarion - 5.3.2009, 11:02
PM MAIL   Вверх
aliks
Дата 10.4.2009, 13:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 146
Регистрация: 17.12.2008

Репутация: 1
Всего: 1



Как просили меня в теме которую я создал, перенести исходник который я выложил, в эту тему:

Преобразование чисел (денег) в пропись
Исходный код где то встретил в инет, там автор предлагал работать совместно с SQL (правдо непонятно зачем??? - лишние запросы)
Мной код немного доработан и улучшен, предлагаю для всех, кому необходим

Код

package AW.Common;
import java.math.*;
/**
 * Преобразование суммы цифрами в сумму прописьь
 * @author Aleksey Osipov
 * e-mal: [email protected]
 */
public class jAmount {
    private static class jAmCurrency {
        public CurrencyParam curParam;
        public class CurrencyParam {
            short ID_cur;
            String ISO_name;
            String Full_name;
            String i1;
            String i24;
            String i5;
            String r1;
            String r24;
            String r5;
            String Sex;
        }
        public jAmCurrency(Integer ID_Curr) {
            CurrencyParam[] Curr = new CurrencyParam[4];
            //---
            Curr[0] = new CurrencyParam();
            Curr[0].ID_cur    = 0;
            Curr[0].ISO_name  = "RUR";
            Curr[0].Full_name = "Российские рубли";
            Curr[0].i1        = "рубль";
            Curr[0].i24       = "рубля";
            Curr[0].i5        = "рублей";
            Curr[0].r1        = "копейка";
            Curr[0].r24       = "копейки";
            Curr[0].r5        = "копеек";
            Curr[0].Sex       = "M";
            //---
            Curr[1] = new CurrencyParam();
            Curr[1].ID_cur    = 1;
            Curr[1].ISO_name  = "UAH";
            Curr[1].Full_name = "Украинские гривны";
            Curr[1].i1        = "гривна";
            Curr[1].i24       = "гривны";
            Curr[1].i5        = "гривен";
            Curr[1].r1        = "копейка";
            Curr[1].r24       = "копейки";
            Curr[1].r5        = "копеек";
            Curr[1].Sex       = "F";
            //---
            Curr[2] = new CurrencyParam();
            Curr[2].ID_cur    = 2;
            Curr[2].ISO_name  = "USD";
            Curr[2].Full_name = "Доллары США";
            Curr[2].i1        = "доллар";
            Curr[2].i24       = "доллара";
            Curr[2].i5        = "долларов";
            Curr[2].r1        = "цент";
            Curr[2].r24       = "цента";
            Curr[2].r5        = "центов";
            Curr[2].Sex       = "M";
            //---
            Curr[3] = new CurrencyParam();
            Curr[3].ID_cur    = 3;
            Curr[3].ISO_name  = "EUR";
            Curr[3].Full_name = "Евро";
            Curr[3].i1        = "евро";
            Curr[3].i24       = "евро";
            Curr[3].i5        = "евро";
            Curr[3].r1        = "цент";
            Curr[3].r24       = "цента";
            Curr[3].r5        = "центов";
            Curr[3].Sex       = "M";
            curParam = Curr[ID_Curr];
        }
    }
    private BigInteger summ;
    private static final BigInteger zero     = new BigInteger ("0");
    private static final BigInteger hundred  = new BigInteger ("100");
    private static final BigInteger thousand = new BigInteger ("1000");
    private final jAmCurrency.CurrencyParam curParam;
    // Конструктор класса
    public jAmount (int Currency, String s) {
        curParam = new jAmCurrency(Currency).curParam;
        s=s.replaceAll(",", ".");
        try {
            BigDecimal decimal = new BigDecimal (s);
            // Преобразуем в копейки (центы, пфенниги и т.д.),
            // одним словом - убираем дробную часть
            decimal = decimal.multiply (new BigDecimal (100.00));
            summ = decimal.toBigInteger ();
            // Приступить к преобразованию
            toString ();
        }
        catch (NumberFormatException e) {
            // Ой !!!!! Что-то не так: скорее всего, в строке
            // представляющей собой сумму цифрами, встретились символы
            // отличные от цифр и точки. Можно просто выводить сообщение
            // об ошибках на консоль:
            System.out.println(e);
            System.out.println("Ошибка преобразование суммы");
        }
    }
    // Получить правую (дробную) часть суммы
    public String getRightPart () {
        return alignSumm (summ.remainder (hundred).abs ().toString ());
    }
    // Если сумма меньше 10, то выровнять ее дописыванием "0"
    String alignSumm (String s) {
        switch (s.length ()) {
            case 0: s = "00"; break;
            case 1: s = "0" + s; break;
        }
        return s;
    }
    @Override
    public String toString () {
        StringBuffer result = new StringBuffer ();
        BigInteger [] divrem = summ.divideAndRemainder (hundred);
        if (divrem [0].signum () == 0) result.append ("Ноль ");
        divrem = divrem [0].divideAndRemainder (thousand);
        BigInteger quotient  = divrem [0];
        BigInteger remainder = divrem [1];
        int group = 0;
        do {
           int value = remainder.intValue ();
           result.insert (0, groupToString (value, group));
           // Для нулевой группы добавим в конец соответствующую валюту
           if (group == 0) {
               int rank10 = (value % 100) / 10;
               int rank = value % 10;
               if (rank10 == 1) {
                   result = result.append (curParam.i5);
               }
               else {
                    switch (rank) {
                    case 1: result = result.append (curParam.i1); break;
                    case 2:
                    case 3:
                    case 4: result = result.append (curParam.i24); break;
                   default: result = result.append (curParam.i5); break;
                    }
               }
           }
           divrem = quotient.divideAndRemainder (thousand);
           quotient  = divrem [0];
           remainder = divrem [1];
           group++;
        }
        while (!quotient.equals (zero) || !remainder.equals (zero));
        // Дробная часть суммы
        String s = getRightPart ();
        result = result.append (" ").append (s);
        result = result.append (" ");
        if (s.charAt (0) == '1') {
            result = result.append (curParam.r5);
        }
        else {
             switch (s.charAt(1)) {
             case '1': result = result.append (curParam.r1); break;
             case '2':
             case '3':
             case '4': result = result.append (curParam.r24); break;
             default:  result = result.append (curParam.r5); break;
            }
        }
        // По правилам бухгалтерского учета первая буква строкового
        // представления должна быть в верхнем регистре
        result.setCharAt (0, Character.toUpperCase (result.charAt (0)));
        return result.toString();
    }
    // Преобразование группы цифр в строку
    String groupToString (int value, int group) {
        if (value < 0 || value > 999) throw new IllegalArgumentException ("value must be between 0 an 999 inclusively");
        if (group < 0) throw new IllegalArgumentException ("group must be more than 0");
        StringBuffer result = new StringBuffer (32);
        if (value == 0) {
            return result.toString();
        }
        // Разбор числа по разрядам, начиная с сотен
        int rank = value / 100;
        switch (rank) {
        default: break;
        case 1:  result = result.append ("сто ");       break;
        case 2:  result = result.append ("двести ");    break;
        case 3:  result = result.append ("триста ");    break;
        case 4:  result = result.append ("четыреста "); break;
        case 5:  result = result.append ("пятьсот ");   break;
        case 6:  result = result.append ("шестьсот ");  break;
        case 7:  result = result.append ("семьсот ");   break;
        case 8:  result = result.append ("восемьсот "); break;
        case 9:  result = result.append ("девятьсот "); break;
        }
        // Далее, десятки
        rank = (value % 100) / 10;
        switch (rank) {
        default: break;
        case 2:  result = result.append ("двадцать ");    break;
        case 3:  result = result.append ("тридцать ");    break;
        case 4:  result = result.append ("сорок ");       break;
        case 5:  result = result.append ("пятьдесят ");   break;
        case 6:  result = result.append ("шестьдесят ");  break;
        case 7:  result = result.append ("семьдесят ");   break;
        case 8:  result = result.append ("восемьдесят "); break;
        case 9:  result = result.append ("девяносто ");   break;
        }
        // Если десятки = 1, добавить соответствующее значение. Иначе - единицы
        int rank10 = rank;
        rank = value % 10;
        if (rank10 == 1) {
            switch (rank) {
            case 0: result = result.append ("десять ");       break;
            case 1: result = result.append ("одиннадцать ");  break;
            case 2: result = result.append ("двенадцать ");   break;
            case 3: result = result.append ("тринадцать ");   break;
            case 4: result = result.append ("четырнадцать "); break;
            case 5: result = result.append ("пятнадцать ");   break;
            case 6: result = result.append ("шестнадцать ");  break;
            case 7: result = result.append ("семнадцать ");   break;
            case 8: result = result.append ("восемнадцать "); break;
            case 9: result = result.append ("девятнадцать "); break;
            }
        }
        else {
            switch (rank) {
            default:
                 break;
            case 1:
                 if (group == 1) // Тысячи
                     result = result.append ("одна ");
                 else {
                    // Учесть род валюты (поле "Sex" настроечной информации)
                    if (curParam.Sex.equals ("M")) result = result.append ("один ");
                    if (curParam.Sex.equals ("F")) result = result.append ("одна ");
                 }
                 break;
            case 2:
                 if (group == 1) // Тысячи
                     result = result.append ("две ");
                 else {
                    // Учесть род валюты (поле "Sex" настроечной информации)
                    if (curParam.Sex.equals ("M")) result = result.append ("два ");
                    if (curParam.Sex.equals ("F")) result = result.append ("две ");
                 }
                 break;
            case 3: result = result.append ("три ");    break;
            case 4: result = result.append ("четыре "); break;
            case 5: result = result.append ("пять ");   break;
            case 6: result = result.append ("шесть ");  break;
            case 7: result = result.append ("семь ");   break;
            case 8: result = result.append ("восемь "); break;
            case 9: result = result.append ("девять "); break;
            }
        }
        // Значение группы: тысячи, миллионы и т.д.
        switch (group) {
        default:
             break;
        case 1:
             if (rank10 == 1)
                 result = result.append ("тысяч ");
                else {
                switch (rank) {
                default: result = result.append ("тысяч ");  break;
                case 1:  result = result.append ("тысяча "); break;
                case 2:
                case 3:
                case 4:  result = result.append ("тысячи "); break;
                }
             }
             break;
        case 2:
             if (rank10 == 1)
                 result = result.append ("миллионов ");
             else {
                  switch (rank) {
                  default: result = result.append ("миллионов "); break;
                  case 1:  result = result.append ("миллион ");   break;
                  case 2:
                  case 3:
                  case 4:  result = result.append ("миллиона ");  break;
                  }
             }
             break;
        case 3:
             if (rank10 == 1)
                 result = result.append ("миллиардов ");
             else {
                  switch (rank) {
                  default: result = result.append ("миллиардов "); break;
                  case 1:  result = result.append ("миллиард ");   break;
                  case 2:
                  case 3:
                  case 4:  result = result.append ("миллиарда ");  break;
                  }
             }
            break;
        case 4:
             if (rank10 == 1)
                 result = result.append ("триллионов ");
             else {
                  switch (rank) {
                  default: result = result.append ("триллионов "); break;
                  case 1:  result = result.append ("триллион ");   break;
                  case 2:
                  case 3:
                  case 4:  result = result.append ("триллиона ");  break;
                  }
             }
             break;
        }
        return result.toString();
    }
  }


а вот так он вызывается

Код

String ss = new jAmount(0, "125.99");


Соответственно первый параметр это код валюты, а второй - необходимое число
Валюта:
0 - рубль
1 - гривна
2 - доллар
3 - евро 
--------------------
Любимая кнопка - F1, Любимое спасибо - Плюс в репутацию
PM MAIL Jabber   Вверх
powerOn
Дата 10.4.2009, 13:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


Профиль
Группа: Участник
Сообщений: 4367
Регистрация: 7.10.2005

Репутация: 47
Всего: 159



Цитата(aliks @  10.4.2009,  14:48 Найти цитируемый пост)
jAmount


В Java хорошим тоном считается писать имена классов с большой буквы.  smile 


--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
CMYK
Дата 10.1.2010, 04:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 50
Регистрация: 22.11.2008
Где: ЮГ

Репутация: нет
Всего: нет



У меня не один класс а несколько 
предназначено всё это для упрощения динамического генерирования регексов

в текст для регекса можно вставлять ну что то типа функций такого вида ${ANY_SYMBOL[0]} (см в использовании)  где ${...} контейнер для так называемой функции и ANY_SYMBOL[0] - сама функция можно в принципе создать файл который будет содержать имена лена вася и т.д. написать обработчик по образу и подобию как показано в использовании который будет считывать имена и вставлять их на место функции. Функцию можно сделать такого типа ${NAMES[имя_фала_с_именами.xml]}
дальше обработчик будет парсить xml ну и генерить регекс.
также есть метод protected dirtySpelling(String str) в классе AbstractBuilder который можно использовать в случаях когда необходимо найти правильно написанную фразу в тексте не очень хорошего качества где используются например в место буквы "о" - "0"(ноль) или английская буква "o" с остальными буквами аналигичная ситуация.

без вставок функций в текст просто генерируется регекс который игнорит знаки препинания например такую строку 'привет нихороший человек как дела'  найдет вот в такой строке 'какойто текст привет "нихороший человек" как. дела какойто текст' 
этот обработчик можно заменить на свой смотри класс RegexBuilder метод public void setNoFunctionBuilder(Builder newBuilder)

Да и сильно не пинайте на счет названий переменных и классов с английским у меня проблема да и с русскимsmile)))


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


Код


import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;


public class RegexBuilder {

      private static Pattern pattern1 = Pattern.compile("\\$\\{([^$]+)\\}");

      private static Pattern pattern2 = Pattern.compile("^(.*?)\\s*\\[(.*)]$");

      private static Pattern pattern3 = Pattern.compile("\\$SPLIT\\$");

      private Halper halper = new Halper();

      private Map<String, Builder> commands = new HashMap<String, Builder>();//мапа обработчиков

      public RegexBuilder() {
            commands.put("NO_FUNCTION", new DefaultNoFunctionBuilder());
      }

      public Pattern build(String string) {
            Pattern p = null;
            ArrayList<String> funct = new ArrayList<String>();
            ArrayList<String> flag = new ArrayList<String>();

            Matcher matcher = pattern1.matcher(string);
            boolean bol = false;

            while (matcher.find()) {
                  String func = matcher.group(1);
                  Matcher matcher2 = pattern2.matcher(func);
                  if (!matcher2.find()) {
                        throw new IllegalArgumentException("Invalid syntax");
                  }
                  String t = matcher2.group(1).trim();
                  if (!commands.containsKey(t)) {
                        throw new IllegalArgumentException("Invalid syntax");
                  }
                  flag.add(t);
                  funct.add(matcher2.group(2));
                  bol = true;
            }


            if (bol == true) {
                  string = pattern1.matcher(string).replaceAll("\\$SPLIT\\$");

                  string = halper.execute(string);

                  for (int i = 0; i < funct.size(); i++) {
                        string = pattern3.matcher(string).replaceFirst(process(flag.get(i), funct.get(i)));
                  }
                  p = Pattern.compile(string, Pattern.UNICODE_CASE | Pattern.CASE_INSENSITIVE);

            } else {
                  p = Pattern.compile(process("NO_FUNCTION", string),
                                 Pattern.UNICODE_CASE | Pattern.CASE_INSENSITIVE);
            }

            return p;
      }

      private String process(String function, String fo) {
            return commands.get(function).execute(fo);
      }

      public String dirtySpelling(String string) {
            return halper.spelling(string);
      }

      public boolean addBuilder(String functionName, Builder builder) {
            if (!commands.containsKey(functionName)) {
                  commands.put(functionName, builder);
                  return true;
            } else {
                  return false;
            }
      }

      public boolean setBuilder(String functionName, Builder newBuilder) {
            if (commands.containsKey(functionName)) {
                  commands.remove(functionName);
                  commands.put(functionName, newBuilder);
                  return true;
            } else {
                  return false;
            }
      }

      public boolean removeBuilder(String functionName) {
            if (commands.containsKey(functionName)) {
                  commands.remove(functionName);
                  return true;
            } else {
                  return false;
            }
      }

      public void setNoFunctionBuilder(Builder newBuilder) {
            commands.remove("NO_FUNCTION");
            commands.put("NO_FUNCTION", newBuilder);
      }

      public boolean containsFunctionName(String functionName) {
            return commands.containsKey(functionName);
      }

}



интерфейс обработчика

Код

public interface Builder {

      public String execute(String params);

}




этот просто сделал для того чтобы добавить функцианала немножко

Код

import java.util.ArrayList;
import java.util.regex.Matcher;
import java.util.regex.Pattern;


public abstract class AbstractBuilder implements Builder {

      protected static final Pattern symbols = Pattern.compile("[^а-яa-z0-9]", Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE);

      protected static final Pattern space = Pattern.compile("\\s+");

      protected String dirtySpelling(String string) {
            String[] pat = {"[сc]", "[аa]", "[нh]", "[рp]", "[мm]", "[уy]", "[кk]", "[еe]", "[шщ]", "[хx]", "[ъь]", "[вb]", "[яr]", "[иn]", "[тt]", "[0oоq]", "[3з]"};
            ArrayList<Pattern> lists = new ArrayList<Pattern>();

            for (int i = 0; i < pat.length; i++) {
                  lists.add(Pattern.compile(pat[i], Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE));
            }

            for (int i = 0; i < pat.length; i++) {
                  string = lists.get(i).matcher(string).replaceAll(pat[i]);
            }

            return string;
      }

      protected String make(String sources) {
            Pattern numeral = Pattern.compile("^\\d+$");
            String[] split = sources.split(" ");
            for (int ii = 0; ii < split.length; ii++) {
                  split[ii] = dirtySpelling(split[ii]);

                  Matcher matcher = numeral.matcher(split[ii]);
                  if (ii != 0) {

                        if (matcher.find()) {
                              sources = sources + "(?:[0-9])*[^a-zа-я0-9]*";
                        } else {
                              sources = sources + "(?:\\b" + split[ii] + "\\b){1}[^a-zа-я0-9]*";
                        }

                  } else {

                        if (matcher.find()) {
                              sources = "[^a-zа-я0-9]*(?:[0-9])*[^a-zа-я0-9]*";
                        } else {
                              sources = "[^a-zа-я0-9]*(?:\\b" + split[ii] + "\\b){1}[^a-zа-я0-9]*";
                        }

                  }
            }
            return sources;
      }

      protected String normalize(String sources) {
            sources = symbols.matcher(sources).replaceAll(" ");
            sources = space.matcher(sources).replaceAll(" ");
            sources = sources.trim();
            return sources;
      }

}


дефолтный обработчик

Код

public class DefaultNoFunctionBuilder extends AbstractBuilder {

      public String execute(String sources) {
            sources = normalize(sources);
            return make(sources);
      }

}




класс хелпер

Код

import java.util.regex.Pattern;


public class Halper extends AbstractBuilder {

      private static final Pattern pattern1 = Pattern.compile("^\\$SPLIT\\$.+$");

      private static final Pattern pattern2 = Pattern.compile("^.+\\$SPLIT\\$$");

      private static final Pattern pattern3 = Pattern.compile("^\\$SPLIT\\$.+\\$SPLIT\\$$");

      private static final Pattern norm = Pattern.compile("[^\\$A-Za-zА-Яа-я0-9]");

      public String execute(String params) {
            String total = "";

            params = norm.matcher(params).replaceAll(" ");
            params = space.matcher(params).replaceAll(" ");

            if (pattern3.matcher(params).find()) {
                  total += proc2(params);
            } else {
                  if (pattern1.matcher(params).find()) {
                        total += proc3(params);
                  } else if (pattern2.matcher(params).find()) {
                        total += proc4(params);
                  } else {
                        total += proc(params);
                  }
            }

            return total;
      }

      private String proc(String params) {
            String total = "";
            String[] arr = params.split("\\$SPLIT\\$");

            String s = "";
            for (int i = 0; i < arr.length; i++) {
                  if ("".equalsIgnoreCase(total)) {
                        s = arr[i].trim();
                        if (!"".equalsIgnoreCase(s)) {
                              total += make(s);
                        }
                  } else {
                        s = arr[i].trim();
                        if (!"".equalsIgnoreCase(s)) {
                              total += "$SPLIT$" + make(s);
                        }
                  }
            }
            return total;
      }

      private String proc2(String params) {
            String total = "";
            String[] arr = params.split("\\$SPLIT\\$");

            String s = "";
            for (int i = 0; i < arr.length; i++) {
                  s = arr[i].trim();
                  if (!"".equalsIgnoreCase(s)) {
                        total += "$SPLIT$" + make(s);
                  }
            }
            total += "$SPLIT$";
            return total;
      }

      private String proc3(String params) {
            String total = "";
            String[] arr = params.split("\\$SPLIT\\$");

            String s = "";
            for (int i = 0; i < arr.length; i++) {
                  s = arr[i].trim();
                  if (!"".equalsIgnoreCase(s)) {
                        total += "$SPLIT$" + make(s);
                  }
            }
            return total;
      }

      private String proc4(String params) {
            String total = "";
            String[] arr = params.split("\\$SPLIT\\$");

            String s = "";
            for (int i = 0; i < arr.length; i++) {
                  if ("".equalsIgnoreCase(total)) {
                        s = arr[i].trim();
                        if (!"".equalsIgnoreCase(s)) {
                              total += make(s);
                        }
                  } else {
                        s = arr[i].trim();
                        if (!"".equalsIgnoreCase(s)) {
                              total += "$SPLIT$" + make(s);
                        }
                  }
            }
            total += "$SPLIT$";
            return total;
      }

      public String spelling(String string) {
            return dirtySpelling(string);
      }

      public String normal(String sources) {
            return normalize(sources);
      }

}


самый простейший способ использования 

Код

import java.util.regex.Matcher;
import java.util.regex.Pattern;




public class NewClass {

      private static final Pattern pattern = Pattern.compile("^[0-9]+$");

      public static void main(String[] s) {
            RegexBuilder rb = new RegexBuilder();
            rb.addBuilder("ANY_SYMBOL", new AbstractBuilder() {

                  public String execute(String params) {
                        String total = "";
                        Matcher matcher = pattern.matcher(params);
                        if (!matcher.find()) {
                              throw new IllegalArgumentException("Invalid syntax");
                        }

                        if ("0".equalsIgnoreCase(params)) {
                              total = ".*";
                        } else {
                              total = ".{0," + params + "}";
                        }

                        return total;
                  }

            });
            Pattern p = rb.build("привет ${ANY_SYMBOL[0]}как дела");
            System.out.println(p.toString());
      }

}


честно пытался сделать больше коментовsmile
PM MAIL   Вверх
AstRonin
Дата 2.8.2010, 22:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 27.7.2010

Репутация: нет
Всего: нет



А обязательно код сюда выкладывать, или можно в code.google.com, а сюда просто ссылку?

на ихнем серваке удобно репозитарий создавать.
PM MAIL   Вверх
sergejzr
Дата 13.10.2010, 18:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 6
Всего: 360



Превращение значений SVM в вероятности с помощью правильно параметризованной sigmoid  функции. Можно так сказать, нормализация любого интервала в интервал [0,1]

По мотивам:
Probabilistic Outputs for Support Vector machines and Comparisions to Regularized Likelihood Methods
By: John C.Platt March 26 1999

Код

package normalisation;

/**
 * Java Implementation of the probabilistic output for SVM classifiers Described
 * in: Probabilistic Outputs for Support Vector machines and Comparisions to
 * Regularized Likelihood Methods By: John C.Platt March 26 1999
 * 
 * @author sergejzr
 * 
 */

public class PlattSigmoidNormalization {

    /**
     * 
     * @param out
     *            - array of SVM outputs
     * @param target
     *            - array of booleans: is ith example a positive example?
     * @param prior1
     *            - number of positive examples
     * @param prior0
     *            - number of negative examples
     * @return Sigmoid function which will map classifier outputs to a
     *         probability value [0,1]
     */
    public SigmoidFunction getSigmoid(double[] out, boolean[] target,
            int prior1, int prior0) {

        double A = 0;
        double B = Math.log((prior0 + 1) / (double) (prior1 + 1));
        double hiTarget = (prior1 + 1) / (double) (prior1 + 2);
        double loTarget = 1. / (prior0 + 2);
        double lambda = 0.00000000001;//Double.MIN_VALUE;
        double olderr = Double.MAX_VALUE;
        double[] pp = new double[out.length];

        setAll(pp, (prior1 + 1) / (double) (prior0 + prior1 + 2));

        int count = 0;
        for (int it = 0; it < 100; it++) {
            double a = 0, b = 0, c = 0, d = 0, e = 0;
            // First compute Hessian & gradient of error function
            for (int i = 0; i < target.length; i++) {
                double t = target[i] ? hiTarget : loTarget;
                double d1 = pp[i] - t;
                double d2 = pp[i] * (1 - pp[i]);
                a += out[i] * out[i] * d2;
                b += d2;
                c += out[i] * d2;
                d += out[i] * d1;
                e += d1;
            }
            // If gradient is really tiny, then stop
            if (Math.abs(d) < 0.0001 && Math.abs(e) < 0.0001) {
                break;
            }
            double oldA = A;
            double oldB = B;
            double err = 0.;
            // Loop until goodness of fit increases
            while (true) {
                double det = (a + lambda) * (b + lambda) - c * c;
                if (det == 0) {// If determinant of Hessian is zero
                    // increase stabilizer
                    lambda *= 10;
                    continue;
                }
                A = oldA + ((b + lambda) * d - c * e) / det;
                B = oldB + ((a + lambda) * e - c * d) / det;
                // Now compute the goodness of fit
                err = 0;
                for (int i = 0; i < out.length; i++) {
                    double t = target[i] ? hiTarget : loTarget; // ?
                    double p = 1. / (1 + Math.exp(out[i] * A + B));
                    pp[i] = p;
                    // At this step make sure the lod returnes -200
                    err -= t * Math.log(p) + (1 - t) * Math.log(1 - p);
                }
                if (err < olderr * (1 + Math.exp(-7))) {
                    lambda *= .1;
                    break;
                }
                // error did not decrease:increase stabilizer bx fsctor of 10
                // &try again
                lambda *= 10;
                if (lambda >= Math.exp(6)) // something is broken. Give up
                {
                    break;
                }
            }
            double diff = err - olderr;
            double scale = .5 * (err + olderr + 1);
            if (diff > -1 * Math.exp(-3) * scale && diff < Math.exp(-7) * scale) {
                count++;
            } else {
                count = 0;
            }
            olderr = err;
            if (count == 3) {
                break;
            }

        }
        return new SigmoidFunction(A, B);
    }

    /**
     * Simplified version
     * @param examples positive examples are greater 0, negative examples are smaller 0
     * @return
     */
    public SigmoidFunction getSigmoid(double[] examples)
    {
        boolean target[]=new boolean[examples.length];
        int prior1=0,prior0=0;
        for(int i=0;i<examples.length;i++)
        {
            target[i]=examples[i]>0;
            if(target[i])
            {
                prior1++;
            }else
            {
                prior0++;
            }
        }
        return getSigmoid(examples,target,prior1,prior0);
    }

    private void setAll(double[] PP, double d) {
        for (int i = 0; i < PP.length; i++) {
            PP[i] = d;
        }

    }

    public static void main(String[] args) {
        PlattSigmoidNormalization pn = new PlattSigmoidNormalization();

        
        
         SigmoidFunction sm = pn.getSigmoid(new double[] { -200, 5.6, 7.0 });
        print(sm, (-1));
        print(sm, (4));
        print(sm, (-3));
        print(sm, (5));
        print(sm, (-6));
        print(sm, (10));
        print(sm, (7));
        print(sm, (2));
        print(sm, (0.5));

    }

    private static void print(SigmoidFunction sm, double val) {
        double res = sm.getValue(val);
        System.out.println(val + "->" + res);

    }

    public SigmoidFunction getSigmoid(Double[] vals) {
        double hlp[]=new double[vals.length];
        
        for(int i=0;i<vals.length;i++)
        {
            hlp[i]=vals[i];
        }
        return getSigmoid(hlp);
    }
}



class SigmoidFunction {

    double A, B;

    public SigmoidFunction(double a, double b) {
        super();
        A = a;
        B = b;
    }

    public double getA() {
        return A;
    }

    public double getB() {
        return B;
    }

    public double getValue(double d) {
        return 1. / (1 + Math.exp(A * d + B));

    }

}



Может кому пригодится. В принципе эта бяка подойдёт для любого сценарии, где надо значения любого интервала преобразовать в интервал [0,1]. 
Смысл в том, что мы тренируем функцию с помощью нескольких значений - примеров и она уже в свою очередь любое значение поместит в интервал[0,1].


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
sergejzr
Дата 23.10.2010, 02:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 6
Всего: 360



Выдаёт случайные не повторяющиеся значения из заданного интервала. Если у Вас очень большой массив, а вам надо случайным образом достать несколько не повторяющихся значений, то это для Вас. С помощью shuffle в принципе может сделать то же самое, но на больших массивах это будет довольно медленно.
Код

package classification;

import java.util.Random;
/**
 * Returns elements in random order.
 * Basically one could do this with "Collections.shuffle", 
 * however this one is more efficient as it avoids shuffling large collections
 * @author sergejzr
 *
 */
public class RandomLinear {
    int[] pool;
    int interval;
    Random r = new Random();
    private int min;

    public RandomLinear(int min, int max) {
        this.min=min;
        interval = max - min;
        pool = new int[interval];
        for (int i = 0; i < interval; pool[i] = i, i++)
            ;
    }
/**
 * Returnes the next random index from the pool. Will throw exception if no more elements are available
 * @return
 */
    public int nextRandom() {

        int ind = r.nextInt(interval);
        int ret = pool[ind];
        
        pool[ind] = pool[interval - 1];        
        interval--;
        
        return ret+min;
    }
    public static void main(String[] args) {
        
        String input[]=new String[]{"The", "quick", "brown", "fox", "jumps", "over", "the", "lazy", "dog"};
        //Quickly shuffle the elements
        RandomLinear rs=new RandomLinear(0, input.length);
        
        for(int i=0;i<input.length;i++)
        {
            System.out.println(input[rs.nextRandom()]);
        }
        
    }
}




--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
leniviy
Дата 7.4.2011, 16:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 552
Регистрация: 8.2.2003
Где: Спб

Репутация: нет
Всего: 5



Мне чем-то не понравились существующие реализации, поэтому сделал свой LoggerOutputStream 
Код

    /**
     * Stream sending data to the logger. Recognizes common line endings and
     * logs a message for each line. Incomplete lines are cached until EOL or
     * flush().
     * 
     */
    public class LoggerOutputStream extends ByteArrayOutputStream {
        CharsetDecoder decoder = Charset.defaultCharset().newDecoder();

        String prev = "";
        
        Level level;
        Logger log;
        
        public LoggerOutputStream(Logger log, Level level) {
            super();
            this.level = level;
            this.log = log;
        }
        
        void println(String s) {
            log.log(level, s);
        }

        static final String[] LSs = {
            "\r\n",  
            "\n\r",
            "\n",
            "\r"
          };
      int[] findEol(String prev, int fromIndex) {
          int ix_eol = -1;
          int ix_nl = -1;

          for (String ls : LSs) {
              int i1 = prev.indexOf(ls, fromIndex);
              if (i1 > -1 && (ix_eol == -1 || i1 < ix_eol)) {
                  ix_eol = i1;
                  ix_nl = ix_eol + ls.length();
              }
          }
          
          return new int[] { ix_eol , ix_nl };
      }
      
      public void flush() throws IOException {
          super.flush();
          byte[] buf = this.toByteArray();
          CharBuffer out = decoder.decode(ByteBuffer.wrap(buf, 0, buf.length));
          prev = prev + out.toString();  
          this.reset();
          
          int i1 = 0;
          int i2;
          int[] a;
          while ((i2 = (a = findEol(prev, i1))[0]) > -1) {
              println(prev.substring(i1, i2));
              i1 = a[1];
          }
          if (i1 > 0) {
              prev = prev.substring(i1);
          }
      }
        
      public void close() throws IOException {
          super.close();
          if (prev.length() > 0) {
              println(prev);
          }
      }

      /**
       * 
       * @param category "stdout" or "stderr"
       * @param level "INFO" or "WARN"
       * @return
       */
      public static PrintStream getPrintStream(String category, String level) {
       return new PrintStream(new LoggerOutputStream(Logger.getLogger(category), Level.toLevel(level)), true);       
      }
    
    }



Код

System.setErr(LoggerOutputStream.getPrintStream("stderr", "WARN"));
System.setOut(LoggerOutputStream.getPrintStream("stdout", "INFO"));

System.out.print("f1 ");
System.err.print("e1 ");

System.out.print("f2 ");
System.err.print("e2 ");

System.out.print("f3");
System.err.print("e3");

System.out.println();
System.err.println();


Код

17:08:51,796  INFO stdout - f1 f2 f3
17:08:51,796  WARN stderr - e1 e2 e3



Это сообщение отредактировал(а) leniviy - 7.4.2011, 16:24
PM MAIL   Вверх
Mirkes
Дата 10.2.2012, 11:15 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 586
Регистрация: 18.8.2011
Где: Красноярск

Репутация: 7
Всего: 17



Название: Библиотека классов для отображения графиков (легкая)
Тип: Библиотека классов.
Язык: Java
Версия JDK: 1.6
Требуемые библиотеки: нет
Автор: Mirkes
 
На форуме несколько раз поднимался вопрос о "легкой" библиотеке для отрисовки графиков. Однако каждый раз "легкого" решения не находиось и люди писали все сами. Мне тоже пришлось написать самому. Писал под конкретную задачу, поэтому, к сожалению, все описание и комментарии на плохом английском.

Пример применения
Код

import graph.MainGraphPane;

import java.awt.BorderLayout;
import java.awt.Dimension;

import javax.swing.JFrame;
import javax.swing.UIManager;


public class GraphFrameDemo extends JFrame {
    public GraphFrameDemo() {
        super("My graph demo");
        getContentPane().setLayout(new BorderLayout());
        setSize(new Dimension(400, 300));
        setLocationRelativeTo(null);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        // создаем главную панель диаграммы
        MainGraphPane mgp = new MainGraphPane();
        // готовим данные для отрисовки
        double[] x = new double[1000], sin = new double[1000], cos = new double[1000];
        for (int i=0;i<1000;i++){
            x[i]=Math.toRadians(i);
            sin[i]=Math.sin(x[i]);
            cos[i]=Math.cos(x[i]);
        }
        // Передаем данные для отображения
        mgp.addRow("sin", x, sin);
        mgp.addRow("sin", x, cos);

        add(mgp,BorderLayout.CENTER);
        setVisible(true);
    }

    public static void main(String[] args) {
        try {
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        } catch (Exception e) {
            e.printStackTrace();
        }
        new GraphFrameDemo();
    }
}


Не совсем уверен в разумности выкладывания таких длинных текстов. Для желающих прилагаю архив библиотеки
Поскольку длина превысила максимально допустимую текст библиотеки удалил

Присоединённый файл ( Кол-во скачиваний: 5 )
Присоединённый файл  graph.rar 14,36 Kb


--------------------
Mirkes
PM MAIL   Вверх
mstalker26
Дата 10.2.2012, 12:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 206
Регистрация: 4.7.2009

Репутация: 4
Всего: 11



надеюсь здоровая критика принимается. Библиотеку пока не смотрел  smile , GUI-приложение лучше запускать так
Код

SwingUtilities.invokeLater(new Runnable() {
  public void run() {
    GraphFrameDemo();
  }
});


http://docs.oracle.com/javase/tutorial/uis...cy/initial.html
--------------------
Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
PM   Вверх
jk1
Дата 10.2.2012, 12:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1168
Регистрация: 17.10.2008
Где: Санкт-Петербург

Репутация: 40
Всего: 75



Из чистого любопытства: а чем не устроил jGraph?


--------------------
Opinions are like assholes — everybody has one
PM MAIL   Вверх
Mirkes
Дата 10.2.2012, 18:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 586
Регистрация: 18.8.2011
Где: Красноярск

Репутация: 7
Всего: 17



Цитата(jk1 @ 10.2.2012,  12:44)
Из чистого любопытства: а чем не устроил jGraph?

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

Цитата(mstalker26 @  10.2.2012,  12:37 Найти цитируемый пост)
надеюсь здоровая критика принимается. Библиотеку пока не смотрел   , GUI-приложение лучше запускать такКод


Согласен. 
Этот пример сделал только для выкладывания.

Это сообщение отредактировал(а) Mirkes - 10.2.2012, 18:49


--------------------
Mirkes
PM MAIL   Вверх
Mirkes
Дата 24.5.2013, 19:46 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 586
Регистрация: 18.8.2011
Где: Красноярск

Репутация: 7
Всего: 17



Сегодня я узнал, почему мне не подходит jGraph - он строит ГРАФЫ, а не графики smile


--------------------
Mirkes
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.6455 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.