Avatar billede cvpcvp Nybegynder
19. februar 2004 - 11:17 Der er 4 kommentarer og
1 løsning

Periodisk event i eclipse view

Jeg har følgende kode...

Det opretter et nyt view til eclipse platformen.
Jeg ønsker at tilføje noget funktionalitet der gør at der periodisk (f.eks. hvert sekund) sker noget.

f.eks. vil jeg gerne have der hver sekund skal ske dette:
viewer.insert("hej",-1);

hvordan laver jeg det?


package org.eclipse.contribution.test.views;

import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.part.*;
import org.eclipse.jface.viewers.*;
import org.eclipse.swt.graphics.Image;
import org.eclipse.jface.action.*;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.ui.*;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.swt.SWT;

import java.net.*;
import java.io.*;
import java.util.*;



public class SampleView extends ViewPart {
    public TableViewer viewer;
    private Action action1;
    private Action action2;
    private Action action3;
    private Action doubleClickAction;
    private Socket socket;
    private BufferedReader in;
    private List mylist;

    class ViewContentProvider implements IStructuredContentProvider {
        public void inputChanged(Viewer v, Object oldInput, Object newInput) {
        }
        public void dispose() {
        }
        public Object[] getElements(Object parent) {
            return new String[] { "test"};
        }
    }
    class ViewLabelProvider extends LabelProvider implements ITableLabelProvider {
        public String getColumnText(Object obj, int index) {
            return getText(obj);
        }
        public Image getColumnImage(Object obj, int index) {
            return getImage(obj);
        }
        public Image getImage(Object obj) {
            return PlatformUI.getWorkbench().
                    getSharedImages().getImage(ISharedImages.IMG_OBJ_ELEMENT);
        }
    }
    class NameSorter extends ViewerSorter {
    }
    public SampleView() {
    }

    public void createPartControl(Composite parent) {
        viewer = new TableViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);
        viewer.setContentProvider(new ViewContentProvider());
        viewer.setLabelProvider(new ViewLabelProvider());
        //viewer.setSorter(new NameSorter());
        viewer.setInput(ResourcesPlugin.getWorkspace());
        makeActions();
        hookContextMenu();
        hookDoubleClickAction();
        contributeToActionBars();
    }

    private void hookContextMenu() {
        MenuManager menuMgr = new MenuManager("#PopupMenu");
        menuMgr.setRemoveAllWhenShown(true);
        menuMgr.addMenuListener(new IMenuListener() {
            public void menuAboutToShow(IMenuManager manager) {
                SampleView.this.fillContextMenu(manager);
            }
        });
        Menu menu = menuMgr.createContextMenu(viewer.getControl());
        viewer.getControl().setMenu(menu);
        getSite().registerContextMenu(menuMgr, viewer);
    }

    private void contributeToActionBars() {
        IActionBars bars = getViewSite().getActionBars();
        fillLocalPullDown(bars.getMenuManager());
        fillLocalToolBar(bars.getToolBarManager());
    }

    private void fillLocalPullDown(IMenuManager manager) {
        manager.add(action1);
        manager.add(new Separator());
        manager.add(action2);
        manager.add(new Separator());
        //manager.add(action3);
    }

    private void fillContextMenu(IMenuManager manager) {
        manager.add(action1);
        manager.add(action2);
        manager.add(action3);
        manager.add(new Separator("Additions"));
    }
   
    private void fillLocalToolBar(IToolBarManager manager) {
        manager.add(action1);
        manager.add(action2);
        manager.add(action3);
    }
   

    private void makeActions() {
        action1 = new Action() {
            public void run() {
                }
            }
        };
        action1.setText("Action 1");
        action1.setToolTipText("Action 1 tooltip Tryk på knappen og se");
        action1.setImageDescriptor(PlatformUI.getWorkbench().getSharedImages().
            getImageDescriptor(ISharedImages.IMG_OBJS_INFO_TSK));
       
        action2 = new Action() {
            public void run() {
            }
        };
        action2.setText("Action 2");
        action2.setToolTipText("Action 2 tooltip fisk");
        action2.setImageDescriptor(PlatformUI.getWorkbench().getSharedImages().
            getImageDescriptor(ISharedImages.IMG_OBJS_TASK_TSK));
        doubleClickAction = new Action() {
            public void run() {
                viewer.insert("davs",-1);
            }
        };
        action3 = new Action() {
            public void run(){
            }
        };
        action3.setText("Action 3");
        action3.setToolTipText("Action 3 tooltip ko");
        action3.setImageDescriptor(PlatformUI.getWorkbench().getSharedImages().
        getImageDescriptor(ISharedImages.IMG_OBJS_TASK_TSK));
    }
   
       
    private void hookDoubleClickAction() {
        viewer.addDoubleClickListener(new IDoubleClickListener() {
            public void doubleClick(DoubleClickEvent event) {
                doubleClickAction.run();
            }
        });
    }
    public void showMessage(String message) {
        MessageDialog.openInformation(
            viewer.getControl().getShell(),
            "Claus View",
            message);
    }

    public void setFocus() {
        viewer.getControl().setFocus();
    }
}
Avatar billede cvpcvp Nybegynder
19. februar 2004 - 12:37 #1
Jeg har prøvet at lave følgende.. men den kommer med en exception illegal thread access.
følgende kode har jeg prøvet at have indsat i ovenstående klasse.
class Reminder{
        Timer timer;
       
        public Reminder(){
            try {   
                InetAddress addr =
                    InetAddress.getByName("hostname");
 
                System.out.println("addr = " + addr);
                    socket = new Socket(addr, 22111);

 
                System.out.println("socket = " + socket);
                    in =
                        new BufferedReader(
                            new InputStreamReader(
                                socket.getInputStream()));
     
                PrintWriter out =
                  new PrintWriter(
                      new BufferedWriter(
                          new OutputStreamWriter(
                              socket.getOutputStream())),true);
            }
            catch(IOException e){
            }
           
            timer = new Timer();
            timer.scheduleAtFixedRate(new ReminderTask(),1000,1000);
        }
       
        class ReminderTask extends TimerTask{
            int i = 0;
            public void run() {
                i++;
                System.out.println(i);
                try{
                    String str = in.readLine();
                    System.out.println(str);
                    mylist.add(new String (str));
                                        viewer.insert("hej",-1);
                }
                catch(Exception f){
                    System.out.println(f);
                }
            }
        }
    }
Avatar billede conrad Nybegynder
20. februar 2004 - 12:00 #2
Det er nemmere for dig at bruge swing's Timer (http://java.sun.com/j2se/1.4.2/docs/api/index.html)i dette tilfælde. Nedenstående er et lille eksempel du måske kan bruge

import java.awt.event.*;
import javax.swing.Timer;


public class TimerEx implements ActionListener
{
    public TimerEx()//milliseconds
    {
       
      }

      public void actionPerformed(ActionEvent e)
      {
          //do some perodic code here
          System.out.println("Timer related task executed");   
      }

    public static void main(String args[])
    {
        javax.swing.Timer timer = new javax.swing.Timer(1000, new TimerEx());
        timer.start();
       
        //simulate work
        for(int i = 0; i < 100; i++)
        {
            try
            {
                System.out.println("working...");
                Thread.sleep(100);
       
            }
            catch(InterruptedException e)
            {
                    System.out.println("Thread Interrupted");               
            }   
        }
       
    }
}
Avatar billede cvpcvp Nybegynder
20. februar 2004 - 12:22 #3
jeg får desværre en fejl når jeg bruger disse timere..

jeg vil gerne kunne gøre dette:

actionPerformed(ActionEvent e)
{
    viewer.insert("davs",-1);
}
men jeg får en fejl:
org.eclipse.swt.SWTException: Invalid thread access
Avatar billede conrad Nybegynder
20. februar 2004 - 12:43 #4
Jeg kender ikke eclipse, men der står noget om hvordan man løser den slags problemer her: http://dev.eclipse.org/viewcvs/index.cgi/platform-swt-home/faq.html?rev=1.56#uithread

I særdeleshed koden:

display.syncExec(
        new Runnable() {
          public void run(){
              label.setText(text);
          }
        }
    );
Avatar billede cvpcvp Nybegynder
20. februar 2004 - 14:10 #5
Tak for hintet!!
Med lidt modifikationer fik jeg det til at virke..
Jeg takker!!
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester