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

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

  1. Dymytry

    Dymytry Гость

    Репутация:
    0
    День добрый!

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

    Я исполбзую 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?
     
  2. nvyush

    nvyush Well-Known Member
    Lotus team

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

    Dymytry Гость

    Репутация:
    0
    Интересно!

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

    nvyush Well-Known Member
    Lotus team

    Репутация:
    0
    Регистрация:
    22 апр 2009
    Сообщения:
    2.317
    Симпатии:
    0
    Ну да. Типа так:
    Код:
    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

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

    nvyush Well-Known Member
    Lotus team

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

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

    Репутация:
    1
    Регистрация:
    27 авг 2008
    Сообщения:
    6.361
    Симпатии:
    335
    предпочтительнее
     
Загрузка...
Похожие Темы - Странно работает Java
  1. maltsevvv
    Ответов:
    0
    Просмотров:
    1.516
  2. Xomyak
    Ответов:
    1
    Просмотров:
    1.239
  3. Gomoseka
    Ответов:
    0
    Просмотров:
    36
  4. Domino-Designer
    Ответов:
    2
    Просмотров:
    448
  5. MaxP
    Ответов:
    5
    Просмотров:
    899

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