|
Letzte
Bearbeitung dieses Dokuments: |
Übersichtsbeschreibung
Code
Erklärungen
und Anwendungsbeispiele
* Erstellen
eines Objektes dieser Klasse
* Zuordnen
eines Objektes des Klasse 'JLabel' für die Anzeige der
Image-Größe
* Festlegen
der Texte für das Kontext-Menu
* Reagieren
auf eine Änderung des angezeigten Images
* Transferieren
des Images in das / aus dem JSBS_ImagePane
* Importieren
des Images von einer Datei
* Exportieren
des Images auf eine Datei
* Schreiben
auf eine / Lesen von einer Datenbank
Verwandte
Dokumentation
Diese Klasse ist ein
GUI-Element für die Anzeige von Images (Fotos oder
Grafiken).
Durch den Aufruf verschiedener Methoden können
zwei mögliche Arten der Darstellung des Images gewählt
werden.
Mit der Methode
setFullResolutionMode()
wird das Image mit
voller Auflösung angezeigt. |
Mit der Methode
setFitImageMode()
wird das Image
verkleinert und komplett im zur Verfügung stehenden Platz
angezeigt. |
Weitere
Möglichkeiten zur Steuerung finden Sie im Abschnitt
Erklärungen
und Anwendungsbeispiele
.
package
js_base.frame;
import
java.awt.*;
import
java.awt.datatransfer.*;
import
java.awt.event.*;
import
java.awt.image.*;
import
java.io.*;
import
javax.imageio.ImageIO;
import
javax.swing.*;
/**
*
* @author kurt[at]javascout(dot)biz
* @date
2010-08-16
*
* @description
* de:
*
Spezielles GUI-Element für die Anzeige von Images (Fotos,
Grafiken).
* Durch eine Einstellung innerhalb der
Klasse
* (gesteuert durch einen Constructor-Parameter
oder durch Methoden)
* kann entschieden werden, ob
*
* das Image verkleinert als Ganzes im zum Verfügung
stehenden Platz auf der GUI oder
* * das Image in
voller Auflösung mit Scrollbars
* angezeigt
wird.
* -------------------
* en:
*
Special GUI-Element to display Images (photos, graphics).
*
A setup within the class (controlled by a constructor-parameter
or methods)
* allows to decide, if
* *
the Image is shrinked and shown as a whole within the available space
on the GUI or
* * The Image is shown with full
resolution and scrollbars.
*
* @change-log
*
when who why
*
--------------------------------------------------------
*
*/public
class
JSBS_ImagePane
extends JScrollPane
{
/*
*
Variable der Klasse / variables of the class. */
/*
* de:
* Gesamtes Image in ursprünglicher
Auflösung.
* Verwendet wird ein ImageIcon um auch
animierte GIF-Dateien anzeigen zu können.
* en:
* Complete Image in original resolution.
* An
ImageIcon is used to display so that animated GIF-graphics can be
displayed, too. */
private
ImageIcon
imgFullResolution
;
/*
* de:
* Image in Form eines Byte-Streams. Das ist notwendig
wenn ein animiertes GIF angezeigt werden soll.
* Anmerkung:
* Für
animierte GIFs habe ich keine Möglichkeit gefunden, den
Bytestream für das Speichern in einer Datei
* oder
auf einer Datenbank wieder aus dem ImageIcon herzustellen.
* Um
in den Methoden ein konsistentes Verhalten für alle Grafik-Typen
zu erreichen, wird ein
* übergebenener Bytestream
in dieser Variablen gespeichert und auf Anforderung durch die
Methode
* 'getImageAsByteArray()' wieder zurück
geliefert.
* en:
* Image in the form of
a byte-stream. That is needed to display an animated
GIF.
* Remark:
* I did not find any
algorithm to derive a bytestream – needed to save in a file or
on a database -
* from an ImageIcon.
* To
offer consistant behaviour for all types of graphics within the
methods, a passed bytestream
* is stored in this
variable an returned if requested by the method
'getImageAsByteArray()'. */
private
byte
[]
arrayImageAsBytes
=
new
byte
[0];
/*
* de:
* Grafik-Typ, der gemeinsam mit dem Image als
Bytestream übergeben werden muss oder der beim
* Erstellen
des Bytestreams für die Grafik verwendet wurde.
* en:
* Graphics-type that has to be passed together with
the Image as bytestream or is used when
* the
bytestream is generated out of the ImageIcon. */
private
String
strGraphicFormat
=
""
;
/*
* de:
* Marker ob das Image in voller Auflösung (mit
Scrollbalken) oder
* verkleinert als Ganzes auf der zur
Verfügung stehenden Fläche der GUI
* angezeigt
werden soll.
* en:
* Flag if the Image
should be shown with full resolution (with scrollbars) or
* the
Image should be shrinked to fit into the given space on the GUI.
*/
private
boolean
bolDisplayFullResolution
;
/*
* de:
* Möglicherweise als Parameter übergebenes
GUI-Element zur Anzeige der Anzahl der
* horizontalen
und vertikalen Pixel (Bildpunkte) aus denen das Image aufgebaut
ist.
* en:
* GUI-Element –
optionally passed as parameter – to display the number of
horizontal
* and vertoical pixels that make up the
image. */
private
JLabel
lbl_ImageInfoResolution
;
/*
* de:
* Innere Klasse für die Aufbereitung (wenn
notwendig Verkleinerung) und Anzeige
* des
Images.
* en:
* Inner class to treat
(resizing if neccessary) and display of the image. */
private
JSBS_InternalImagePane
pnl_Internal
;
/*
* de:
* Texte für das Context-Menu über dem Image
mit der Auswahl für Kopieren oder Einfügen.
* Diese
Texte können mit der Methode 'setLanguageSpecificMenuTexts'
verändert werden.
* en:
* Texts for
the context-menu over the image with the selection for copy and
paste.
* These texts can be changed using the method
'setLanguageSpecificMenuTexts'. */
private
String
strMenuTextCopy
=
"copy
(to clipboard)"
;
private
String
strMenuTextPaste
=
"paste
(from clipboard)"
;
/*
*
**************************************************
*//*
* de:
* Standard-'Constructor'
der Klasse mit allen möglichen Parametern.
* en:
* Standard-'Constructor' of the
class with all possible parameters. */
public
JSBS_ImagePane(ImageIcon
parmImageIcon,
boolean
parmDisplayFullResolution,
JLabel parmImageInfoResolution) {
/* de:
Aufrufen des 'Constructor' der Superklasse (JLabel).
* en:
Call the 'Constructor' of the superclass (JLabel).
*/
super
();
/* de:
Übertragen der Parameter-Werte in die Variablen dieses
Klasse.
* en: Transfer the parameter-values into the
variables of this class. */
imgFullResolution
=
parmImageIcon;
bolDisplayFullResolution
=
parmDisplayFullResolution;
lbl_ImageInfoResolution
=
parmImageInfoResolution;
/* de:
* Konstruieren
eines Objekts der inneren Klasse, dieses in den 'Viewport' aufnehmen
* und übergeben des Images.
* en:
* Construct
an object of the inner class, add this to the 'Viewport' and pass the
image. */
pnl_Internal
=
new
JSBS_InternalImagePane(
this
);
this
.setViewportView(
pnl_Internal
);
pnl_Internal
.setImage();
}/*
* de:
Abwandlungen des 'Constructor'.
* en: Derivations of
the 'Constructor'. */
public
JSBS_ImagePane(
boolean
parmDisplayFullResolution,
JLabel parmImageInfoResolution) {
/* de:
Aufrufen des 'Constructor' der Superklasse (JLabel).
* en:
Call the 'Constructor' of the superclass (JLabel).
*/
super
();
/* de:
Füllen der Variablen für nicht übergebenen Werte mit
Standard-Werten.
* en: Fill the variables for not
passed values with standard-values. */
imgFullResolution
=
null
;
/* de:
Übertragen der Parameter-Werte in die Variablen dieses
Klasse.
* en: Transfer the parameter-values into the
variables of this class. */
bolDisplayFullResolution
=
parmDisplayFullResolution;
lbl_ImageInfoResolution
=
parmImageInfoResolution;
/* de:
* Konstruieren
eines Objekts der inneren Klasse, dieses in den 'Viewport' aufnehmen
* und übergeben des Images.
* en:
* Construct
an object of the inner class, add this to the 'Viewport' and pass the
image. */
pnl_Internal
=
new
JSBS_InternalImagePane(
this
);
this
.setViewportView(
pnl_Internal
);
pnl_Internal
.setImage();
}/* *****
*/
public
JSBS_ImagePane(
boolean
parmDisplayFullResolution)
{
/* de:
Aufrufen des 'Constructor' der Superklasse (JLabel).
* en:
Call the 'Constructor' of the superclass (JLabel).
*/
super
();
/* de:
Füllen der Variablen für nicht übergebenen Werte mit
Standard-Werten.
* en: Fill the variables for not
passed values with standard-values. */
imgFullResolution
=
null
;
lbl_ImageInfoResolution
=
null
;
/* de:
Übertragen der Parameter-Werte in die Variablen dieses
Klasse.
* en: Transfer the parameter-values into the
variables of this class. */
bolDisplayFullResolution
=
parmDisplayFullResolution;
/* de:
* Konstruieren
eines Objekts der inneren Klasse, dieses in den 'Viewport' aufnehmen
* und übergeben des Images.
* en:
* Construct
an object of the inner class, add this to the 'Viewport' and pass the
image. */
pnl_Internal
=
new
JSBS_InternalImagePane(
this
);
this
.setViewportView(
pnl_Internal
);
pnl_Internal
.setImage();
}/* *****
*/
public
JSBS_ImagePane(JLabel
parmImageInfoResolution) {
/* de:
Aufrufen des 'Constructor' der Superklasse (JLabel).
* en:
Call the 'Constructor' of the superclass (JLabel).
*/
super
();
/* de:
Füllen der Variablen für nicht übergebenen Werte mit
Standard-Werten.
* en: Fill the variables for not
passed values with standard-values. */
imgFullResolution
=
null
;
bolDisplayFullResolution
=
false
;
/* de:
Übertragen der Parameter-Werte in die Variablen dieses
Klasse.
* en: Transfer the parameter-values into the
variables of this class. */
lbl_ImageInfoResolution
=
parmImageInfoResolution;
/* de:
* Konstruieren
eines Objekts der inneren Klasse, dieses in den 'Viewport' aufnehmen
* und übergeben des Images.
* en:
* Construct
an object of the inner class, add this to the 'Viewport' and pass the
image. */
pnl_Internal
=
new
JSBS_InternalImagePane(
this
);
this
.setViewportView(
pnl_Internal
);
pnl_Internal
.setImage();
}/* *****
*/
public
JSBS_ImagePane()
{
/* de:
Aufrufen des 'Constructor' der Superklasse (JLabel).
* en:
Call the 'Constructor' of the superclass (JLabel).
*/
super
();
/* de:
Füllen der Variablen für nicht übergebenen Werte mit
Standard-Werten.
* en: Fill the variables for not
passed values with standard-values. */
imgFullResolution
=
null
;
bolDisplayFullResolution
=
false
;
lbl_ImageInfoResolution
=
null
;
/* de:
* Konstruieren
eines Objekts der inneren Klasse, dieses in den 'Viewport' aufnehmen
* und übergeben des Images.
* en:
* Construct
an object of the inner class, add this to the 'Viewport' and pass the
image. */
pnl_Internal
=
new
JSBS_InternalImagePane(
this
);
this
.setViewportView(
pnl_Internal
);
pnl_Internal
.setImage();
}/*
* de:
METHODE zum Zurückliefern des angezeigten Image.
* en:
METHOD to return the displayed image. */
public
ImageIcon
getImage()
{
return
imgFullResolution
;
}/*
* de:
* METHODE zum Zurückliefern des angezeigten Image
als Array von Bytes.
* en:
* METHOD to
return the displayed image as an array of bytes. */
public
byte
[]
getImageAsByteArray() {
/* de:
* Aufrufen der gleichnamigen Methode mit dem
Grafik-Format als Parameter.
* Als
Parameter wird 'null' übergeben; damit wird jenes Grafik-Format
zurück geliefert das gemeinsam
* mit einem
Bytestream in der Methode 'setImage(byte[] parmImage, String
parmGraphicsFormat)'
* übergeben wurde.
Wurde
das Image über das Kontext-Menu 'Paste' oder mit der Methode
* 'setImage(ImageIcon parmIMageIcon)' übernommen,
dann wird das Standard-Format (jpg) verwendet.
* en:
* Call the method with the same name and the
graphics-format as parameter.
* 'null'
is passed as parameter; that return the graphics-Format that was
passed together with the
* bytestream in the method
'setImage(byte[]
parmImage, String parmGraphicsFormat)'.
* If the image was
inserted via the context-menu 'Paste' or with the method
'setImage(ImageIcon parmIMageIcon)',
* then the
standard-format (jpg) is used. */
return
getImageAsByteArray(
null
);
}/*
* de:
* METHODE zum Zurückliefern des angezeigten Image
als Array von Bytes.
* Als
Parameter wird das Grafik-Format übergeben.
* en:
* METHOD to return the displayed image as an array of
bytes.
* The
graphics-format is passed as parameter. */
public
byte
[]
getImageAsByteArray(String parmGraphicsFormat) {
/* de:
* Wenn
bereits ein Bystream erstellt ist und auch das Grafik-Format dafür
festgelegt ist,
*
dann wird der bereits vorhandene Bytestream zurück geliefert.
* en:
*
If there is already a bytestream defined and an graphics-format is
attached to,
*
then this already present bytestream is returned. */
if
((
arrayImageAsBytes
.
length
>
0) && (
strGraphicFormat
.length()
> 0))
return
arrayImageAsBytes
;
/* de:
*
Weitere
Verarbeitung wenn noch kein Bytestream für das angezeigte Image
erstellt wurde.
* Zuerst
Festlegen des Standard-Formats (JPG).
* en:
*
Further
processing if there is not already a bytestream defined for the
displayed image.
* First
define the standard-format (JPG). */
String
strInternalGraphicsFormat =
"jpg"
;
/* de:
* Wenn im Parameter ein Grafik-Format übergeben
wurde dann zuerst mit dem bereits zum
* Bytestream
festgelegten Grafik-Format vergleichen.
* Wurde noch kein
Grafik-Format festgelegt wurde, dann das übergebene
Grafik-Format für
* weitere Verarbeitung verwenden.
* en:
* If a graphics-format parameter
was passed, then this value is compared to the
*
graphics-format already defined for the bytestream.
* If no
graphics-format was already specified, then use the passed
graphics-format for
* further processing. */
if
(parmGraphicsFormat
!=
null
)
strInternalGraphicsFormat
=
parmGraphicsFormat;
/* de:
Aufheben
des verwendeten Grafik-Formats in der Variablen dieser Klasse
.
* en: Keep the used graphics-format within the
variable of this class. */
strGraphicFormat
=
strInternalGraphicsFormat;
/* de:
* Umwandeln eines Images in ein Byte-Attay erfordert
mehrere Schritte.
* Das ganze erfolgt innerhalb einer
try-catch-Logik um Fehler abzufangen.
* en:
* Converting an Image to a byte-array requests
multiple steps
* The commands are within a
try-catch-logic to catch and process errors. */
try
{
/* de:
* Für den ersten Schritt der Umwandlung ist eine
Vorbereitung wie zum Schreiben
* auf eine Datei
notwendig.
* en:
* The first step of
converting requests a preparation like writing to a file.
*/
ByteArrayOutputStream
streamOut =
new
ByteArrayOutputStream();
/* de:
* Umgewandelt in einen Bytestream kann nur ein Objekt der
Klasse BufferedImage.
* Dieses wird jetzt mit der gleichen
Fläche wie das angezeigte Image 'konstruiert'.
* en:
* Only an object of class BufferedImage can be converted to
a bytestream.
*
This BufferedImage-object is now constructed
with
the same area as the displayed image. */
BufferedImage
localBufferedImage =
new
BufferedImage(
imgFullResolution
.getImage().getWidth(
null
),
imgFullResolution
.getImage().getHeight(
null
),
BufferedImage.
TYPE_INT_RGB
);
/* de:
* Das Unterobjekt für die Grafik des gerade erstellten
BufferedImage wird einer lokalen Variable
* zugewiesen; der
Bereich der Grafik wird initialisiert.
* en:
*
The sub-object for the graphic of the just constructed BufferedImage
is attached to a local
*
variable; the graphic-area is intialised. */
Graphics2D
localGraphics = localBufferedImage.createGraphics();
/* de:
* In die Grafik des BufferedImage wird der Inhalt der
Grafik des angezeigten Images übertragen.
*
-----------------
* Einschränkung:
* Auf diese
Weise kann nur ein Image eines 'animierten GIF' übertragen
werden !
* ------------------
* en:
* The graphic of the BufferedImage is filled with the
content of the graphic of the displayed image.
*
-------------------
* Limitation:
* This code
allows only the transfer of one image of an 'animated GIF' !
*
-------------------
*/
localGraphics.drawImage(
imgFullResolution
.getImage(),
0,
0,
imgFullResolution
.getImage().getWidth(
null
),
imgFullResolution
.getImage().getHeight(
null
),
null
);
/* de:
* Methode zum 'Schreiben' des Images auf den
Output-Stream aufrufen.
* Als Parameter an die Methode
wird auch das gewünschte Grafik-Format übergeben.
* en:
* Call the method to 'write' the image to an
Output-Stream.
* As one parameter to the method the
requested graphics-format is passed.
*/
ImageIO.write(localBufferedImage,
strGraphicFormat
,
streamOut);
/* de:
Byte-Array aus dem Stream extrahieren und zurück liefern.
* en: Extract the byte-array out of the Stream and
return it. */
return
streamOut.toByteArray();
}
catch
(Exception
Exc) {
/* de:
Umwandeln des Images in das Byte-Array fehlgeschlagen; leeres Array
zurück liefern.
* en: Converting the image to a
byte-array failed; return an empty array. */
return
new byte
[0];
}
}/*
* de:
METHODE zum Auslesen des Grafik-Formats in dem der Bytestream des
Images erstellt ist.
* en: METHOD to read the
graphics-format in which the bytestream of the image is constructed.
*/
public
String
getGraphicsFormat() {
/* de:
Die Variable dieser Klasse zurück liefern.
* en:
Return the variable of this class. */
return
strGraphicFormat
;
}/*
* de:
METHODE zum Anzeigen eines neuen Image.
* en: METHOD
to display a new image. */
public
void
setImage(ImageIcon
parmImage) {
/* de:
Übertragen des Parameter-Wertes in die Variable dieser
Klasse.
* en: Transfer the parameter-value into the
variable of this class. */
imgFullResolution
=
parmImage;
/* de:
'Löschen' des Bytestreams für das Image und der
Beschreibung für das Grafik-Format.
* en: 'Delete'
the bytestream for this image and the description of the
graphics-format. */
arrayImageAsBytes
=
new
byte
[0];
strGraphicFormat
=
""
;
/* de:
Aufrufen der gleichnamigen Methode der inneren Klasse.
* en:
Call the method with the same name of the inner class.
*/
pnl_Internal
.setImage();
}/*
* de:
* METHODE zum Anzeigen eines neuen Image.
*
Dieses wird in Form eines Array aus bytes übergeben und
zusätzlich wird das Grafik-Format übergeben.
* en:
* METHOD to display a new image.
*
This is passed as an array of bytes and additionally the
graphics-format is passed, too. */
public
void
setImage(
byte
[]
parmImage, String parmGraphicFormat) {
/* de:
* Speichern beider Parameter in den dafür vorgesehenen
Variablen dieser Klasse.
* en:
* Save both
parameters in the assigned variables of this class.
*/
arrayImageAsBytes
= parmImage;
strGraphicFormat
= parmGraphicFormat;
/* de:
Sicherheitsprüfung ob auch ein Wert übergeben wurde.
* en:
Safetycheck if a value was passed. */
if
(parmImage
!=
null
)
{
/* de:
* Umwandeln des Byte-Arrays (übergeben als
Parameter) und übertragen in die Variable diese Klasse.
* en:
* Convert the byte-array (passed as parameter) and
transfer into the variable of this class. */
Image
localImage
=
Toolkit.getDefaultToolkit().createImage(parmImage);
imgFullResolution
=
new
ImageIcon(localImage);
}
else
{
/* de:
* 'null' als Parameter übergeben; Image ebenfall
auf 'null' setzen.
* Damit wird in der Methode der internen
Klasse eine leere Fläche angezeigt.
* en:
*
'null' passed as parameter. Set Image to 'null', too.
* This
causes the method within the internal class to display an empty area.
*/
imgFullResolution
=
null
;
}
/* de:
Aufrufen der gleichnamigen Methode der inneren Klasse.
* en:
Call the method with the same name of the inner class.
*/
pnl_Internal
.setImage();
}/*
* de:
METHODE zum Anzeigen eines in der Zwischenablage (Clipboard)
enthaltenen Image.
* en: METHOD to display an image
contained in the clipboard. */
public
void
setImageFromClipboard()
{
/* de:
* Image aus dem Clipboard in ein 'ImageIcon'
übernehmen und
* Methode zum Anzeigen des
ImageIcon aufrufen.
* en:
* Transfer the
image from the clipboard into an 'ImageIcon' and
* call
the method to display the ImageIcon. */
setImage(
new
ImageIcon(
pnl_Internal
.getImageFromClipboard()));
}/*
* de:
METHODE zum Kopieren des angezeigten Images in die Zwischenablage
(Clipboard).
* en: METHOD to copy the displayed image
into the clipboard. */
public
void
putImageToClipboard()
{
/* de:
Methode der inneren Klasse aufrufen und dort die Arbeit machen
lassen.
* en: Call the method of the inner class and
let the work do there.
*/
pnl_Internal
.putImageToClipboard();
}/*
* de:
* METHODE zum Wechsel in den Anzeigemodus für die
volle Auflösung des
* Images mit Scroll-Balken
(wenn notwendig).
* en:
* METHOD to
switch to the full-resolution mode for the display and to
* show
scroll-bars (if neccessary). */
public
void
setFullResolutionMode()
{
/* de:
Ändern des Markes in dieser Klasse.
* en: Change
the flag within this class. */
bolDisplayFullResolution
=
true
;
/* de:
Aufrufen der Methode der inneren Klasse zum Neu-Anzeigen des
Images.
* en: Call the method of the inner class to
redisplay the image.
*/
pnl_Internal
.setImage();
}/*
* de:
* METHODE zum Wechsel in den Anzeigemodus für die
Anzeige des Images
* im verfügbaren Platz auf der
GUI – mit Verkleinerung des Images wenn notwendig.
* en:
* METHOD to switch to the mode that shrinks (if
neccessary) the image so that it
* can be completely
shown in the available space at the GUI. */
public
void
setFitImageMode()
{
/* de:
Ändern des Markes in dieser Klasse.
* en: Change
the flag within this class. */
bolDisplayFullResolution
=
false
;
/* de:
Aufrufen der Methode der inneren Klasse zum Neu-Anzeigen des
Images.
* en: Call the method of the inner class to
redisplay the image.
*/
pnl_Internal
.setImage();
}/*
* de:
* METHODE zum Übernehmen sprach-spezifischer
Texte für die Auswahl im Kontext-Menu
* das über
dem Image erscheint.
* Ein Parameterwert 'null'
bewirkt, dass der Menu-Eintrag nicht angezeigt wird.
* en:
* METHOD to set language-specific texts for the
selection in the context-menu
* popping up over over
the image.
* A parameter-value 'null' prevents the
menu-item to be shown. */
public
void
setLanguageSpecificMenuTexts(String
parmTextCopy, String parmTextPaste) {
strMenuTextCopy
=
parmTextCopy;
strMenuTextPaste
=
parmTextPaste;
}
/* ********************
* de:
* INTERNE KLASSE für die Anzeige des
Images.
* Diese Innere Klasse ist notwendig, weil ein
GUI-Element mit Scrollbalken
* (JScrollPane) nur dafür
vorgesehen ist, in seinem 'Viewport' ein anderes
* GUI-Element
anzuzeigen.
* Dieses 'andere GUI-Element' (für die
Anzeige des Images) wird in dieser Klasse
* implementiert.
* en:
* INTERNAL CLASS to display the image.
* This
inner class is needed, because a GUI-Element with scrollbars
(JScrollPane)
* is only designed to show another
GUI-Element within its 'Viewport'.
* This 'other
GUI-Element' (to display the image) is implemented by this
* inner
class. */
class
JSBS_InternalImagePane
extends
JLabel
implements
ActionListener,
ClipboardOwner, MouseListener, MouseMotionListener, Scrollable
{
/*
*
Variable der Klasse / variables of the class. */
/*
* de:
* Anzahl der Pixel, um die beim Scrollen mit der Maus
(mit Scrollrad oder per Drag)
* das Image verschoben
wird.
* Dieser Wert wird abhängig von der Höhe
des Images berechnet damit das Scrollen
* mit der Maus
auch in akzeptabler Geschwindigkeit passiert.
* en:
* Number of pixels the image is moved when the mouse
(with scrollwheel or Drag) is used
* to scroll the
image.
* This value is calculated depending on the
height od the image to get a reasonable
* speed when
when scrolling using the mouse. */
private
int
intScrollUnitIncrement
=
10;
/*
* de:
* Referenz auf das 'Scrollpane'; aus diesem werden die
Dimensionen des Platzes
* für das Image und Werte
für die Steuerung der Anzeige ausgelesen.
* en:
* Reference to the 'Scrollpane'; from there the
dimensions of the space for the
* image and values to
control the display are read. */
private
JSBS_ImagePane
pnl_Parent
;
/*
* de:
Image in der Auflösung, die für die Anzeige notwendig
ist.
* en: Image in the resolution needed for display.
*/
private
ImageIcon
imgToBeDisplayed
;
/*
* de:
* Kontext-Menu für das Image; erscheint nach
einem Klick auf die rechte Maustaste
* und erlaubt ein
Kopieren des Images ins Clipboard bzw. ein Einfügen aus dem
Clipboard.
* en:
* Context-menu for the
image; appears after the right mouse-button is pressed and
allows
* a copy of the image to the clipboard or a
paste from the clipboard. */
private
JPopupMenu
mnuCopyPaste
;
/*
*
**************************************************
*//*
* de:
* Standard-'Constructor'
der Klasse; Parameter ist die Referenz auf das übergeordnete
Pane.
* Aus diesem werden die Werte für die
Steuerung der Image-Anzeige ausgelesen.
* en:
* Standard-'Constructor' of the
class; parameter is the reference to the higher-ranking pane.
* From
there the values to control the display of the image are read.
*/
public
JSBS_InternalImagePane(JSBS_ImagePane
parmParent) {
/*
* de:
Übernahme des Parameter-Wertes in die Variable dieser
Klasse.
* en: Transfer the parameter-value into the
variable of this class. */
pnl_Parent
=
parmParent;
/*
* de:
Listener hinzufügen.
* en: Add Listener.
*/
addMouseMotionListener(
this
);
addMouseListener(
this
);
}/*
*
************************************************** *//*
* de:
METHODE zum Anzeigen eines Image.
* en: METHOD to
display an image. */
public
void
setImage()
{
/*
* de:
Zur Sicherheit prüfen ob auch das (Parent-)ScrollPane übergeben
wurde.
* en: Verify for code-safety-reasons that the
(parent-)ScrollPane was passed. */
if
(
pnl_Parent
==
null
)
return
;
/* de:
* Ändern der 'Property' (Eigenschaft) für
die Anzeige eines Scrollbalkens.
* Damit kann durch
einen Event signalisiert werden, dass das Image geändert
wurde.
* Dieser Event kann von einem 'Parent' in der
GUI über einen 'PropertyChangeListener'
* verarbeitet
werden und so kann erkannt werden wenn ein Image durch das 'Paste' im
* Kontext-Menu eingefügt wurde.
* en:
* Change the property for the appearance of a
scrollbar.
* This allows the change of the image to be
signalled by an event.
* This event can be processed by
a 'parent' in the GUI by a 'PropertyChangeListener'
* ans
so can be recognized that an image was inserted using the 'Paste' of
the context-menu.
*/
pnl_Parent
.setHorizontalScrollBarPolicy(
HORIZONTAL_SCROLLBAR_ALWAYS
);
/*
* de:
* Prüfen, ob ein Image übergeben wurde;
sonst als Hinweis ein fast weißes Rechteck anzeigen.
* en:
* Verify if an image was passed as parameter;
otherwise display a nearly white rectangle as indicator. */
if
(
pnl_Parent
.
imgFullResolution
==
null
)
{
BufferedImage
imgWhiteRectangle
=
new
BufferedImage(200,
200, BufferedImage.
TYPE_INT_RGB
);
for
(
int
y
= 0; y < 200; y++) {
for
(
int
x
= 0; x < 200; x++) {
imgWhiteRectangle.setRGB(y,
x, (250 * 256 * 256) + (250 * 256) +
250);
}
}
this
.setIcon(
new
ImageIcon(imgWhiteRectangle));
/*
* de:
* Wenn ein JLabel für die Anzeige der Größe
des Images übergeben wurde dann wird der Text darin
gelöscht.
* en:
* If a JLabel for
the display of image-size was passed then the text of it is deleted.
*/
if
(
pnl_Parent
.
lbl_ImageInfoResolution
!=
null
)
lbl_ImageInfoResolution
.setText(
""
);
return
;
}
/*
* de:
* Übernehmen des Images aus dem ScrollPane in die
Variable dieser Klasse.
* Dazu wird ein neues Objekt
konstruiert weil bei einer reinen Zuweisung auch die Variable im
Parent-Panel
* verkleinert werden würde.
* en:
* Transfer the image from the ScrollPane to the
variable of this class.
* For that a new variable is
constructed, as with a reference only the variable in the
parent-panel would be
* shrinked, too.
*/
imgToBeDisplayed
=
new
ImageIcon(
pnl_Parent
.
imgFullResolution
.getImage());
/*
* de:
* Ermitteln der Größe von verfügbarem
Platz auf der GUI und Größe des anzuzeigenden
Images.
* en:
* Determine the size of
the available space on the GUI and the size of the image to be
displayed. */
int
intImageWidth
=
imgToBeDisplayed
.getIconWidth();
int
intImageHeight
=
imgToBeDisplayed
.getIconHeight();
int
intScrollPaneWidth
=
pnl_Parent
.getWidth();
int
intScrollPaneHeight
=
pnl_Parent
.getHeight();
/*
* de:
* Unterscheiden ob das Image mit voller Auflösung
angezeigt werden soll (und wenn notwendig
* Scroll-Balken
eingeblendet werden) oder ob das Image verkleinert werden
soll.
* en:
* Decide if the image should
be shown with full resolution (and scroll-bars are inserted
* if
neccessary) or the image should be shrinked. */
if
(
pnl_Parent
.
bolDisplayFullResolution
)
{
/*
* de:
Anzeige mit voller Auflösung; weiter prüfen ob
Scroll-Balken notwendig sind.
* en: Display with full
resolution; additional check if scrollbars are needed. */
if
((intImageWidth
> intScrollPaneWidth) || (intImageHeight >
intScrollPaneHeight)) {
pnl_Parent
.setHorizontalScrollBarPolicy(
HORIZONTAL_SCROLLBAR_AS_NEEDED
);
pnl_Parent
.setVerticalScrollBarPolicy(
VERTICAL_SCROLLBAR_AS_NEEDED
);
}
else
{
pnl_Parent
.setHorizontalScrollBarPolicy(
HORIZONTAL_SCROLLBAR_NEVER
);
pnl_Parent
.setVerticalScrollBarPolicy(
VERTICAL_SCROLLBAR_NEVER
);
}
}
else
{
/*
* de:
* Image soll komplett angezeigt werden; d.h. s muss
bei Bedarf verkleinert werden.
* Zuerst die Anzeige von
Scrollbalken 'ausschalten'.
* en:
* Image
should be displayed as a whole; i.e. It must be shrinked if
neccessary.
* First 'switch off' the display of
scrollbars.
*/
pnl_Parent
.setHorizontalScrollBarPolicy(
HORIZONTAL_SCROLLBAR_NEVER
);
pnl_Parent
.setVerticalScrollBarPolicy(
VERTICAL_SCROLLBAR_NEVER
);
/*
* de:
Prüfen ob eine Verkleinerung des Images notwendig ist.
* en:
Verify if the image has to be shrinked. */
if
((intImageWidth
> intScrollPaneWidth) || (intImageHeight >
intScrollPaneHeight)) {
/*
* de:
Verkleinerungsfaktoren für vertikale und horizontale Ausdehnung
berechnen.
* en: Calculate scaling-factors for
horizontal and vertical resolution. */
double
dblHorizontalScale
= intImageWidth / intScrollPaneWidth;
double
dblVerticalScale
= intImageHeight / intScrollPaneHeight;
/*
* de:
Variable für die neue Größe des Images
definieren.
* en: Define variables for the new size of
the image. */
int
intFinalImageWidth
;
int
intFinalImageHeight;
/*
* de:
Unterscheidung welche Dimension stärker verkleinert werden
muss.
* en: Decide which dimension needs mor shrinking.
*/
if
(dblHorizontalScale
> dblVerticalScale) {
/*
* de:
* Horizontal muss stärker verkleinert werden.
* Neue Breite des Images ist die Breite des
ScrollPane;
* Höhe wird um den horizontalen
Faktor verkleinert.
* en:
* Horizontal
shrinking-factor is higher.
* New width is the width of
the ScrollPane; height is shrinked by the horizontal factor.
*/
intFinalImageWidth
=
intScrollPaneWidth;
intFinalImageHeight
= intImageHeight * intScrollPaneWidth / intImageWidth;
}
else
{
/*
* de:
* Vertical muss stärker verkleinert werden;
Algorithmus analog horizontaler Verkleinerung.
* en:
* Vertical shrinking-factor is higher; algorithm
analog horizontal shrinking. */
intFinalImageWidth
= intImageWidth * intScrollPaneHeight / intImageHeight;
intFinalImageHeight
= intScrollPaneHeight;
}
/*
* de:
Originale Image verkleinert in die Variable dieser Klasse
übernehmen.
* en: Shrink original image during
transfer to the variable of this class.
*/
imgToBeDisplayed
.setImage(
pnl_Parent
.
imgFullResolution
.getImage().getScaledInstance(
intFinalImageWidth,
intFinalImageHeight, Image.SCALE_SMOOTH
));
}
}
/*
* de:
Image anzeigen.
* en: Display image.
*/
this
.setIcon(
imgToBeDisplayed
);
/*
* de:
* Berechnen der Scroll-Units; das ist die Anzahl der
Pixel um die das Image für einen
* Impuls des
Scrollrads der Maus verschoben wird.
* Die Scroll-Units
sind so bemessen, dass das Scrollen bei großen Images nicht
'ewig dauert'.
* en:
* Calculate the
Scroll-Units; that is the number of pixel the image is moved for one
impulse
* of the scrollwheel of the mouse.
* The
scroll-units are calculated in a way, that scrolling large images
does not 'take eternally'. */
if
(
imgToBeDisplayed
.getIconHeight()
< 100)
intScrollUnitIncrement
=
1;
else
intScrollUnitIncrement
=
imgToBeDisplayed
.getIconHeight()
/ 100;
/*
* de:
* Wenn im Constructor des ScrollPane ein Parameter
(Typ JLabel) für die Anzeige der Größe des
* Images
übergeben wurde dann wird in diesem jetzt die Original-Größe
des Images angezeigt.
* en:
* If a
parameter (of type JLabel) was passed as parameter in the constructor
of the ScrollPane
* then the original-size of the image
is displayed in that parameter. */
if
(
pnl_Parent
.
lbl_ImageInfoResolution
!=
null
)
{
String
strResolutionInfo =
pnl_Parent
.
imgFullResolution
.getImage().getWidth(
pnl_Parent
)
+
"
x "
+
pnl_Parent
.
imgFullResolution
.getImage().getHeight(
pnl_Parent
);
pnl_Parent
.
lbl_ImageInfoResolution
.setText(strResolutionInfo);
}
}/*
*
**************************************************
* de:
* Anschließend folgen Methoden die durch
verschiedene Events ausgelöst werden.
* Bei
Methoden ohne detaillierte Beschreibung wurde der Code von Mustern
kopiert.
* Methoden die in den Event-getriggerten
Methoden aufgerufen werden folgen nach den
* Event-getriggerten
Methoden.
* en:
* Following are the
methods that are triggered by different events.
* In
methods without a detailled comment, the code was copied from
samples.
* Methods, that are called within
event-triggered methods are implemented after the
* event-triggered
methods. *//*
* de:
METHODE zur Interface 'ActionListener'.
* Diese Methode
wird aufgerufen wenn ein Eintrag aus dem Popup-Menu (für 'Copy'
und 'Paste')
* mit der Maus ausgewählt wird.
* en: METHOD belonging to the Interface
'ActionListener'.
* This method is called when an entry
of the popup-menu (for 'copy' and 'paste') is
* selected
with the mouse. */
public
void
actionPerformed(ActionEvent
e) {
/*
* de:
Ermitteln von welchem Eintrag im Popup-Menu dieser Event ausgelöst
wurde.
* en: Determine which popup-menu-item triggered
this event. */
String
cmd = e.getActionCommand().trim();/*
* de:
'Copy' – Image in die Zwischenablage des Betriebssystems
übertragen.
* en: 'Copy' – transfer the
image to the clipboard of the operating-system. */
if
(cmd.equals(
"mnu_Copy"
))
putImageToClipboard();
/*
* de:
'Paste' – Image aus der Zwischenablage des Betriebssystems
holen und anzeigen.
* en: 'Paste' – get the
image from the clipboard of the operating-system and display it.
*/
if
(cmd.equals(
"mnu_Paste"
))
{
pnl_Parent
.
imgFullResolution
=
new
ImageIcon(getImageFromClipboard());
/*
* de:
* Bytestream für das Image und Grafik-Format im
Parent-Panel 'löschen' um zu signalisieren
* dass
beim Auslesen
des
Bytestreams dieser neu erstellt werden muss.
* en:
* 'Delete' the bytestream and the graphics-format in
the parent-panel to signal that the
* bytestream
must be built new after a request to get ist
.
*/
pnl_Parent
.
strGraphicFormat
=
""
;
pnl_Parent
.
arrayImageAsBytes
=
new
byte
[0];
/*
* de:
Gerade eingefügtes Image neu anzeigen.
* en:
Display the just pasted image.
*/
setImage();
}
}/*
* de:
METHODE zur Interface 'ClipboardOwner'; kein spezifischer Code.
* en: METHOD belonging to the Interface
'ClipboardOwner'; no specific Code. */
public
void
lostOwnership(Clipboard
parmClipboard, Transferable parmTransferable) {}
/*
* de:
METHODE zur Interface 'MouseListener'.
* Diese Methode
wird aufgerufen wenn eine Maustaste geklickt (gedrückt und
gleich wieder
*
losgelassen)
wird.
* en: METHOD belonging to the Interface
'MouseListener'.
* This method is called when a
mouse-button is clicked (pressed and released immediately).
*/
public
void
mouseClicked(MouseEvent
e) {
/*
* de:
Beim Klicken der linken Maustaste wird das Menu wieder entfernt.
* en: The menu is removed when the left mouse-button
is clicked. */
if
(e.getButton()
== MouseEvent.
BUTTON1
)
{
/*
* de:
* Etwas komplizierter Code um das Popup-Menu wieder
verschwinden zu lassen wenn
* der Anwender keine
Auswahl trifft.
* Vielleicht geht es einfacher –
habe aber nichts gefunden.
* en:
* A
little bit complicated code to let the popup-menu diappear if the
user does not
* choose an item from the menu.
* Maybe
ther is an easier way – but I did not find it till now.
*/
mnuCopyPaste
.removeAll();
mnuCopyPaste
.setSize(0,
0);
mnuCopyPaste
=
null
;
/*
* de:
* Zuletzt wird noch eine Bewegung mit dem Scrollrad
der Maus simuliert damit die
* vom Popup-Menu
hinterlassene freie Fläche wieder durch den Teil des Images
gefüllt wird.
* en:
* Finally, a
movement with the scrollwheel of the mouse is simulated to
redisplay
* the part of the image that was covered by
the popup-menu. */
try
{
Robot
tmpRobot =
new
Robot();
tmpRobot.mouseWheel(1);
tmpRobot.mouseWheel(-1);
}
catch
(Exception
Exc) {}
this
.repaint();
/*
* de:
Methode beenden; damit wird das 'else' eingespart ;-).
* en:
End the method; that saves the 'else' ;-).
*/
return
;
}
/*
* de:
* Wenn eine andere als die 'linke' Maustaste geklickt
wird:
* Popup-Menu erstellen und mit den
Auswahlmöglichkeiten füllen.
* Eine
Auswahlmöglichkeit wird aber nur angezeigt wenn der Text dafür
nicht 'null' ist.
* en:
* If another
mouse-button than the 'left' one is clicked:
* Create
the popup-menu and fill it with the selectable items.
* A
menu-item is only shown if the text to be displayed is not 'null'.
*/
mnuCopyPaste
=
new
JPopupMenu();
/* ***** */
if
(
pnl_Parent
.
strMenuTextCopy
!=
null
)
{
JMenuItem
itemCopy = new
JMenuItem(
pnl_Parent
.
strMenuTextCopy
);
mnuCopyPaste
.add(itemCopy);
/*
* de:
* Prüfen, ob ein Image angezeigt wird;
* in
diesem Fall den Menu-Eintrag für 'Copy' aktivieren und den
Listener hinzufügen.
* en:
* Verify
if an image is displayed;
* in that case enable the
menu-item 'copy' and add the Listener. */
if
(
pnl_Parent
.
imgFullResolution
!=
null
)
{
itemCopy.setEnabled(true
);
itemCopy.addActionListener(this
);
itemCopy.setActionCommand("mnu_Copy"
);
}
else
itemCopy.setEnabled(
false
);
}/* ***** */
if
(
pnl_Parent
.
strMenuTextPaste
!=
null
)
{
JMenuItem
itemPaste = new
JMenuItem(
pnl_Parent
.
strMenuTextPaste
);
mnuCopyPaste
.add(itemPaste);
/*
* de:
* Prüfen, ob ein Image im Clipboard des
Betriebssystem vorhanden ist;
* in diesem Fall den
Menu-Eintrag für 'Paste' aktivieren und den Listener hinzufügen.
* en:
* Verify if an image is in the
clipboard of the operating-system;
* in that case
enable the menu-item 'paste' and add the Listener. */
if
(getImageFromClipboard()
!=
null
)
{
itemPaste.setEnabled(true
);
itemPaste.addActionListener(this
);
itemPaste.setActionCommand("mnu_Paste"
);
}
else
itemPaste.setEnabled(
false
);
}/*
* de:
Popup-Menu an der Position des Mauszeigers anzeigen.
* en:
Display the popup-menu at the position of the mouse-pointer.
*/
if
((
pnl_Parent
.
strMenuTextCopy
!=
null
)
|| (
pnl_Parent
.
strMenuTextPaste
!=
null
))
mnuCopyPaste
.show(e.getComponent(),
e.getX(), e.getY());
}
/*
* de:
METHODEN zur Interface 'MouseListener'; kein spezifischer Code.
* en: METHODS belonging to the Interface
'MouseListener'; no specific Code. */
public
void
mouseEntered(MouseEvent
e) {}
public
void
mouseExited(MouseEvent
e) {}
public
void
mousePressed(MouseEvent
e) {}
public
void
mouseReleased(MouseEvent
e) {}
/*
* de:
METHODE zur Interface 'MouseMotionListener'; kein spezifischer Code.
* en: METHOD belonging to the Interface
'MouseMotionListener'; no specific Code. */
public
void
mouseMoved(MouseEvent
e) {}
/*
* de:
METHODE zur Interface 'MouseMotionListener'.
* Diese
Methode wird aufgerufen wenn eine Maustaste niedergehalten ist und
der Mauszeiger
* bewegt wird. Ist der Mauszieger
außerhalb des ScrollPane wird das Image 'gescrollt'
* en:
METHOD belonging to the Interface 'MouseMotionListener'.
* This
method is called when a mouse-button is hold down and the
mouse-pointer is moved.
* Is the mouse-pointer outside
the ScrollPane then the image will be 'scrolled'. */
public
void
mouseDragged(MouseEvent
e) {
/*
* de:
* Verwendeter Algorithmus:
* Ein
Rechteck des JLabels (mit dem Image) auswählen und das JLabel
innerhalb des JScrollPane
* so verschieben, dass das
ausgewählte Rechteck im Sichtfenster des JScrollPane ist.
* en:
* Used algorithm:
* Select
a rectangle of the JLabel (containing the image) and move the JLabel
within the JScrollPane
* so that the rectangle is in
the visible area of the JScrollPane. */
Rectangle
r = new
Rectangle(e.getX(),
e.getY(), 1, 1);
scrollRectToVisible(r);
}/*
* de:
METHODEN zur Interface 'Scrollable';
* Diese Methoden
passen die Scrollgeschwindigkeit bei Verwendung des Scrollrades auf
der Maus
* oder beim 'Mouse-Drag' an die Größe
des Images an. Damit wird vermieden, dass es 'ewig dauert'
* bis
ein großes Image komplett verschoben ist.
* Die
Geschwindigkeit beim Scrollen wird durch die Variable
'intScrollUnitIncrement' bestimmt;
* der Wert der
Variable wird am Ende der Methode 'setImage()' berechnet.
* Der
Algorithmus wurde von einem Muster kopiert – deswegen fehlt
eine Beschreibung.
* en: METHODS belonging to the
Interface 'Scrollable'; no specific Code.
* These
methods adapt the scrollspeed to the size of the image when the
scrollwhel of the mouse o
* r 'mouse-drag' is used.
Adapting the scroll-speed prevents that scrolling of large images
* 'takes eternally'.
* The scroll-speed
is controlled by the variable 'intScrollUnitIncrement'; the value of
this variable
* is calculated at the end of method
'setImage().
* The algorithm was copied from an
example; therefore a description is missing. */
public
Dimension
getPreferredScrollableViewportSize() {
return
getPreferredSize();
}
public
int
getScrollableBlockIncrement(Rectangle
visibleRect,
int
orientation,
int
direction)
{
if
(orientation
== SwingConstants.
HORIZONTAL
)
return
visibleRect.
width
-
1;
else
return
visibleRect.
height
-
1;
}
public
int
getScrollableUnitIncrement(Rectangle
visibleRect,
int
orientation,
int
direction)
{
int
currentPosition
= 0;
if
(orientation
== SwingConstants.
HORIZONTAL
)
currentPosition =
visibleRect.
x
;
else
currentPosition
=
visibleRect.
y
;
if
(direction
< 0) {
int
newPosition
= currentPosition - (currentPosition /
intScrollUnitIncrement
)
*
intScrollUnitIncrement
;
return
(newPosition
== 0) ?
intScrollUnitIncrement
:
newPosition;
}
else
return
((currentPosition
/
intScrollUnitIncrement
)
+ 1) *
intScrollUnitIncrement
-
currentPosition;
}
public
boolean
getScrollableTracksViewportWidth()
{
return
false
;}
public
boolean
getScrollableTracksViewportHeight()
{
return
false
;}
/*
*
************************************************** *//*
* de:
METHODE zum Auslesen des Images aus dem 'Clipboard'
(Zwischenabelege).
* en: METHOD to read the image from
the clipboard. */
private
Image
getImageFromClipboard() {
/*
* de:
Erstellen der Referenz auf die Zwischenablage des
Betriebssystems.
* en: Create a reference to the
clipboard of the operating system. */
final
Clipboard
clipboard =
this
.getToolkit().getSystemClipboard();
/*
* de:
Zur Sicherheit prüfen ob auch die Referenz auf die Zwischablage
auch existiert.
* en: Verify for code-safety-reasons
that the reference to the clipboard really exists. */
if
(clipboard
==
null
)
return
null
;
/*
* de:
Auslesen des Inhalts aus der Zwischenablage.
* en: Read
the content of the clipboard. */
Transferable
clipData = clipboard.getContents(
null
);
/*
* de:
Prüfen ob die Zwischenablage irgendeine Art von Daten enthalten
hat.
* en: Verify if the clipboard already contained
any kind of data. */
if
(clipData
==
null
)
return
null
;
/*
* de:
Prüfen ob die Daten in der Zwischenablage von anderer Art als
'Image' sind.
* en: Verify if the data in the clipboard
is o anothzer kind than 'image'. */
if
(!
clipData.isDataFlavorSupported(DataFlavor.
imageFlavor
))
return
null
;
/*
* de:
* Zwischenablage enthält ein 'Image'. Das Image
auslesen – dazu ist die try-catch-Logik
* notwendig
um eventuell doch noch auftretende Fehler abzufangen.
* en:
* Clipboard contains an 'image'. Read out the image
-use a try-catch-logic as a prevention
* against
possibly still existing mismatches. */
try
{
/*
* de:
* Erstellen der Variable für den zurück
gelieferten Wert;
* Auslesen des Image aus der
Zwischenablage und zurück liefern.
* en:
* Create the variable for the value to be returned;
read the 'image' from the clipboard
* and return the
value. */
Image
imgToBeReturned = (Image)
clipData.getTransferData(DataFlavor.imageFlavor
);
return
imgToBeReturned;
}
catch
(Exception
Exc) {
/*
* de:
* Image konnte nicht aus der Zwischenablage ausgelesen
werden – 'null'-Wert zurück liefern.
* en:
* Image could not be read out of the clipboard; signal
this by returning 'null'-value. */
return
null
;
}
}/*
* de:
METHODE zum Einfügen des Images in das 'Clipboard'
(Zwischenabelege).
* en: METHOD to put the image to
the clipboard. */
protected
void
putImageToClipboard()
{
/*
* de:
Prüfen ob überhaupt ein Image in diesem Objekt vorhanden
ist.
* en: Verify if this object contains an image
anyway. */
if
(
pnl_Parent
==
null
)
return
;
if
(
pnl_Parent
.
imgFullResolution
==
null
)
return
;
/*
* de:
Erstellen der Referenz auf die Zwischenablage des
Betriebssystems.
* en: Create a reference to the
clipboard of the operating system. */
final
Clipboard
clipboard =
this
.getToolkit().getSystemClipboard();
/*
* de:
Zur Sicherheit prüfen ob auch die Referenz auf die Zwischablage
auch existiert.
* en: Verify for code-safety-reasons
that the reference to the clipboard really exists. */
if
(clipboard
==
null
)
return
;
/*
* de:
* Einfügen eines Images in die Zwischenablage ist
nicht als Standard in Java implementiert.
* Dafür
ist eine Variable einer individuellen Klasse (anschließend an
diese Methode implementiert)
* notwendig.
* en:
* Inserting an image into the clipboard is not a
standard implementation in Java.
* It needs a variable
of an individual class (implemented after this method).
*/
ImageSelection
imgSelection =
new
ImageSelection(
pnl_Parent
.
imgFullResolution
.getImage());
/*
* de:
Transferieren des in der individuellen Klasse 'verpackten' Image in
die Zwischenablage.
* en: Transfer the image –
'wrapped' in the individual class – to the clipboard.
*/
clipboard.setContents(imgSelection,
null
);
}/*
* de:
* INTERNE KLASSE mit dem ein 'Image' 'Transferable'
gemacht wird damit das 'Image'
* in die Zwischenablage
eingefügt werden kann.
* en:
* INTERNAL
CLASS to make an 'Image' 'Transferable so that the 'Image' can be put
to the clipboard. */
private
class
ImageSelection
implements
Transferable
{
/*
* de:
Variable für das zu transferierende 'Image'.
* en:
Variable for the 'image' to be transferred. */
private
Image
localImage
;
/*
* de:
'Constructor' zur Übernahme des zu transferierende
'Image'.
* en: 'Constructor' to take over the 'image'
to be transferred. */
public
ImageSelection(Image
parmImage) {
localImage
=
parmImage;
}
/*
* de:
Überschreiben der Methoden der Klasse 'Transferable'.
* en:
Overwrite the methods of class 'Transferable'. */
public
DataFlavor[]
getTransferDataFlavors() {
return
new
DataFlavor[]
{DataFlavor
.
imageFlavor
};
}
public
boolean
isDataFlavorSupported(DataFlavor
parmFlavor) {
return
DataFlavor
.
imageFlavor
.equals(parmFlavor);
}
public
Object
getTransferData(DataFlavor parmFlavor)
throws
UnsupportedFlavorException,
IOException {
if
(DataFlavor
.
imageFlavor
.equals(parmFlavor))
return
localImage
;
throw
new
UnsupportedFlavorException(parmFlavor)
;
}
}
}
}
Erstellen eines Objektes dieser Klasse
Zuerst muss eine
Variable dieser Klasse definiert werden - eine detaillierte
Beschreibung dazu finden Sie unter Muster-Code
für die Klassen eines Task-Frame > Definieren der Variablen
für die GUI-Elemente:/*
* Muster-GUI-Elemente;
* Diese sind
durch jene GUI-Elemente, die für diesen Task-Frame spezifisch
sind,
* zu ersetzen. */
.
. . . . . .
. . . . . . .
protected
JSBS_ImagePane
img_Sample_ImagePane
;
Ein fehlersicherer
Algorithmus ist, das Erstellen eines Objektes dieser Klasse innerhalb
einer eigenen Methode auszuführen.
Das 'Verwenden' des
Objektes dieser Klasse erfolgt durch den Aufruf der Methode –
damit ist sicher gestellt, dass die Variable nicht 'null' sein
kann.
Eine detaillierte Beschreibung dazu finden Sie unter
Muster-Code
für die Klassen eines Task-Frame > Adaptieren der
'Constructor'-Methoden für jedes GUI-Element.
Im
folgenden Beispiel ist nur der minimal notwendige Code gezeigt –
Erweiterungen für eine zusätzliche Funktionalität sind
in den folgenden Abschnitten dokumentiert. /* */
protected
JSBS_ImagePane
get_
img_Sample_ImagePane
()
{
/* Zuerst
Prüfen, ob die Variable bereits 'constructed' (initialisiert)
ist. */
if
(
img_Sample_ImagePane
==
null
)
{
/* Variable
noch nicht 'constructed'; Code für die Initialisierung folgt.
*/
try
{
img_Sample_ImagePane
=
new
JSBS_ImagePane();
img_Sample_ImagePane
.setName(
"
img_Sample_ImagePane
"
);
/*
* Damit
das Image in einer akzeptablen Größe angezeigt wird und
nicht zu sehr schrumpfen kann
* werden
Grenzen für die Größe festgelegt.
*/
img_Sample_ImagePane
.setPreferredSize(
new
Dimension(
400
,
400
));
img_Sample_ImagePane
.setMinimumSize(
new
Dimension(
300
,
300
));
img_Sample_ImagePane
.setMaximumSize(
new
Dimension(
1000
,
500
));
}
catch
(Throwable
Exc) {
/* Fehler
beim 'construct' ist sehr unwahrscheinlich und kann nur beim
'Starten'
* des
Tasks auftreten.
* Deswegen
werden Fehlermeldungen nur auf der Konsole ausgegeben.
*/
System.
out
.println(
"Error
while building
img_Sample_ImagePane
in
class
application_task
."
);
Exc.printStackTrace();
}
}
return
img_Sample_ImagePane
;
}
Zuordnen eines Objekts der Klasse 'JLabel' für die Anzeige der Image-Größe
Wenn notwendig kann
beim 'konstruieren' eines Objekt der Klasse JSBS_ImagePane
ein Objekt der Klasse
JLabel
als Parameter übergeben
werden.
In diesem JLabel-Objekt
wird die Größe des angezeigten Images als Text gesetzt..
. . . . .
img_Sample_ImagePane
=
new
JSBS_ImagePane(get_
lbl_ImageSize
());
.
. . . . .
Dieses JLabel-Objekt
kann ebenfalls auf der GUI angezeigt werden; anschließend sehen
Sie ein Beispiel:
Festlegen der Texte für das Kontext-Menu
Mit der Methode
setLanguageSpecificMenuTexts(...)
werden die Texte des
Kontext-Menu (das beim Drücken und Halten der rechten Maustaste
angezeigt wird) festgelegt..
. . . .
.
img_Sample_ImagePane
.setLanguageSpecificMenuTexts(
"Kopieren
(in die Zwischenablage)"
,
"Einfügen
(aus der Zwischenablage)"
);
.
. . . . .
Wenn Sie Ihre
Anwendung nach dem JavaScout
Fat-Client-Framework (JS-FCF) Vorgehensmodell
entwickeln, können Sie die Texte für verschiedene Sprachen
erfassen und innerhalb des Java-Codes einen symbolischen Namen
verwenden..
. . . .
.
img_Sample_ImagePane
.setLanguageSpecificMenuTexts(
frmCC
.
structJSBS_XML_DisplayStrings
.getSupplementaryText(
"
MenuItem_CopyToClipboard
"
),
frmCC
.
structJSBS_XML_DisplayStrings
.getSupplementaryText(
"
MenuItem_PasteFromClipboard
"
));
.
. . . . .
Wird in einem Parameter der Wert null übergeben dann wird der entsprechende Eintrag des Kontext-Menus nicht angezeigt.
Die Auswirkungen verschiedener Parameter-Kombinationen sehen Sie anschließend:
|
|
|
|
|
|
Weitere
Möglichkeiten zur Steuerung finden Sie im Abschnitt
Erklärungen
und Anwendungsbeispiele
.
Reagieren auf eine Änderung des angezeigten Images
Mit dem hier
beschriebenen Code kann ein Einfügen eines Images über die
'Paste'-Auswahlmöglichkeit des Kontext-Menus erkannt werden..
. . . .
.
img_Sample_ImagePane
.addPropertyChangeListener(
new
PropertyChangeListener()
{
public
void
propertyChange(PropertyChangeEvent
evt) {
/* Aufrufen
der Methode, die das Image weiter bearbeitet.
*/
application_task
__ActionHandler.process
ChangedImage
(
this
);
}
});
.
. . . . .
Der
Platzhalter
application_task
__ActionHandler.process
ChangedImage
(
this
)
ist
durch den Aufruf einer Methode zu ersetzen, in der die Verarbeitungen
entsprechend der Anforderungen codiert werden.
In dieser Methode
wird üblicherweise die Vorbereitung für das Speichern des
eingefügten Images auf der Datenbank ausgeführt.
Weiters
können darin auch Schaltflächen aktiviert werden.
Transferieren des Images in das / aus dem JSBS_ImagePane
Das Anzeigen
eines Images erfolgt
durch den Aufruf der
Methodeimg_Sample_ImagePane
.setImage(
Variable_containing_Image_as_Bytestream
,
String_With_Graphic_Format
)
Dabei
werden das Image in Form eines Bytestream (Array vom elementaren Typ
byte
[]
)
und das Grafik-Format (von der Klasse
String
)
übergeben.
Diese Methode ist besonders geeignet wenn wenn das
anzuzeigende Image aus einer Datei oder einer Datenbank (Attributstyp
BLOB / Binary Large OBject) ausgelesen wurde.Hinweis:
Es
erfolgt innerhalb dieser Klasse (
JSBS_ImagePane
)
keine Prüfung, ob das, als eigener Parameter übergebene,
Grafik-Format auch dem Aufbau des Bytestreams des Image
entspricht.
Beim Auslesen des Images (Methode
img_Sample_ImagePane
.getImageAsByteArray()
)
wird der Bytestream im gleichen Grafik-Format zurück gegeben wie
er mit dieser Methode übergeben wurde.
Ein
Beispiel für das Einlesen eines Images aus einer Datei finden
Sie im Abschnitt
Importieren
des Images von einer Datei
.
Ein
Beispiel für das Übertragen eines Images vom Attribut einer
Datenbank finden Sie im Abschnitt Schreiben
auf eine / Lesen von einer Datenbank
.
Alternativ kann zum
Anzeigen auch die
Methodeimg_Sample_ImagePane
.setImage(
Variable_containing_ImageIcon
)
verwendet
werden. Dabei wird das anzuzeigende Image als Parameter (von der
Klasse java.awt.ImageIcon)
übergeben.
Diese Methode ist geeignet, wenn innerhalb einer
Anwendung ein Image von einem GUI-Element auf ein anderes GUI-Element
kopiert werden soll.
Einschränkung:
Wenn
mit dieser Methode ein 'animiertes GIF' angezeigt wird, kann das
gesamte 'animierte GIF' nicht mehr komplett ausgelesen werden.
Das Auslesen eines Images erfolgt durch den alternativen Aufruf der Methoden:
Variable_of_Class_Image
=
img_Sample_ImagePane
.getImage()
Diese
Methoden transferiert das angezeigte Image auf eine Variable der
Klasse
java.awt.Image
.
Diese
Variable ist sinnvoll, wenn das Image innerhalb des
Anwendungsprogramms grafisch weiter bearbeitet werden
soll.Einschränkung:
Mit
dieser Methode kann ein 'animiertes GIF' nicht mehr komplett
ausgelesen werden – es wird nur die erste Grafik der Animation
zurück geliefert.
Variable_of_byte_array
=
img_Sample_ImagePane
.getImageAsByteArray()
Diese
Methoden transferiert das angezeigte Image auf eine Variable mit
einem Array des elementaren Typs
byte
[]
.
Diese
Methode ist sinnvoll, wenn das Image auf einer Datenbank
(Attributstyp BLOB / Binary Large OBject) gespeichert werden soll
oder auf eine sequentielle Datei geschrieben werden soll.
Wenn
das Image über die Methode
setImage(
Variable_containing_Image_as_Bytestream
,
String_With_Graphic_Format
)
angezeigt
wurde oder bereits einmal, dann as Grafik-Format wurde
Wurde
das Image über das Kontext-Menu 'Einfügen' oder über
die Methode setImage(
Variable_containing_ImageIcon
)
angezeigt,
dann wird der Bytestream des Imagest (Datenstruktur) in der Variable
Variable_of_byte_array
im
Grafik-Format 'jpg' erstellt.
Variable_of_byte_array
=
img_Sample_ImagePane
.getImageAsByteArray(
"
String_With_Graphic_Format
"
)
Diese
Abwandlung der Methode erlaubt durch die Übergabe eines
Parameters die Auswahl des Grafik-Formats für die Datenstruktur
(Wert) in der Variable
Variable_of_byte_array
.
Das
Erstellen eines Bytestream im gewünschten Grafik-Format erfolgt
aber nur, wenn das Image über das Kontext-Menu 'Einfügen'
oder die Methode
setImage(
Variable_containing_ImageIcon
)
angezeigt
wurde.
Wurde das Image bereits einmal als Bytestream ausgelesen,
dann ist das beim ersten Auslesen festgelegte Grafik-Format auch für
alle weiteren Aufrufe der Methode gültig.
Zum
Zeitpunkt des Erstellens dieser Dokumentation waren die
Grafik-Formate 'gif', 'jpg' (bzw. 'jpeg') und 'png' möglich.
String_Variable_With_GraphicsFormat
=
img_Sample_ImagePane
.getGraphicsFormat()
Diese
Methode liefert jenes Grafik-Format zurück in dem der
Bytestream des Images innerhalb dieser Klasse (
JSBS_ImagePane
)
vorliegt.
Wurde des Image über das Kontext-Menu 'Einfügen'
oder über die Methode setImage(
Variable_containing_ImageIcon
)
angezeigt
und noch nicht als Bytestream ausgelesen, dann liefert diese Methode
eine leere Zeichenkette zurück.
Ein
Beispiel für das Auslesen eines Images und Speichern aur einer
Datei finden Sie im Abschnitt
Exportieren
des Images auf eine Datei
.
Ein
Beispiel für das Übertragen eines Images auf das Attribut
einer Datenbank finden Sie im Abschnitt Schreiben
auf eine / Lesen von einer Datenbank
.
Importieren des Images von einer Datei
Im folgenden Muster-Code wird das Einlesen des Images von einer Datei und Anzeigen gezeigt.
Dabei wird
vorausgesetzt, dass eine Methode zum 'Konstruieren' eines
JSBS_ImagePane
vorhanden ist
(beschrieben in Abschnitt Erstellen
eines Objekts dieser Klasse
),
Die
-Statements für die Java-Bibliotheken mit den verwendeten
Klassen sind nicht aufgelistet – bei Verwednung eines
zeitgemäßen Editors (z.B. Eclipse)
können diese aber leicht ermittelt werden.
Es erfolgt keine
Prüfung, ob die eingelesene Datei eine Grafik enthält, die
in der (Java-)Klasse ImageIcon
angezeigt werden
kann.
Wird ein anderes Datei-Format ausgewählt und versucht,
dieses als Image anzuzeigen tritt kein Fehler auf – außer
dass nichts angezeigt wird.
Dabei sind die weiß unterlegten Teile des Muster-Codes nicht unbedingt notwendig – helfen aber bei der Führung des Benutzers.
/* */
protected
static void
importImageFile(
lclass_with_method_to_access_JSBS_ImagePane_object
parmTF)
{
/*
* Text
für die Title-Bar des Fensters für die Datei-Auswahl
festlegen. */
String
strTitle =
"Datei
mit der zu importierenden Grafik auswählen"
;
/*
* Fenster
für den File-Dialog erstellen; mit diesem kann später die
Datei gewählt werden. */
FileDialog
fd =
new
FileDialog(parmTF,
strTitle, FileDialog.
LOAD
);
/*
* Anfangswerte
für Verzeichnis- und Datei-Auswahl festlegen und Fenster
sichtbar machen.
*/
fd.setFile(
""
);
fd.setDirectory(
""
);
fd.setVisible(
true
);
/*
* Prüfen
ob überhaupt eine Datei ausgewählt wurde; bei 'Abbruch' im
File-Dialog auch diese Methode beenden. */
if
((fd.getDirectory()
==
null
)
|| (fd.getDirectory() ==
null
))
return
;
/*
* Auslesen
der Namen für die Verzeichnisstruktur und die Datei aus dem
File-Dialog. */
String
strDirectoryName = fd.getDirectory();
String
strFileName = fd.getFile();
/*
* Extrahieren
der Datei-Erweiterung; diese beschreibt auch das Format der Grafik in
der Datei. */
String
strFileType =
JSBS_FileAndDirectoryServices.getFileType(strFileName);
/*
* Öffnen
der Datei innerhalb einer try-catch-Logik um Fehler erkennen und
behandeln zu können. */
try
{
/*
* Die
Datei mit einem File-Objekt öffnen. */
File
file = File(strDirectoryName + strFileName);
/*
* Prüfen,
ob mit dem File-Dialog auch eine 'Datei' ausgewählt wurde und
nicht eine URL.
* Das
ist eine Vorkehrung, falls über den File-Dialog in Zukunft auch
URLs gewählt werden können. */
if
(file.isFile())
{
/*
* Objekt
der Klasse FileInputStream für die geöffnete Datei
erstellen.
* Daraus
kann später der Bytestream der Grafik ausgelesen werden.
*/
FileInputStream
fis =
new
FileInputStrream(file);
/*
* Leeren
Bytestream (Array) für die Anzahl der Bytes in der geöffneten
Datei konstruieren. */
byte
[]
localByteArray =
new
byte
[(
int
)
file.length()];
/*
* Den
leeren Bytestream (Array) mit dem Inhalt der geöffneten Datei
füllen. */
fis.read(localByteArray);
/*
* Anzeigen
des Image in einem Objekt der Klasse JSBS_ImagePane.
*/
parmTF.get_
img_Sample_ImagePane
().setImage(localByteArray,
strFileType);
}
}
catch
(Exception
Exc) {
/*
* Fehler
sollte nicht vorkommen weil die Datei über den File-Dialog
ausgewählt wurde und somit
* existieren
muss; Bei Bedarf hier die Fehlermeldung implementieren. */
}
}
Exportieren des Images auf eine Datei
Im folgenden Muster-Code wird das Speichern des Images auf einer Datei gezeigt.
Dabei wird
vorausgesetzt, dass eine Methode zum 'Konstruieren' eines
JSBS_ImagePane
vorhanden ist
(beschrieben in Abschnitt Erstellen
eines Objekts dieser Klasse
).
Dabei
sind die weiß unterlegten Teile des Muster-Codes nicht
unbedingt notwendig – helfen aber bei der Führung des
Benutzers.
Gelb
unterlegte Teile des Muster-Codes erfordern eine Fehler-Nachricht an
den Benutzers.
/* */
protected
static void
exportImage(
lclass_with_method_to_access_JSBS_ImagePane_object
parmTF)
{
/*
* Für
spätere Prüfungen den Grafik-Typ des angezeigten Images
ermitteln. */
String
strGraphicsFormat =
parmTF.get_
img_Sample_ImagePane
().getGraphicsFormat();
/*
* Text
für die Title-Bar des Fensters für die Datei-Auswahl
festlegen. */
String
strTitle =
"Datei
für die zu exportierende Grafik auswählen"
;
/*
* Fenster
für den File-Dialog erstellen; mit diesem kann später die
Datei gewählt werden. */
FileDialog
fd =
new
FileDialog(parmTF,
strTitle, FileDialog.
LOAD
);
/*
* Anfangswerte
für Verzeichnis- und Datei-Auswahl festlegen und Fenster
sichtbar machen. */
fd.setDirectory(
""
);
/*
* Wenn
im Anwendungsprogramm bereits ein Dateiname festgelegt ist dann
diesen Namen vorschlagen. */
if
(parmTF.get_
txt_Image_FileName
().getText().trim().length()
> 0)
{
fd.setFile(
parmTF.get_
txt_Image_FileName
().getText().trim()
);
}
else
{
/*
* Wenn
beim Image bereits noch kein Grafik-Format festgelegt ist dann alle
Formate auswählen lassen;
* sonst
als Datei-Typ nur das festgelegte Grafik-Format vorschlagen.
*/
if
(strGraphicsFormat.length()
< 1) fd.setFile(
""
);
else
fd.setFile(
"*."
+
strGraphicsFormat);
}
/*
* Fenster
sichtbar machen. */
fd.setVisible(
true
);
/*
* Prüfen
ob überhaupt eine Datei ausgewählt wurde; bei 'Abbruch' im
File-Dialog auch diese Methode beenden. */
if
((fd.getDirectory()
==
null
)
|| (fd.getDirectory() ==
null
))
return
;
/*
* Auslesen
der Namen für die Verzeichnisstruktur und die Datei aus dem
File-Dialog. */
String
strDirectoryName = fd.getDirectory();
String
strFileName = fd.getFile();
/*
* Extrahieren
der Datei-Erweiterung; diese beschreibt auch das Format der Grafik in
der Datei. */
String
strSelectedFileType =
JSBS_FileAndDirectoryServices.getFileType(strFileName);
/*
* Prüfen,
ob dem Image bereits ein Grafik-Format zugeordnet ist und weiter
prüfen,
* ob
der gewählte Datei-Typ nicht mehr dem vorgeschlagenen Datei-Typ
entspricht. */
if
((strGraphicsFormat.length()
> 0) && ! (strGraphicsFormat.equals(strSelectedFileType)))
{
/*
* Benutzer
hat eine andere Datei-Erweiterung gewählt als jene die bereits
beim Image festgelegt ist.
* Damit
wäre die Grafik-Datei für Andere Programme nicht mehr
lesbar.
* Für
'echte' Anwendungen hier einen Fehlerhinweis einsetzen !.
*/
return
;
}
/*
* Öffnen
der Datei innerhalb einer try-catch-Logik um Fehler erkennen und
behandeln zu können. */
try
{
/*
* Die
Datei mit einem File-Objekt öffnen. */
File
file = File(strDirectoryName + strFileName);
/*
* Prüfen,
ob mit dem File-Dialog auch eine 'Datei' ausgewählt wurde und
nicht eine URL.
* Das
ist eine Vorkehrung, falls über den File-Dialog in Zukunft auch
URLs gewählt werden können. */
if
(file.isFile())
{
/*
* Bytestream
(Array) erstellen und das Image auslesen.
* Dabei
wird (wenn erforderlich) das Image in das gewünschte
Grafik-Format konvertiert. */
byte
[]
localByteArray =
parmTF.get_
img_Sample_ImagePane
().getImageAsByteArray(strSelectedFileType);
/*
* Objekt
der Klasse FileOutputStream für die geöffnete Datei
erstellen.
* Anschließend
den Bytestream des Images dorthin übertragen und die Datei
wieder schließen. */
FileOutputStream
fos =
new
FileOutputStrream(file);
fos.write(localByteArray);
fos.close();
}
}
catch
(Exception
Exc) {
/*
* Mögliche
Fehler können durch einen Schreibschutz der gewählten Datei
oder Störungen des
* Betriebssystems
auftretem; für 'echte' Anwendungen hier einen Fehlerhinweis
einsetzen. */
}
}
Schreiben auf eine / Lesen von einer Datenbank
Das Anzeigen
eines Images erfolgt
durch den Aufruf der
Methodeimg_Sample_ImagePane
.setImage(
Variable_containing_Image_as_Bytestream
,
String_With_Graphic_Format
)
Dabei
werden das Image in Form eines Bytestream (Array vom elementaren Typ
byte
[]
)
und das Grafik-Format (von der Klasse
String
)
übergeben.
Diese Methode ist besonders geeignet wenn wenn das
anzuzeigende Image aus einer Datei oder einer Datenbank (Attributstyp
BLOB / Binary Large OBject) ausgelesen wurde.Hinweis:
Beim
Auslesen des Images (Methode
img_Sample_ImagePane
.getImageAsByteArray()
)
wird der Bytestream im gleichen Grafik-Format zurück gegeben.
Alternativ kann zum
Anzeigen auch die
Methodeimg_Sample_ImagePane
.setImage(
Variable_containing_ImageIcon
)
verwendet
werden. Dabei wird das anzuzeigende Image als Parameter (von der
Klasse java.awt.ImageIcon)
übergeben.
Diese Methode ist geeignet, wenn innerhalb einer
Anwendung ein Image von einem GUI-Element auf ein anderes GUI-Element
kopiert werden soll.
Einschränkung:
Wenn
mit dieser Methode ein 'animiertes GIF' angezeigt wird, kann das
gesamte 'animierte GIF' nicht mehr komplett ausgelesen werden.
Das Auslesen eines Images erfolgt durch den alternativen Aufruf der Methoden:
Variable_of_Class_Image
=
img_Sample_ImagePane
.getImage()
Diese
Methoden transferiert das angezeigte Image auf eine Variable der
Klasse
java.awt.Image
.
Diese
Variable ist sinnvoll, wenn das Image innerhalb des
Anwendungsprogramms grafisch weiter bearbeitet werden soll.
Variable_of_byte_array
=
img_Sample_ImagePane
.getImageAsByteArray()
Diese
Methoden transferiert das angezeigte Image auf eine Variable mit
einem Array des elementaren Typs
byte
[]
.
Diese
Variable ist sinnvoll, wenn das Image auf einer Datenbank
(Attributstyp BLOB / Binary Large OBject) gespeichert werden soll
oder auf eine sequentielle Datei geschrieben werden soll.
Ohne
weiteren Parameter wird der Wert (Datenstruktur) in der Variable
Variable_of_byte_array
im
Grafik-Format 'jpg' erstellt.
Variable_of_byte_array
=
img_Sample_ImagePane
.getImageAsByteArray(
"
String_With_Graphic_Format
"
)
Diese
Abwandlung der Methode erlaubt durch die Übergabe eines
Parameters die Auswahl des Grafik-Formats für die Datenstruktur
(Wert) in der Variable
Variable_of_byte_array
.
Zum
Zeitpunkt des Erstellens dieser Dokumentation waren die
Grafik-Formate 'gif', 'jpg' (bzw. 'jpeg') und 'png' möglich.
Die
Definition
des Typs für das Attribut der DB-Tabelle erfolgt als 'BLOB'
–
so
wie im folgenden Beispiel:
ALTER
TABLE
GraphicImage
ADD
COLUMN
GraphicImageBytestream
BLOB;
Innerhalb
der
Klasse
für den Zugriff auf die DB-Tabelle (DBA-Klasse) wird eine
Variable als
byte
[]
definiert
-
eine detaillierte Beschreibung dazu finden Sie unter
Muster-Code
für ein DBA (DataBase-Access Object) > Definieren der
Variablen dieser Klasse
:
/*
* Beschreibung
einer Variable die als BLOB (Binary Large OBject) gespeichert wird
... . */
public
byte
[]
VariableName_for_BLOB
;
Das
Lesen
von bzw. Schreiben auf das Attribut der Datenbank-Tabelle erfolgt
durch die Methoden
getBytes(...)
bzw.
setBytes(...)
.
Eine
detaillierte Beschreibung für das
Übertragen
des Wertes aus dem 'SQLResultSet' in die Variable des DBA-Objektes
(nach
dem Lesen von der Datenbank-Tabelle) finden Sie unter
Muster-Code
für ein DBA (DataBase-Access Object) > Werte aus dem
Result-Set in die Variablen übertragen
:
/* ---------------------
* METHODE zum Übertragen der Werte aus dem
'SQLResultSet' in die Variablen dieser Klasse.
* Das
'SQLResultSet' ist eine Klasse im packaga 'java.sql' das nach einem
SELECT
* die Werte der selektierten Datensätze
enthält. */
public
void
getValuesFromSQLResultSet(ResultSet
parmSQLResultSet)
. . . . . . .
. . . . . . ./* Spezifische
Werte für diese DBA-Klasse übertragen. */
try
{
.
. . . . . .
this
.
VariableName_for_BLOB
=
parmSQLResultSet.getBytes(
CONST_
AttributeName
);
.
. . . . . .
}
/* Wenn
ein Fehler aufgetreten ist diesen an die aufrufende Methode
zurückliefern. */
Eine
detaillierte Beschreibung für das
Übertragen
des Wertes aus der Variable des DBA-Objektes auf das
'PreparedStatement'
(als
Vorbereitung zum Schreiben auf die Datenbank-Tabelle) finden Sie
unter
Muster-Code
für ein DBA (DataBase-Access Object) > Werte aus den
Variablen in das Prepared Statement
übertragen
:
/* ---------------------
* METHODE zum Übertragen der Werte aus den
Variablen dieser Klasse in das 'PreparedStatement'.
* Das
'PreparedStatement' ist eine Klasse im packaga 'java.sql' für
ein UPDATE oder INSERT
* das SQL-Kommando mit den neuen
Werten, die auf die DB-Tabelle geschrieben werden sollen,
* enthält.
*/
public
void
setValuesToSQLStatement(PreparedStatement
parmSQLStatement)
. . . . . . .
. . . . . . ./* Spezifische
Werte für diese DBA-Klasse übertragen. */
try
{
.
. . . . . .
parmSQLStatement.setBytes(
11
,
this
.
VariableName_for_BLOB
);
.
. . . . . .
}
/* Wenn
ein Fehler aufgetreten ist diesen an die aufrufende Methode
zurückliefern. */
Dokument |
Inhalt |
Muster-Code für die Klassen eines Task-Frames > Muster-Code für die Klasse für das Frame (GUI) |
In diesem Muster
wird ein GUI-Element (dieser Klasse JSBS_ImagePane)
erstellt und innerhalb eines GridBagLayout
platziert. |