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

Тема в разделе "Lotus + Java + LS2J", создана пользователем Dymytry, 29 окт 2010.

  1. Dymytry

    Dymytry Гость

    День добрый!

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

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

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


    Код (Text):
    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?
     
  2. nvyush

    nvyush Lotus team
    Lotus team

    Регистрация:
    22 апр 2009
    Сообщения:
    2.317
    Симпатии:
    0
    Добавил в обработчик ошибок
    ex.printStackTrace();
    получил
    NotesException: Object has been removed or recycled
    После создания свинг-окна все Ваши инициализированные нотес-объекты утилизируются. Попробуйте создать внутри агента класс-наследник свинг-класса, объявите нотес-объекты членами этого класса и инициализируйте их в конструкторе.
     
  3. Dymytry

    Dymytry Гость

    Интересно!

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

    nvyush Lotus team
    Lotus team

    Регистрация:
    22 апр 2009
    Сообщения:
    2.317
    Симпатии:
    0
    Ну да. Типа так:
    Код (Text):
    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");
    //...
    }
    Отрисовку окна завернуть в конструктор. Должно работать.
     
  5. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.081
    Симпатии:
    300
    виды, полученные локально, "теряются" даже в LS (если пабликом не объявить) ;)
    getSession();
    присутствует тока в AgentBase потому - такое наследование и код не пропрёт
    есть статик метод getAgentSession(), но я не знаю контекста его работы (надо смореть)
     
  6. nvyush

    nvyush Lotus team
    Lotus team

    Регистрация:
    22 апр 2009
    Сообщения:
    2.317
    Симпатии:
    0
    Поглядел у себя в коде, обнаружил два подхода:
    1) Передача Session в конструктор в качестве параметра;
    2) session = NotesFactory.createSession();
     
  7. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.081
    Симпатии:
    300
    предпочтительнее
     
Загрузка...

Поделиться этой страницей