Доброго времени суток!
Сразу прошу не ругать сильно,ибо подобное уже обсуждалось. В том числе и на этом форуме, но конкретного решения не нашел.
Программа взаимодействует 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;
}
// процедура загрузки данных в таблицу dTableprivate 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, как его закрывать..
Здравствуйте, Delfin4es, Вы писали:
D>2) OpenOffice по умолчанию запускается в нормальном режиме. а необходимо,чтобы окно не появлялось, а запускался в фоновом режиме. А так же не понял при прочтении sdk, как его закрывать..
запуск невидимого OO под виндой на порту 2021
soffice -norestore -nologo -invisible -accept=socket,host=localhost,port=2021;urp;StarOffice.NamingService
Здравствуйте, Delfin4es, Вы писали:
D>А теперь проблемы D>1) Строки добавляются нормально, смотрел под отладчиком. Но когда выводится таблица — начинаются жуткие тормоза. Форма отображается некорректно. меню исчезают. Правда, если поводить мышкой — они вроде появляются(опять таки с томозами), но работать перестает. на события не реагирует. D>пробовал,как видно из кода, и репейнт сделать, и fire..функции. Не помогает.
Не могу сказать что дело только в этом. Но метод getValueAt реализован отвратительно. Особенно если учесть что вызывается он очень часто.
Вот эти две строчки
return new String ( o.toString());
return new Float (o.toString());
Указывают на явное желание засрать всю память непотребным мусором. Особенно первая порадовала. Да и использование switch/case вообще не понятно зачем. Храни данные в модели уже в пригодном для отображения виде. А твой код перегоняет их из исходного состояния в необходимое тебе при каждой отрисовке.
Ещё не могу понять в чем проблема не фиктисрованого количества строк? Или ты колонки имел ввиду? Выкинь Vector. Реализуй нормальную модель адаптированую под твои нужды. Будет быстрее, хотя и не сильно. В методе loadData подготовь модель к показу по максимуму, чтобы минимизировать кустарный код как в модели так и в самой таблице.
Если у тебя динамически меняется количество строк, то попробуй использовать и другие методы fire...Changed()
Здравствуйте, LeonidV, Вы писали:
LV>Здравствуйте, _Sserg_, Вы писали: _S_>>запуск невидимого OO под виндой на порту 2021 _S_>>soffice -norestore -nologo -invisible -accept=socket,host=localhost,port=2021;urp;StarOffice.NamingService
LV>В таком режиме его надо запустить до запуска Java-приложения, я правильно понимаю?
правильно. а далее java-приложение может к нему цепляться. если внимательно читать форум по ОО, то можно узнать, что это наименее глючный метод — если запускать ОО из своего приложения напрямую, то возможны проблемы.
вообще в том форуме есть всё про ОО. там инфы даже больше чем в доках и sdk.
Здравствуйте, _Sserg_, Вы писали:
правильно. а далее java-приложение может к нему цепляться. если внимательно читать форум по ОО, то можно узнать, что это наименее глючный метод — если запускать ОО из своего приложения напрямую, то возможны проблемы.
вообще в том форуме есть всё про ОО. там инфы даже больше чем в доках и sdk.
А можно поподробнее, пожалуйста? читал форум OO, нашел классы Danny для работы с oo(про то,что Вы написали — не нашел вообще), но ,честно говоря, не разобрался в коде. И будет ли это работать под Linux, FreeBSD и др. системах?
2 Blazkowicz: объясните поподробнее, пожалуйста. не совсем вас понял.
Динамическое добавление строк(именно строк, а не стоблцов) необходимо. Объясню почему. я не знаю заранее. сколько точно строк будет во входной таблице. считываю из файла 100 — это максимум для таблицы. Если в процессе считыванию натыкаюсь на код "700" считываю его последним и прекращаю считывать/добавлять данные в таблицу. Т.Е. количество строк в таблице всегда <=100. Изначально вместо векторов у меня был массив данных Object [][] data = {}; где в фигурных скобках он был проинициализирован. НО! представьте себе этот код? 100 строк бессмысленного кода!. Более того. таблица сразу создается размером в 100 строк. что выглядит мягко сказать не очень красиво, если строчек всего 5.. А метод getValueAt реализован именно так(кстати, над ним тоже долго сидел, т.к. некорректно считывал данные), ибо он на самом деле очень часто используется в остальном коде.методы fire...Changed() пробовал все. Результат нулевой.
Здравствуйте, Delfin4es, Вы писали:
D>2) OpenOffice по умолчанию запускается в нормальном режиме. а необходимо,чтобы окно не появлялось, а запускался в фоновом режиме. А так же не понял при прочтении sdk, как его закрывать..
"Скрытый старт": посмотри пример из SDK examples/DevelopersGuide/GUI/MessageBox.java (ещё точнее — метод createDefaultTextDocument)
Закрыть — несколько нюансов: документ? Офис? В любом случае лезь поиском на http://community.i-rs.ru/
cl-user, спасибо большое. Проблема с openoffice решена. Все работает.
Теперь осталась проблема с JTable. и добавилась еще одна с ней же, хотя больше относится к менеджеру расположения, но спрошу здесь,чтобы не захламлять форум отдельной темой.
Таблица расположена на JPanel, которая в свою очередь расположена на JScrollPane,а JScrollPane является вкладкой JTabbedPane. Сделано так потому. что на одной вкладке расположено много таблиц и других компонентов. Проблема в том. что при такой конфигурации у таблиц (в какой-бы последовательности не были бы расположены) пропадают заголовки столбцов. вообще. Если расположить таблицу(правда. только одну) минуя JPanel — все нормально..
Здравствуйте, Delfin4es, Вы писали:
D>Таблица расположена на JPanel, которая в свою очередь расположена на JScrollPane,а JScrollPane является вкладкой JTabbedPane. Сделано так потому. что на одной вкладке расположено много таблиц и других компонентов. Проблема в том. что при такой конфигурации у таблиц (в какой-бы последовательности не были бы расположены) пропадают заголовки столбцов. вообще. Если расположить таблицу(правда. только одну) минуя JPanel — все нормально..
Всё что могу сказать — напиши минимальный тест который будет демонстрировать сие поведение. И либо в процессе его написания проблема решится, либо с этим можно будет лезть на "взрослые" форумы
Здравствуйте, cl-user, Вы писали:
CU>Всё что могу сказать — напиши минимальный тест который будет демонстрировать сие поведение. И либо в процессе его написания проблема решится, либо с этим можно будет лезть на "взрослые" форумы
Да тут тесты не помогут. Почитал я другие форумы. Оказывается, это известный глюк — при добавлении таблицы на JPanel — пропадают названия столбцов. Лечится это добавлением таблицы в JScrollPane. но мне необходимо реализовать следующую систему: панель вкладок JTabbedPane, где в качестве одной из вкладок будет находится JScrollPane, на котором в свою очередь будет расположено несколько компонентов. Сразу оговорюсь,что вариант — для каждой таблицы — отдельная область прокрутки — не подходит. необходимо реализовать для всех общую. У кого есть соображения по этому поводу? быть может, можно как-то расположить в JScrollPane несколько компонентов? или Вылечить пропадание названий столбцов? Заранее спасибо на помощь.
Здравствуйте, Delfin4es, Вы писали:
D>Сразу оговорюсь,что вариант — для каждой таблицы — отдельная область прокрутки — не подходит. необходимо реализовать для всех общую. У кого есть соображения по этому поводу? быть может, можно как-то расположить в JScrollPane несколько компонентов? или Вылечить пропадание названий столбцов? Заранее спасибо на помощь.
Положи каждую таблицу в свою область прокрутки, а потом все вместе — в одну общую.
Здравствуйте, Delfin4es, Вы писали:
D>Вылечить пропадание названий столбцов? Заранее спасибо на помощь.
"Названия столбцов" — это JTable.getTableHeader(). Ну а дальше размещайте его относительно таблицы как душа пожелает. Можно даже слева или справа разместить