Lecture 6 - People.cs.uchicago.edu

Download Report

Transcript Lecture 6 - People.cs.uchicago.edu

Lecture 6
Adding HTML to JButtons and JLabels.
Getting the right cursor
Data Transfer
Cut and Paste, System Clipboard
Gestures
Drag and Drop
Drag ‘n’ Drop with Unix
A desktop icon class
HTML-aware components
Can use HTML text mark-up with many
Swing components now. Examples: multi-line
labels, more fonts, formatting and styles.
Warning: bad HTML will cause exceptions.
Feature still almost undocumented (Sun’s web
page).
Believed to work with JLabel, JButton,
JMenuItem, JMenu, JCheckBoxMenuItem,
JRadioButtonMenuItem, JTabbedPane,
JToolTip. JOptionPane too.
Uses
Can split large labels into several lines.
Documentation/Help options. Can
make HTML docs, and also view them
from within the program. Hyperlinks
are displayed but not active.
Unfinished feature. You still have to
insert your own line-breaks, and
implement your own hypertext support.
Pointing devices
User normally thinks of pointer as
hand-held tool, or even an extension of
his/her body. Usually, but not always,
controlled by mouse, which moves
wherever user moves hand.
Used to allow user to specify a
Location and a desired Action.
“gestures” such as drag, double-click.
The right cursor
“Cursor” refers to the on-screen image
used to help user position pointer.
Cursor appearance should reflect
pointer usage. This may change
frequently.
Java provides 14 system-independent
cursors. OS may provide more. Can
also build your own.
Cursors in AWT
Each component can choose its cursor
(Component.setCursor), or inherit from its
parent. Cursor appearance changes
when pointer enters component.
Cursor consists of an Image and a
“hotspot” (relative pointer location).
Built-in cursors
Custom cursors
Setting component cursor
// Create a new JButton with a custom cursor
// “myCursor”.
JButton b=new JButton(text);
Image im=new ImageIcon(“myFile.gif”).getImage();
// Note: the above is the shortest way to load an
// image from file. Many other methods exist.
Point hotspot=new Point(0,15);
// This sets hotspot at center of left edge
// (assuming a 32x32 image)
String name=“myCursor”;
b.setCursor(b.getToolkit().createCustomCursor(im,
hotspot,name));
Transparency
With most image formats, it is possible
to mark at least one color as
“transparent.” One use: although
images are stored as rectangles, can
make them appear to be other shapes.
For cursors, this is the norm.
Can also make transparent buttons.
Translucency
There is an even more advanced
technique called alpha-compositing, in
which every pixel of an image is
assigned a number representing its
translucency. This is likely to become
more common in the future. I’ll come
back to this when I discuss Java2D,
another day.
Data Transfer
Internal: between Objects
Between JVM’s: (rather easy with
Serialization or RMI)
via the OS: to/from Clipboard
via the OS: Drag and Drop
Data Flavors
Data comes in many formats.
Format unknown  data unusable
Makes sense to keep a label on data
describing the format.
MIME types are the de-facto internet
standard. Java’s DataFlavor class is a
slight extension to MIME.
MIME
Multipurpose Internet Mail Extensions
format. e-mail, http “Content-type”
“type/subtype”
A proposed standard: RFC 2912, 2913.
Examples: text/plain, image/jpeg,
image/gif, audio/basic, video/mpeg,
application/x-java-serialized-object,
model/vrml, text/rtf, multipart/signed
What’s in a flavor?
A drama in 6 slides
Meet the cast:
Hi, I am Mysterio, an instance of
a class implementing the
Transferable interface.
Hi, I’m Jo Java. I want to
get cool stuff from Mysterio.
And I want it now, now, now!
What’s in a flavor?
Mysterio, what cool stuff do you have?
Haha, not so fast my dear!
I’ll only tell you if you invoke the
right methods (wink, wink)!
Scum! Give me what I want now!
mysterio.getTransferDataFlavors();
What’s in a flavor?
Ouch, you win! I have
cool stuff in the following
flavors: “text/html”,
“application/powerpoint”,
“text/rtf”, “image/jpeg”
Quick, give me the “image/jpeg”.
Um, I mean:
mysterio.getTransferData(jpegFlavor);
What’s in a flavor?
OK! Here’s an Object
“representing” the data
you requested. Bye!
???
What’s in a flavor?
Oh, no! Not a “black box!”
This thing is supposed to
represent a JPEG?
Object
How am I supposed to put this on
screen?
What’s in a flavor?
Object
Wait, the DataFlavor for “image/jpeg”
tells me the class of this Object.
jpegFlavor.getRepresentationClass();
It’s an InputStream. How quaint. Now
I can read the JPEG file from this
stream, and try to display it.
Epilogue
But Transferables from
other applications are
usually represented by a
java.io.InputStream
These take more work.
Object
Usually, when Transferables come from
within Java programs, they include a
DataFlavor obtained by
new DataFlavor(Class.forName(String),String);
These are represented by a ready-touse Java object
Flavors ready for scooping:
DataFlavor.stringFlavor
DataFlavor.getTextPlainUnicodeFlavor()
DataFlavor.javaSerializedObjectMimeType
DataFlavor.javaFileListFlavor
new DataFlavor(Class.forName(“mypackage.MyClass”),
“My Neat-O Class”)
new DataFlavor(MIMETypeString, HumanReadableString)
Using the Clipboard
Pass Transferables to and from system
Clipboard. The clipboard must be
obtained with:
Toolkit.getSystemClipboard()
Pasting: use theClipboard.getContents()
to get a Transferable object. Then
extract the DataFlavor you want as
previously described.
Clipboard: Cutting
When cutting, we are promising the
system that we will make the clipboard
material available until it is replaced by
the user. The ClipboardOwner interface
allows the OS to notify us when we can
forget the clipboard contents.
Clipboard.setContents() method cuts.
Must implement Transferable for this.
Clipboard notes
Swing text components already support
cut-and-paste to system clipboard.
Often this is enough.
Can also have local clipboards. Useful
if you want more persistence and don’t
wish to allow data exchange with other
programs.
Gestures
A gesture is a high-level input event
comprising a series or combination of
several low-level mouse events. Can
convey complicated information more
easily than low-level mouse events.
Gestures are:
information-rich
natural to the user
subject to misinterpretation/misinput
common to many tasks (even a
language in themselves)
not necessarily natural to the UI
culture-specific
Gestures in Java
Java does not have a “Gesture” class.
Does have an extremely powerful
mechanism for handling “drag gestures”


Supports drag-and-drop between
components, objects, even non-Java
applications.
Useful for moving, copying, linking, etc.
Package java.awt.dnd
On drag end: must set up
DragSource,
DragGestureListener, DragSourceListener
On drop end: must set up
DropTarget,
DropTargetListener
A successful drop gives the
DropTargetListener a reference to a
Transferable Object. See
java.awt.datatransfer
Initialization
Source Component
DragSource
Target Component
DragSourceListener
DropTargetListener
DropTarget
DragGestureListener
DragSourceContext
DragSourceContextPeer
The AWT Implementation
(System specific)
Flow of Events
Source Component
DragSource
Target Component
DragSourceListener
DropTargetListener
DropTarget
DragGestureListener
DragSourceContext
DragSourceContextPeer
The AWT Implementation
(System specific)
DND within Java
DND recipe
1. Obtain a reference to a drag source
with DragSource.getDefaultDragSource()
or by instantiating a new one -- for
example, new DragSource() .
2. Create a drag gesture recognizer with
the drag source from step 1 by
invoking
DragSource.createDefaultDragGestureRec
ognizer(). The method is passed the
component where the drag originates.
3. Wrap the data to be dragged in a
transferable.
DND Recipe part II
4. Initiate a drag when the drag gesture
recognizer from step 2 is notified by
invoking DragSource.startDrag() for
the drag source from step 1. The
transferable from step 4 is passed to
the startDrag() method.
5. Handle the drop by implementing the
DropTargetListener interface.
6. Implement the DragSource interface
(often with empty methods).
Click gestures
Instead of associating a single
command to a button, can associate
two or more. For instance, left-click,
right-click, double-click, shift-click, altclick, left-and-right-click, etc. However,
Java doesn’t support this well.
Can recognize double-clicks using
MouseEvent.getClickCount() method.
Windows 2000 clicks
Click type
left-click
right-click
left-and-right-click
double-(left)-click
ctrl-click
shift-click
alt-double-click
Default Action
select
select + options
select + options
open/raise
add to selection
select rectangle
show properties
Windows 2000 drags
Click type
left-drag
ctrl-left-drag
alt-left-drag
shft-ctrl-left-drag
right-drag
Default Action
move
copy
link
link
pop-up options
DND Reading
DND Fundamentals (Geary, Sun)
Intro, part 1 (Javaworld)
Intro, part 2 (Javaworld)
Sun’s DND trail (minimal)
DND Links (esus)
JFC in a Nutshell, Chapter 6.
Data Transfer API (Javaworld)
Creating a DesktopIcon class
Desktop icons represent files. Their
transferable content is most naturally
represented internally by the File class.
Externally by
DataFlavor.javaFileListFlavor.
Set up DND. Ordinary files have
dragsources. Directories have
dragsources and dragtargets for MOVE
and COPY.