Доброго времени суток!
Сразу прошу не ругать сильно,ибо подобное уже обсуждалось. В том числе и на этом форуме, но конкретного решения не нашел.
Программа взаимодействует 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, как его закрывать..