Странно работает Java-swing-Агент

  • Автор темы Dymytry
  • Дата начала
D

Dymytry

#1
День добрый!

Есть такой агент, он очень странный.

Я исполбзую SWING. В коде который отвечает за нажатие кнопки я беру параметры вида. Однако вида оно не видит - выдает мне NullPointerException! При этом сам вид != null.

Ну ладно, однако ж если я запущу тот же код не в ActionPerformed, а просто так - то оно работает! Похоже что ActionPerfomed метод не видит аттрибутов моего NotesAgent класса..


Код:
import lotus.domino.*;
import lotus.domino.Document;

import java.awt.Color;
import java.awt.Container;
import java.awt.Font;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.io.PrintWriter;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.UIManager;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import lotus.domino.*;

public class JavaAgent extends AgentBase implements ActionListener {

JFrame frame = new JFrame("Update Access Data");	
JButton startButton = new JButton("Start");
JButton closeButton = new JButton("Close");
JProgressBar progressBar = new JProgressBar(0, 1);	
JTextArea currentTextArea = new JTextArea();
JTextArea infoTextArea = new JTextArea();
JPanel systemDataPanel = new JPanel();

Session session;
AgentContext agentContext; 
PrintWriter pw;
Database db;
View myView;

/**Init domino variables*/
public void initDomino() throws Exception {
session = getSession();
agentContext = session.getAgentContext(); 
db = session.getDatabase("SERVERNAME", "DBNAME");
myView = db.getView("AllDocuments");
}

/**Swing GUI creation*/
public void createGUI() throws Exception {
//start

frame.setLocationRelativeTo(null);
frame.setSize(500, 500);

UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());

//create GUI		
progressBar.setValue(0);
progressBar.setStringPainted(true);

Container cp = frame.getContentPane();
cp.setLayout(new GridBagLayout());
GridBagConstraints c = new GridBagConstraints();
c.insets = new Insets(10, 10, 10, 10);
c.weightx = 1;			
c.gridx=0;

currentTextArea.setRows(20);
currentTextArea.setColumns(40);
currentTextArea.setWrapStyleWord(true);
currentTextArea.setFont(new Font("Arial", Font.BOLD, 12));

//infoTextArea.setRows(20);
//infoTextArea.setColumns(10);
infoTextArea.setWrapStyleWord(true);
infoTextArea.setFont(new Font("Default Sans Serif", Font.BOLD, 12));
infoTextArea.setBackground(null);
infoTextArea.setEditable(false);

systemDataPanel.setBorder(BorderFactory.createTitledBorder(BorderFactory.createLineBorder(Color.black), "Last Run Information"));
systemDataPanel.setLayout(new GridBagLayout());

c.weighty = 0;// 0.01;
c.fill = GridBagConstraints.NONE;


c.weighty = 1;
c.gridx = 0;
c.gridy = 0;
c.gridwidth=2;
c.fill = GridBagConstraints.BOTH;
frame.getContentPane().add(infoTextArea,c);


c.weighty = 0.01;
c.gridy = 1;
frame.getContentPane().add(systemDataPanel,c);

c.gridx = 0;
c.gridy=2;
c.fill = GridBagConstraints.NONE;
frame.getContentPane().add(new JLabel("current action:"), c);
c.gridy=3;
c.weighty = 1;
c.gridwidth=2;
c.fill = GridBagConstraints.BOTH;
frame.getContentPane().add(new JScrollPane(currentTextArea), c);
c.gridy=4;
c.weighty = 1;
c.gridwidth=2;
c.fill = GridBagConstraints.BOTH;
frame.getContentPane().add(progressBar, c);

c.gridwidth=1;
c.gridy = 5;
c.gridx = 0;
frame.getContentPane().add(startButton, c);
c.gridx = 1;
frame.getContentPane().add(closeButton, c);
//end GUI

startButton.addActionListener(this);
closeButton.addActionListener(this);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}

/**Button Pressed Action*/
public void actionPerformed(ActionEvent e) {

Object initiator = e.getSource();

if (initiator == startButton) {
try {					
JOptionPane.showMessageDialog(frame, myView.getName());							  //HERE IS THE ERROR!!!!!!!!!!!!!!!!
} catch (Exception ex) {
JOptionPane.showMessageDialog(frame, "Error in RunProcedure cycle: "+ ex.getMessage() );	
}
} else if (initiator == closeButton) {
frame.setVisible(false);
frame.dispose();
} else {
//nothing
}
}

public void NotesMain() {
try {

initDomino();

//JOptionPane.showMessageDialog(frame, myView.getName()); - HERE THIS WORKS! SAME LINE IN ACTIONLISTENER DO NOT WORK!!!!!!!!!!!!!!!!!		
createGUI(); 

} catch(Throwable e) {
JOptionPane.showMessageDialog(frame, e.getMessage());
}
}
}

Whats up?
 

nvyush

Lotus team
22.04.2009
2 317
0
#2
Добавил в обработчик ошибок
ex.printStackTrace();
получил
NotesException: Object has been removed or recycled
После создания свинг-окна все Ваши инициализированные нотес-объекты утилизируются. Попробуйте создать внутри агента класс-наследник свинг-класса, объявите нотес-объекты членами этого класса и инициализируйте их в конструкторе.
 
D

Dymytry

#3
Интересно!

Сейчас попробую, а что вы понимаете под "класс-наследник свинг-класса"? Какого, фрейма что ли?
 

nvyush

Lotus team
22.04.2009
2 317
0
#4
а что вы понимаете под "класс-наследник свинг-класса"? Какого, фрейма что ли?
Ну да. Типа так:
Код:
class MyFrame extends JFrame {
Session session;
Database db;
View myView;

//конструктор
public MyFrame(/*параметры как у конструктора JFrame*/) {
session = getSession();
agentContext = session.getAgentContext(); 
db = session.getDatabase("SERVERNAME", "DBNAME");
myView = db.getView("AllDocuments");
//...
}
Отрисовку окна завернуть в конструктор. Должно работать.
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 586
271
#5
виды, полученные локально, "теряются" даже в LS (если пабликом не объявить) ;)
getSession();
присутствует тока в AgentBase потому - такое наследование и код не пропрёт
есть статик метод getAgentSession(), но я не знаю контекста его работы (надо смореть)
 

nvyush

Lotus team
22.04.2009
2 317
0
#6
getSession();
присутствует тока в AgentBase потому - такое наследование и код не пропрёт
есть статик метод getAgentSession(), но я не знаю контекста его работы (надо смореть)
Поглядел у себя в коде, обнаружил два подхода:
1) Передача Session в конструктор в качестве параметра;
2) session = NotesFactory.createSession();