Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java tools & IDE's > как задать значения данных для класса?(НетБинс)


Автор: millenium_11 17.11.2006, 15:43
Добрый день!
Я пишу под НетБинс ИДЕ 5.5 (тематика - расширение функциональности). Подскажите решение следующей проблемы: в layer.xml декларируется класс SIECFGEditorKit(), инстанс которого создается при загрузке ИДЕ:
Код
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE filesystem PUBLIC "-//NetBeans//DTD Filesystem 1.1//EN" "http://www.netbeans.org/dtds/filesystem-1_1.dtd">
<filesystem>
 ..............................   
    <folder name="Editors">
        <folder name="text">
            <folder name="x-translations-batch">
                <folder name="CompletionProviders">
                    <file name="com-sieconfig-completion-SIECFGCompletionProvider.instance"/>
                </folder>
                <attr name="SystemFileSystem.localizingBundle" stringvalue="com.sieconfig.Bundle"/>
                 ..............................   
                <file name="SIECFGEditorKit.instance">
                    <attr name="instanceClass" stringvalue="com.sieconfig.recognize.SIECFGEditorKit"/>
                </file>
            </folder>            
        </folder>
    </folder>    
 ..............................
</filesystem>


Текст класса:
Код
package com.sieconfig.recognize;

import javax.swing.text.Document;
import org.netbeans.editor.Syntax;
import org.netbeans.modules.editor.NbEditorKit;
import com.sieconfig.syntax.SIECFGSyntax;
import org.openide.ErrorManager;

public class SIECFGEditorKit extends NbEditorKit{
    private static final ErrorManager LOGGER = ErrorManager.getDefault().getInstance("com.sieconfig.recognize.SIECFGEditorKit");
    private static final boolean LOG = LOGGER.isLoggable(ErrorManager.INFORMATIONAL);    
    public static final String MIME_TYPE = null;
        
    public SIECFGEditorKit() {
    }
    
    public Syntax createSyntax(Document doc) {
        if (LOG) {
            LOGGER.log(ErrorManager.INFORMATIONAL, "createSyntax"); // NOI18N
        }
        return new SIECFGSyntax();
    }
}


Можно ли изменить Layer.xml так, чтобы при создании инстанса этого класса  SIECFGEditorKit() можно было задать значение для MIME_TYPE?


Автор: millenium_11 22.11.2006, 17:16
Чё, неужели никто не знает ответ на вопрос?  smile 

Автор: millenium_11 23.11.2006, 19:15
Ладно, тема закрыта. Приблизительно я  разобралась.

Все равно всем спасибо!

Автор: LSD 23.11.2006, 20:20
Цитата(millenium_11 @  23.11.2006,  19:15 Найти цитируемый пост)
Ладно, тема закрыта. Приблизительно я  разобралась.

Поделись решением, может еще кому пригодится smile

Автор: millenium_11 24.11.2006, 12:21
хорошо, поделюсь....

От разработчиков НетБинса получила такой ответ:

I suppose you could create a factory method creating an SIECFGEditorKit 
initialized the way you need: 
Код
public class SIECFGEditorKit extends NbEditorKit{ 

     private SIECFGEditorKit(String mimeType) { 
         MIME_TYPE = mimeType; 
     } 

     public SIECFGEditorKit createTextXSomething() { 
         return new SIECFGEditorKit("text/x-something"); 
     } 

     ... 
}
 
and register this method in the layer: 
Код
<file name="SIECFGEditorKit.instance"> 
     <attr name="instanceClass" 
stringvalue="com.sieconfig.recognize.SIECFGEditorKit"/> 
     <attr name="instanceCreate" 
methodvalue="com.sieconfig.recognize.SIECFGEditorKit.createTextXSomething"/> 
</file>
 


Но описанное выше - не то, что мне нужно. Я постаралась перефразировать вопрос: "можно ли, используя layer.xml, создать инстанс какого-либо класса и передать в его конструктор, например, строковый параметр?"
Мне ответили: "I don't know of any way to do that."

Поиски решения продолжаются...

Автор: powerOn 24.11.2006, 20:58
Цитата(millenium_11 @  24.11.2006,  12:21 Найти цитируемый пост)
Я постаралась перефразировать вопрос: "можно ли, используя layer.xml, создать инстанс какого-либо класса и передать в его конструктор, например, строковый параметр?"

А может это параметр читать самостоятельно из какого-нибудь другого файла (типа properties)? Или обязательно через layer.xml нужно? 

Автор: millenium_11 27.11.2006, 15:33
Всем здрасьте!
Я окончательно и красиво разобралась в вопросе!  smile 

Исходник класса, для которого я хочу задавать значение MIME_TYPE до того, как вызову его конструктор:
Код
package com.sieconfig.recognize;
import javax.swing.text.Document;
import org.netbeans.modules.editor.NbEditorKit;

public class SIECFGEditorKit extends NbEditorKit {    
    public static String MIME_TYPE;
    
    public SIECFGEditorKit(String MIME_TYPE) {
        setMimeType(MIME_TYPE);
    }    
     ...........    
    public String  getContentType() {
        return MIME_TYPE;
    }

    private void setMimeType(String MIME_TYPE) {
        this.MIME_TYPE = MIME_TYPE;
    }
    
}

Создала следующий класс (фабрику):
Код
package com.sieconfig.recognize;
import javax.swing.text.Document;
import org.openide.filesystems.FileObject;

public class SIECFGEditorKitFactory extends SIECFGEditorKit {
    private static String MIME_TYPE;
    
    public SIECFGEditorKitFactory() {
        super(MIME_TYPE);
    }
    
    private static void configure(FileObject inst) {
        MIME_TYPE = (String) inst.getAttribute("mimeType");
    }
}

В файле layer.xml создается экземпляр класса com.sieconfig.recognize.SIECFGEditorKitFactory, который будет называться SIECFGEditorKit.instance. После этого вызывается метод configure() данного класса, в котором из этого же layer.xml считывается значение атрибута mimeType в поле MIME_TYPE! Все гениальное - просто! Ура!
Код
<file name="SIECFGEditorKit.instance">
                    <attr name="instanceClass" stringvalue="com.sieconfig.recognize.SIECFGEditorKitFactory"/>
                    <attr name="instanceCreate" methodvalue="com.sieconfig.recognize.SIECFGEditorKitFactory.configure"/>
                    <attr name="mimeType" stringvalue="text/x-translations-batch"/>
                    <attr name="instanceOf" stringvalue="org.netbeans.modules.editor.NbEditorKit"/>
                </file>

В атрибуте instanceOf прописываются классы, наследниками которых является создаваемый класс, либо интерфейсы, которые он имплементит.

P.S. источник информации, на который я опиралась, находится по адресу:
http://www.netbeans.org/download/dev/javadoc/org-openide-util/org/openide/util/doc-files/api.html

P.P.S. наверняка здеть что-то коряво, но я ведь пока еще не волшебник... Зато работает!  smile 

Автор: LSD 27.11.2006, 15:47
Цитата(millenium_11 @  27.11.2006,  15:33 Найти цитируемый пост)
Я окончательно и красиво разобралась в вопросе!

Поздравляю smile 

Автор: millenium_11 27.11.2006, 15:50
Примечание 1. Таким образом можно установить значение только для ststic-переменной в stаstic-методе.
Примечание 2. Если переменная, для которой Вы хотите установить значение, будет не стринговая, то необходимо также правильно подобрать соответствующий тип в xml-файле. Т.е., например, если бы я хотела присвоить значение ЛОЖЬ некой переменной public static boolean bol класса SIECFGEditorKitFactory, вызвав метод этого класса configureBoolean(), то в xml'е прописала бы следующее:
Код
<file name="SIECFGEditorKit.instance">
  <attr name="instanceClass" stringvalue="com.sieconfig.recognize.SIECFGEditorKitFactory"/>
  <attr name="instanceCreate" methodvalue="com.sieconfig.recognize.SIECFGEditorKitFactory.configure"/>
  <attr name="bolVal" boolvalue="false"/>
  <attr name="instanceOf" stringvalue="org.netbeans.modules.editor.NbEditorKit"/>
</file>


а в SIECFGEditorKitFactory.class надо добавить объявление поля:
public static boolean bol;
и такой метод:
Код
private static void configureBoolean(FileObject inst) {
  bol = (Boolean) inst.getAttribute("bolVal");
}

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)