Xpoint
   [напомнить пароль]

Градиент, Экономия ресурсов в апплете

Метки: [без меток]
[арх]
2008-07-23 17:58:45 [обр] TKV(4/12)[досье]

Имеется - график, диаграмма столбиками. Понадобилось сделать каждый столбик градиентом. Сейчас делаю так

float[] fractions = {0.2f,0.4f, 0.8f};
Color greenAlpha = new Color(33, 116, 6, 220);
Color greenLightAlpha = new Color(169, 223, 153, 220);
Color[] colors = {greenAlpha, greenLightAlpha, greenAlpha};

  for(int i = 0, j = start; i < xCoords.size(); i++, j++) {
     LinearGradientPaint redtowhite = new LinearGradientPaint(xCoords.get(i), 0,    xCoords.get(i) + barWidth,0, fractions, colors, CycleMethod.REPEAT);
     g2d.setPaint(redtowhite); 

     int height = (int)(ratio * chartList.get(j).getValues().get(1));
     int y = bounds.height - (PADDING_BOTTOM + height);
     g2d.fillRect(xCoords.get(i), y, barWidth, height);
          
}

Проблема в том что каждый раз приходится создавать новый объект LinearGradientPaint
что сказывается на быстродействии... Можно как-то по другому это решить.
И еще, можно как-то по другому прозрачность сделать?

спустя 3 часа 7 минут [обр] TKV(4/12)[досье]
Еще один вопрос по ходу... Сейчас понадобилось чтобы при наведении на какой-либо столбик на графике, всплывала информация о нем. Пошел по следующему пути - вместо рисования прямоугольника стал добавлять объект, наследующий Component и видимо повешу на него обработчики событий типа mouseover mouseout, на сколько вообще правильно данное решение?? Может быть есть какие-нибудь, более правильные решения?
Спасибо.
спустя 20 часов [обр] TKV(4/12)[досье]
Еще одна проблема к сожалению... Вообще может кто-нибудь помочь? ))
Никогда с этим не сталкивался, но с удивлением обнаружил что для каждой копии апплета, статические поля, данного класса являются общими... Что по всей видимости происходит из за того что апплеты работают в рамках одной виртуальной машины? Вот как-то так я себе это представляю, поправьте если не прав. Как бы решить эту проблему? Хочется все же чтобы статические поля в разных апплетах, не были общими для разных инстансов...
спустя 4 часа 48 минут [обр] TKV(4/12)[досье]
Помощи не дождался... Плавающий попап пришлось реализовывать своими силами. Но остальные вопросы пока актуальны. :)
спустя 11 часов [обр] GRAy(14/259)[досье]

TKV[досье]

Хочется все же чтобы статические поля в разных апплетах, не были общими для разных инстансов...

Не использовать статические поля ;). Можно использовать например ThreadLocal переменные.

спустя 5 дней [обр] TKV(4/12)[досье]
GRAy[досье] убрал всю статику, кроме final полей...
Не очень удобно, пришлось везде ссылки передавать... ) ThreadLocal гляну что такое, спасибо
спустя 2 часа 32 минуты [обр] TKV(4/12)[досье]
Блин, косяк...
GRAy[досье] у меня два потока... Основной, само собой и еще один, который параллельно работает... Так вот этот второй поток не может получить доступ к объекту ThreadLocal основного потока... Что делать?
спустя 12 часов [обр] GRAy(14/259)[досье]

Хм. У вас довольно противоречивые требования ;)
С одной стороны вы хотите чтобы группа потоков которая порождена одним апплетом не могла видеть данные из группы потоков другого портлета, при этом вы хотите обмениваться информацией внутри каждой из групп.
Как вы реализовали хранение общих переменных с помощью ThreadLocal? Я подозреваю, что просто заменили static SomeClass someVar, на static ThreadLocal someVar - это правильно. Для того чтобы реализовать то что вам требуется в итоге, можно попробовать реализовать ThreadGroupLocal класс по образу и подобию ThreadLocal, т.е. например так:

import java.util.HashMap;

public abstract class ThreadGroupLocal<T>
{
    private HashMap<ThreadGroup, T> map;

    public ThreadGroupLocal()
    {
        map = new HashMap<ThreadGroup, T>();
    }

    public T get()
    {
        T result = null;
        ThreadGroup group = Thread.currentThread().getThreadGroup();
        synchronized (map)
        {
            result = map.get(group);
            if (result == null)
            {
                result = initialValue();
                map.put(group, result);
            }
        }
        return result;
    }

    public void set(T obj)
    {
        map.put(Thread.currentThread().getThreadGroup(), obj);
    }

    public abstract T initialValue();
}

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

спустя 5 часов [обр] TKV(4/12)[досье]
GRAy[досье] спасибо, просто и красиво. Остается один вопрос, на сколько это оправданно? ))
спустя 24 минуты [обр] TKV(4/12)[досье]
GRAy[досье] к сожалению обнаружилось что ThreadGroup для вроде бы разных инстансов один и тот же ))
спустя 13 минут [обр] TKV(4/12)[досье]
Единственное - надо убедиться, что два апплета работают в разных группах потоков (логично ожидать этого, но мало-ли).
хаха... вот когда это "но мало-ли" все таки срабатывает... грустно :(
спустя 14 минут [обр] GRAy(14/259)[досье]
TKV[досье] А использовать сам экземпляр апплета в качестве хранилища ваших общих переменных вы не хотите?
import java.applet.Applet;
import java.util.HashMap;

public class MyApplet extends Applet {

private HashMap registry;

public void init() {
  registry = new HashMap();
}

public synchronized Object getContextVar(Object key){
  return registry.get(key);
}

public synchronized void setContextVar(Object key, Object value){
  registry.put(key, value);
}

public void start() {}

public void stop() {}

public void destroy() {}
}
спустя 7 минут [обр] TKV(4/12)[досье]
GRAy[досье] а как я получу доступ к экземпляру апплета? Все равно ведь придется его по ссылке передавать... ) Нет?
спустя 5 минут [обр] TKV(4/12)[досье]
Бред вообще... Не могу сделать нормальный синглтон... ) эх...
спустя 1 час 56 минут [обр] GRAy(14/259)[досье]
TKV[досье] Да, придётся, но это НМВЗ наиболее правильный подход в данной ситуации.
спустя 51 минуту [обр] TKV(4/12)[досье]

Вопрос чисто ради интереса, зачем вообще так сделали? Это что какая-то экономия ресурсов системы?...

GRAy[досье] а что в вашей конструкции в качестве ключа можно использовать?...

Powered by POEM™ Engine Copyright © 2002-2005