2 Взаимосвязанных вопроса: Java+OpenOffice,JTable
От: Delfin4es  
Дата: 16.03.08 17:50
Оценка:
Доброго времени суток!
Сразу прошу не ругать сильно,ибо подобное уже обсуждалось. В том числе и на этом форуме, но конкретного решения не нашел.
Программа взаимодействует c openoffice calc, подгружая данные в JTable.
Возникло две проблемы
1) Неполадки с динамическим добавлением строк в таблицу(ибо не знаю заранее, сколько строк в подгружаемой странице.
2) Как запустить openoffice в фоновом режиме?
Но, обо всем по порядку.
Исходный код:
//создание глобальной переменно типа модели таблицы
mdTable myModel;
// в конструкторе класса:
...
myModel = new mdTable();
dTable = new JTable(myModel);

// определяю класс,наследуемый от AbstractTableModel для создания таблицы
class mdTable extends AbstractTableModel
    {
        final String [] columnNames = {"Наименование показателей", "Что характеризует","Интерпретация показателей","На начало периода", "На конец периода"};
        Vector data = new Vector();
        
        boolean[] canEdit = new boolean [] {false, false, false, false, false};
        
        public int getColumnCount() {
            return columnNames.length;
        }
        
        public int getRowCount() {
            return data.size(); //length;
        }

        public String getColumnName(int col)
        {
            return columnNames[col];
        }
     
        public Class getColumnClass(int column)
        { 
            switch (column)
            { 
                case 3: return Float.class; 
                case 4: return Float.class; 
                case 5: return Float.class; 
                case 6: return Float.class; 
                default: return Object.class; 
            } 
        } 

        public Object getValueAt(int row, int col)
        {
            //if (=null)        
            Vector tv;
            tv = (Vector) data.get(row);
            if(tv.isEmpty() == true )  return null;
            Object o = tv.get(col);
                    
            if (o != null)
            {
                switch (col)
                {
                    case 0: 
                    case 1:
                    case 2:
                        return new String ( o.toString());
                    case 3:
                    case 4:
                    case 5:
                    case 6:
                        return new Float (o.toString());
                    default:
                        return  o;                   
                } 
            }
            else return null;
        }
// процедура загрузки данных в таблицу dTable
private void loadData(String sURL) throws java.lang.Exception
    {
        
        try {
            // get the remote office component context
            xRemoteContext = com.sun.star.comp.helper.Bootstrap.bootstrap();
            System.out.println("Connected to a running office ...");
                
            xRemoteServiceManager = xRemoteContext.getServiceManager();
        }
        catch( Exception e) {
            e.printStackTrace();
            //System.exit(1);
        }
        try {
            Object desktop = xRemoteServiceManager.createInstanceWithContext(
                "com.sun.star.frame.Desktop", xRemoteContext);
            
            XComponentLoader xComponentLoader = (XComponentLoader)
                UnoRuntime.queryInterface(XComponentLoader.class, desktop);
             
            PropertyValue[] loadProps = new PropertyValue[0];
            XComponent xSpreadsheetComponent = xComponentLoader.loadComponentFromURL(sURL, "_blank", 0, loadProps);
            XSpreadsheetDocument xSpreadsheetDocument = (XSpreadsheetDocument)
                UnoRuntime.queryInterface(XSpreadsheetDocument.class,
                                          xSpreadsheetComponent);
            Object sheets = xSpreadsheetDocument.getSheets();
            XIndexAccess xIndexedSheets = (XIndexAccess)UnoRuntime.queryInterface(
                XIndexAccess.class, sheets);
            Object sheet =  xIndexedSheets.getByIndex(0);
            XSpreadsheet xSpreadsheet = (XSpreadsheet)UnoRuntime.queryInterface(XSpreadsheet.class, sheet);
            XCell xCell = null;
            XText xCellText = null;
            Vector ms;
                  
                    
            // Добавляем новую строку 

            for (int i = 23; i < 100; i++)
            {
                
                ms  = new Vector();
                xCell = xSpreadsheet.getCellByPosition(1, i);
                if (xCell.getValue()==700)
                {
                    xCell = xSpreadsheet.getCellByPosition(0, i);
                    xCellText = (XText)UnoRuntime.queryInterface(XText.class, xCell);
                   
                    ms.add(xCellText.getString());
                    for (int j = 1; j < 4; j++)
                    {
                        xCell = xSpreadsheet.getCellByPosition(j, i);
                        //dTable.setValueAt(xCell.getValue(), i-23, j);
                        ms.add(xCell.getValue());
                    }
                    
                    myModel.addRow(ms);
                    break;
                }
                    
                else
                {   
                    
                    xCell = xSpreadsheet.getCellByPosition(0, i);
                    xCellText = (XText)UnoRuntime.queryInterface(XText.class, xCell);
                    ms.add(xCellText.getString());
                    
                    for (int j = 1; j < 4; j++)
                    {
                        xCell = xSpreadsheet.getCellByPosition(j, i);
                        if (xSpreadsheet.getCellByPosition(1, i).getValue() != 0)
                        {
                            
                            ms.add(xCell.getValue());
                        }
                        else 
                        {
                            ms.add(null);
                        }
                        
                    }
                   myModel.addRow(ms);
                                      
                }
                myModel.fireTableDataChanged();
                myModel.fireTableStructureChanged();
                
            }
            
            dTable.repaint();
          
        }
        catch( com.sun.star.lang.DisposedException e )
        { //works from Patch 1
            xRemoteContext = null;
            throw e;
        }
    }

}

А теперь проблемы
1) Строки добавляются нормально, смотрел под отладчиком. Но когда выводится таблица — начинаются жуткие тормоза. Форма отображается некорректно. меню исчезают. Правда, если поводить мышкой — они вроде появляются(опять таки с томозами), но работать перестает. на события не реагирует.
пробовал,как видно из кода, и репейнт сделать, и fire..функции. Не помогает.
2) OpenOffice по умолчанию запускается в нормальном режиме. а необходимо,чтобы окно не появлялось, а запускался в фоновом режиме. А так же не понял при прочтении sdk, как его закрывать..
Re: 2 Взаимосвязанных вопроса: Java+OpenOffice,JTable
От: _Sserg_  
Дата: 17.03.08 08:00
Оценка:
Здравствуйте, Delfin4es, Вы писали:

D>2) OpenOffice по умолчанию запускается в нормальном режиме. а необходимо,чтобы окно не появлялось, а запускался в фоновом режиме. А так же не понял при прочтении sdk, как его закрывать..


запуск невидимого OO под виндой на порту 2021
soffice -norestore -nologo -invisible -accept=socket,host=localhost,port=2021;urp;StarOffice.NamingService

под юниксами также, только кавычки добавятся
Re[2]: 2 Взаимосвязанных вопроса: Java+OpenOffice,JTable
От: LeonidV Ниоткуда http://vygovskiy.com
Дата: 17.03.08 09:52
Оценка:
Здравствуйте, _Sserg_, Вы писали:
_S_>запуск невидимого OO под виндой на порту 2021
_S_>soffice -norestore -nologo -invisible -accept=socket,host=localhost,port=2021;urp;StarOffice.NamingService

В таком режиме его надо запустить до запуска Java-приложения, я правильно понимаю?
http://jvmmemory.com — простой способ настройки JVM
Re: 2 Взаимосвязанных вопроса: Java+OpenOffice,JTable
От: Blazkowicz Россия  
Дата: 17.03.08 10:26
Оценка:
Здравствуйте, Delfin4es, Вы писали:

D>А теперь проблемы

D>1) Строки добавляются нормально, смотрел под отладчиком. Но когда выводится таблица — начинаются жуткие тормоза. Форма отображается некорректно. меню исчезают. Правда, если поводить мышкой — они вроде появляются(опять таки с томозами), но работать перестает. на события не реагирует.
D>пробовал,как видно из кода, и репейнт сделать, и fire..функции. Не помогает.
Не могу сказать что дело только в этом. Но метод getValueAt реализован отвратительно. Особенно если учесть что вызывается он очень часто.
Вот эти две строчки
return new String ( o.toString());
return new Float (o.toString());

Указывают на явное желание засрать всю память непотребным мусором. Особенно первая порадовала. Да и использование switch/case вообще не понятно зачем. Храни данные в модели уже в пригодном для отображения виде. А твой код перегоняет их из исходного состояния в необходимое тебе при каждой отрисовке.

Ещё не могу понять в чем проблема не фиктисрованого количества строк? Или ты колонки имел ввиду? Выкинь Vector. Реализуй нормальную модель адаптированую под твои нужды. Будет быстрее, хотя и не сильно. В методе loadData подготовь модель к показу по максимуму, чтобы минимизировать кустарный код как в модели так и в самой таблице.

Если у тебя динамически меняется количество строк, то попробуй использовать и другие методы fire...Changed()
Re[3]: 2 Взаимосвязанных вопроса: Java+OpenOffice,JTable
От: _Sserg_  
Дата: 17.03.08 10:29
Оценка:
Здравствуйте, LeonidV, Вы писали:

LV>Здравствуйте, _Sserg_, Вы писали:

_S_>>запуск невидимого OO под виндой на порту 2021
_S_>>soffice -norestore -nologo -invisible -accept=socket,host=localhost,port=2021;urp;StarOffice.NamingService

LV>В таком режиме его надо запустить до запуска Java-приложения, я правильно понимаю?


правильно. а далее java-приложение может к нему цепляться. если внимательно читать форум по ОО, то можно узнать, что это наименее глючный метод — если запускать ОО из своего приложения напрямую, то возможны проблемы.

вообще в том форуме есть всё про ОО. там инфы даже больше чем в доках и sdk.
Re[4]: 2 Взаимосвязанных вопроса: Java+OpenOffice,JTable
От: Delfin4es  
Дата: 18.03.08 09:34
Оценка:
Здравствуйте, _Sserg_, Вы писали:
правильно. а далее java-приложение может к нему цепляться. если внимательно читать форум по ОО, то можно узнать, что это наименее глючный метод — если запускать ОО из своего приложения напрямую, то возможны проблемы.
вообще в том форуме есть всё про ОО. там инфы даже больше чем в доках и sdk.
А можно поподробнее, пожалуйста? читал форум OO, нашел классы Danny для работы с oo(про то,что Вы написали — не нашел вообще), но ,честно говоря, не разобрался в коде. И будет ли это работать под Linux, FreeBSD и др. системах?
2 Blazkowicz: объясните поподробнее, пожалуйста. не совсем вас понял.
Динамическое добавление строк(именно строк, а не стоблцов) необходимо. Объясню почему. я не знаю заранее. сколько точно строк будет во входной таблице. считываю из файла 100 — это максимум для таблицы. Если в процессе считыванию натыкаюсь на код "700" считываю его последним и прекращаю считывать/добавлять данные в таблицу. Т.Е. количество строк в таблице всегда <=100. Изначально вместо векторов у меня был массив данных Object [][] data = {}; где в фигурных скобках он был проинициализирован. НО! представьте себе этот код? 100 строк бессмысленного кода!. Более того. таблица сразу создается размером в 100 строк. что выглядит мягко сказать не очень красиво, если строчек всего 5.. А метод getValueAt реализован именно так(кстати, над ним тоже долго сидел, т.к. некорректно считывал данные), ибо он на самом деле очень часто используется в остальном коде.методы fire...Changed() пробовал все. Результат нулевой.
Re: 2 Взаимосвязанных вопроса: Java+OpenOffice,JTable
От: cl-user  
Дата: 18.03.08 12:10
Оценка:
Здравствуйте, Delfin4es, Вы писали:

D>2) OpenOffice по умолчанию запускается в нормальном режиме. а необходимо,чтобы окно не появлялось, а запускался в фоновом режиме. А так же не понял при прочтении sdk, как его закрывать..


"Скрытый старт": посмотри пример из SDK examples/DevelopersGuide/GUI/MessageBox.java (ещё точнее — метод createDefaultTextDocument)

Закрыть — несколько нюансов: документ? Офис? В любом случае лезь поиском на http://community.i-rs.ru/
Re[2]: 2 Взаимосвязанных вопроса: Java+OpenOffice,JTable
От: Delfin4es  
Дата: 18.03.08 19:24
Оценка:
cl-user, спасибо большое. Проблема с openoffice решена. Все работает.
Теперь осталась проблема с JTable. и добавилась еще одна с ней же, хотя больше относится к менеджеру расположения, но спрошу здесь,чтобы не захламлять форум отдельной темой.
Таблица расположена на JPanel, которая в свою очередь расположена на JScrollPane,а JScrollPane является вкладкой JTabbedPane. Сделано так потому. что на одной вкладке расположено много таблиц и других компонентов. Проблема в том. что при такой конфигурации у таблиц (в какой-бы последовательности не были бы расположены) пропадают заголовки столбцов. вообще. Если расположить таблицу(правда. только одну) минуя JPanel — все нормально..
Re[3]: 2 Взаимосвязанных вопроса: Java+OpenOffice,JTable
От: cl-user  
Дата: 18.03.08 20:47
Оценка:
Здравствуйте, Delfin4es, Вы писали:

D>Таблица расположена на JPanel, которая в свою очередь расположена на JScrollPane,а JScrollPane является вкладкой JTabbedPane. Сделано так потому. что на одной вкладке расположено много таблиц и других компонентов. Проблема в том. что при такой конфигурации у таблиц (в какой-бы последовательности не были бы расположены) пропадают заголовки столбцов. вообще. Если расположить таблицу(правда. только одну) минуя JPanel — все нормально..


Всё что могу сказать — напиши минимальный тест который будет демонстрировать сие поведение. И либо в процессе его написания проблема решится, либо с этим можно будет лезть на "взрослые" форумы
Re[4]: 2 Взаимосвязанных вопроса: Java+OpenOffice,JTable
От: Delfin4es  
Дата: 19.03.08 14:42
Оценка:
Здравствуйте, cl-user, Вы писали:

CU>Всё что могу сказать — напиши минимальный тест который будет демонстрировать сие поведение. И либо в процессе его написания проблема решится, либо с этим можно будет лезть на "взрослые" форумы

Да тут тесты не помогут. Почитал я другие форумы. Оказывается, это известный глюк — при добавлении таблицы на JPanel — пропадают названия столбцов. Лечится это добавлением таблицы в JScrollPane. но мне необходимо реализовать следующую систему: панель вкладок JTabbedPane, где в качестве одной из вкладок будет находится JScrollPane, на котором в свою очередь будет расположено несколько компонентов. Сразу оговорюсь,что вариант — для каждой таблицы — отдельная область прокрутки — не подходит. необходимо реализовать для всех общую. У кого есть соображения по этому поводу? быть может, можно как-то расположить в JScrollPane несколько компонентов? или Вылечить пропадание названий столбцов? Заранее спасибо на помощь.
Re[5]: 2 Взаимосвязанных вопроса: Java+OpenOffice,JTable
От: Cyberax Марс  
Дата: 19.03.08 15:00
Оценка:
Здравствуйте, Delfin4es, Вы писали:

D>Сразу оговорюсь,что вариант — для каждой таблицы — отдельная область прокрутки — не подходит. необходимо реализовать для всех общую. У кого есть соображения по этому поводу? быть может, можно как-то расположить в JScrollPane несколько компонентов? или Вылечить пропадание названий столбцов? Заранее спасибо на помощь.

Положи каждую таблицу в свою область прокрутки, а потом все вместе — в одну общую.
Sapienti sat!
Re[5]: 2 Взаимосвязанных вопроса: Java+OpenOffice,JTable
От: Аноним  
Дата: 20.03.08 08:06
Оценка:
Здравствуйте, Delfin4es, Вы писали:

D>Вылечить пропадание названий столбцов? Заранее спасибо на помощь.

"Названия столбцов" — это JTable.getTableHeader(). Ну а дальше размещайте его относительно таблицы как душа пожелает. Можно даже слева или справа разместить
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.