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, как его закрывать..
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.