Dear Jmol-developers,
we are using Jmol as a visualisation engine to show
mark sets of atoms in molecules, basically calling
Viewer.evalFile, which works fine.
I would like to add an option, whereby users can click
on parts of the structure (atoms would do for the moment)
and get their selections exported back to my application.
On the Jmol-Wiki, it says:
================================================
"One example of getting data out of Jmol is by adding a MouseListener to the
Panel that contains the JmolViewer instance. e.g.
public void mouseMoved(MouseEvent e) {
int pos = viewer.findNearestAtomIndex( e.getX(), e.getY() );
if ( pos == -1 ) { return ; }
String chainId = viewer.getAtomChain( pos ) ;
String seqCode = viewer.getAtomSequenceCode( pos ) ;
// ... do something in your application
}
===================================================
I tried to follow this strategy and attach 2 files:
MouseTrackerFrame.java, MouseTracker.java (adapted from Keitel&Keitel's
Java-handbook), which I used to try and follow that recommendation.
They can be compiled by saying (in Java 1.5)
javac -classpath /where/ever/jmol-10.2.0 /Jmol.jar *.java
after Jmol.jar has been modified to give public access to
Viewer.findNearestAtomIndex(e.getX(), e.getY());
and run by:
java -classpath /where/ever/jmol-10.2.0 /Jmol.jar MouseTracker
Now, the problem with this is, that it seems to nicely track
mouse movents in the "empty" part of the JMolViewer (grey bottom
bit), but mouse movement does obviously not get recorded within the
graphics area of the molecule.
What do I do wrong ? Any remarks are very much appreciated.
We also tried to import Jmol into eclipse to trace the sequence of
classes called, but were not successful in doing so. Has that been
done ? Are there any other ways of depicting the flow of commands in
Jmol ?
Thanks a lot,
Maria
// Fig. 11.28: MouseTrackerFrame.java
// Demonstrating mouse events.
import java.awt.Color;
import java.awt.BorderLayout;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.event.MouseEvent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.*;
import java.io.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.table.*;
// jmol-packages and classes
import org.openscience.jmol.app.*;
import org.jmol.api.*;
//import org.jmol.adapter.cdk.CdkJmolAdapter;
import org.jmol.adapter.smarter.SmarterJmolAdapter;
//import org.jmol.util.GT;
import org.jmol.i18n.GT;
//import org.openscience.cdk.applications.plugin.CDKPluginManager;
//import org.openscience.jmol.ui.JmolPopup;
import Acme.JPM.Encoders.PpmEncoder;
import com.lowagie.text.Document;
import com.lowagie.text.DocumentException;
import com.lowagie.text.pdf.PdfContentByte;
import com.lowagie.text.pdf.PdfTemplate;
import com.lowagie.text.pdf.PdfWriter;
import com.obrador.JpegEncoder;
import org.jmol.viewer.*;
public class MouseTrackerFrame extends JFrame
{
private Jmol mousePanel; // panel in which mouse events will occur
private JLabel statusBar; // label that displays event information
public JmolViewer viewer;
// MouseTrackerFrame constructor sets up GUI and
// registers mouse event handlers
public MouseTrackerFrame()
{
super( "Trying to implement additional MouseTracking to Jmol" );
mousePanel = Jmol.getJmol(this,300, 300);
this.viewer = mousePanel.viewer;
add( mousePanel, BorderLayout.CENTER ); // add panel to JFrame
statusBar = new JLabel( "Mouse outside JPanel" );
add( statusBar, BorderLayout.SOUTH ); // add label to JFrame
// create and register listener for mouse and mouse motion events
MouseHandler handler = new MouseHandler();
mousePanel.addMouseListener( handler );
mousePanel.addMouseMotionListener( handler );
} // end MouseTrackerFrame constructor
private class MouseHandler implements MouseListener,
MouseMotionListener
{
// MouseListener event handlers
// handle event when mouse released immediately after press
public void mouseClicked( MouseEvent event )
{
statusBar.setText( String.format( "Clicked at [%d, %d]",
event.getX(), event.getY() ) );
System.out.println("REGISTERED MOUSECLICK");
int pos = ((Viewer)viewer).findNearestAtomIndex( event.getX(), event.getY());
int pas = ((Viewer)viewer).findNearestAtomIndex(100, 100);
System.out.println(pos);
System.out.println(pas);
if ( pos == -1 ) { return;}
} // end method mouseClicked
// handle event when mouse pressed
public void mousePressed( MouseEvent event )
{
statusBar.setText( String.format( "Pressed at [%d, %d]",
event.getX(), event.getY() ) );
} // end method mousePressed
// handle event when mouse released after dragging
public void mouseReleased( MouseEvent event )
{
statusBar.setText( String.format( "Released at [%d, %d]",
event.getX(), event.getY() ) );
} // end method mouseReleased
// handle event when mouse enters area
public void mouseEntered( MouseEvent event )
{
statusBar.setText( String.format( "Mouse entered at [%d, %d]",
event.getX(), event.getY() ) );
// mousePanel.setBackground( Color.GREEN );
} // end method mouseEntered
// handle event when mouse exits area
public void mouseExited( MouseEvent event )
{
statusBar.setText( "Mouse outside JPanel" );
// mousePanel.setBackground( Color.WHITE );
} // end method mouseExited
// MouseMotionListener event handlers
// handle event when user drags mouse with button pressed
public void mouseDragged( MouseEvent event )
{
statusBar.setText( String.format( "Dragged at [%d, %d]",
event.getX(), event.getY() ) );
} // end method mouseDragged
// handle event when user moves mouse
public void mouseMoved( MouseEvent event )
{
statusBar.setText( String.format( "Moved at [%d, %d]",
event.getX(), event.getY() ) );
} // end method mouseMoved
} // end inner class MouseHandler
} // end class MouseTrackerFrame
// Fig. 11.29: MouseTrackerFrame.java
import javax.swing.JFrame;
import javax.swing.*;
import java.io.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.table.*;
// jmol-packages and classes
import org.openscience.jmol.app.*;
import org.jmol.api.*;
//import org.jmol.adapter.cdk.CdkJmolAdapter;
import org.jmol.adapter.smarter.SmarterJmolAdapter;
//import org.jmol.util.GT;
import org.jmol.i18n.GT;
//import org.openscience.cdk.applications.plugin.CDKPluginManager;
//import org.openscience.jmol.ui.JmolPopup;
import Acme.JPM.Encoders.PpmEncoder;
import com.lowagie.text.Document;
import com.lowagie.text.DocumentException;
import com.lowagie.text.pdf.PdfContentByte;
import com.lowagie.text.pdf.PdfTemplate;
import com.lowagie.text.pdf.PdfWriter;
import com.obrador.JpegEncoder;
import org.jmol.viewer.*;
public class MouseTracker
{
public static void main( String args[] )
{
MouseTrackerFrame mouseTrackerFrame = new MouseTrackerFrame();
mouseTrackerFrame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
mouseTrackerFrame.setVisible( true ); // display frame
} // end main
} // end class MouseTracker
-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your
opinions on IT & business topics through brief surveys -- and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
_______________________________________________
Jmol-developers mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/jmol-developers