AWT-komponendid on "tugevad": ei saa paigutada "puhast" swing-komponenti AWT-komponendi "ette".
Component (awt)
Container (awt)
Panel (awt)
Applet (applet)
JApplet (swing)
Window (awt)
Dialog (awt)
JDialog (swing)
Frame (awt)
JFrame (swing)
JWindow (swing)
Box (swing)
CellRendererPane (swing)
JComponent (swing)
AbstractButton (swing)
JButton (swing)
JMenuItem (swing)
JCheckBoxMenuItem (swing)
JMenu (swing)
JRadioButtonMenuItem (swing)
JToggleButton (swing)
JCheckBox (swing)
JRadioButton (swing)
JColorChooser (swing)
JComboBox (swing)
JFileChooser (swing)
JInternalFrame (swing)
JLabel (swing)
JLayeredPane (swing)
JDesktopPane (swing)
JList (swing)
JMenuBar (swing)
JOptionPane (swing)
JPanel (swing)
JPopupMenu (swing)
JProgressBar (swing)
JRootPane (swing)
JScrollBar (swing)
JScrollPane (swing)
JSeparator (swing)
JSlider (swing)
JSplitPane (swing)
JTabbedPane (swing)
JTable (swing)
JTextComponent (swing.text)
JEditorPane (swing)
JTextPane (swing)
JTextArea (swing)
JTextField (swing)
JPasswordField (swing)
JToolBar (swing)
JToolTip (swing)
JTree (swing)
JViewport (swing)
Box.Filler (swing) <- Component (awt)
ButtonGroup (swing) <- Object (lang)
Iga JFrame-objekt sisaldab rootPane
objekti
klassist JRootPane (konteinerit), mis katab kogu raami
nähtava
osa. Selles konteineris sisaldub veel vähemalt kaks objekti:
layeredPane sisaldab contentPane
(samuti
klassist JPanel) ning mittekohustusliku menüüriba menuBar
(klassist JMenuBar). glassPane ja layeredPane
katavad
kogu rootPane nähtava osa, contentPane on
äärte
ning menüüriba jagu väiksem.
Tavaliselt kasutataksegi seda "tagumist" kihti (numbriga -30000), mille annab getContentPane() nii, nagu AWT puhul konteinerit ennast (paigutushalduri määramine, komponentide lisamine jne.). contentPane vaikimisi paigutushalduriks on BorderLayout.
Kihte saab juurde lisada layeredPane
"konteinerisse":
Mida suurem number, seda "eespool" vastav kiht
on. layeredPane
ei oma vaikimisi paigutushaldurit (see on null) ning
paigutushalduri
seisukohalt on layeredPane üks tervik (kihte ei saa eraldi
juhtida). Kihtide vahetamiseks setLayer meetod (JLayeredPane).
Kõige "ees" on läbipaistev glassPane (rootPane esimene alluv). Vaikimisi on see nähtamatu ning sündmused "paistavad läbi" selle kihi (saab kasutada näit. "alati peal" olevate komponentide paigutamiseks).
Uued liideseelemendid (näit. JTree) lisavad ka uusi sündmusetüüpe.
AncestorListener liides lubab kuulata
komponendi
"eellastega" juhtunud sündmusi:
ancestorMoved (AncestorEvent e) - pöördutakse, kui allikat või mõnda tema eellast liigutatakse
ancestorRemoved (AncestorEvent e)
- pöördutakse, kui allikas või mõni tema
eellastest
muudetakse nähtamatuks
Kuna swing-komponendid on kõik konteinerid (awt Container alamklassid), siis on niisugune sündmusetüüp mugav.
Joonistamiseks on ette nähtud komponendid Canvas
(awt), Panel (s.h. Applet ja JApplet) ja JPanel,
aga saab kasutada ka teisi swing-komponente.
Graafiline kontekst annab:
Iga paint-meetodi poole
pöördumine
annab uue graafilise konteksti (kontekstis tehtud muutused ei
säili,
aga konteksti initsialiseerimisel võetakse informatsioon
vastavast
komponendist).
Koordinaatide alguspunkti saab nihutada translate meetodiga.
Näide. Paneeli keskele joonistatakse etteantud fonti (meetod votaFont() olgu defineeritud mujal) kasutades näidissõne.
class JFondiNaide extends JPanel {
public void paint (Graphics g) {
String s = "ABCDabcd1234,.;"; // naide
g.setFont (votaFont()); // font
//=============================================
// Arvutame teksti asukoha fondimeetrika alusel
//=============================================
FontMetrics fm = g.getFontMetrics();
int tekstikorgus = fm.getHeight();
int tekstilaius = fm.stringWidth (s);
int kastikorgus = getSize().height;
int kastilaius = getSize().width;
if ((kastilaius < tekstilaius) ||
(kastikorgus < tekstikorgus)) {
// throw new RuntimeException ("Ei mahu!");
}
int x = (kastilaius - tekstilaius) / 2;
int y = (kastikorgus - tekstikorgus) / 2 +
fm.getAscent(); // alusjoone saamiseks
g.setColor (Color.white);
g.fillRect (0, 0, kastilaius, kastikorgus);
g.setColor (Color.black);
g.drawString (s, x, y);
} // paint lopp
} // JFondiNaide lopp
Punkti uus värv saadakse nende kolme
värvi
bitiesitustest tehtega XOR (loogiline mitteekvivalents).
Object (lang)
Toolkit (awt)
Color (awt)
SystemColor (awt)
Font (awt)
FontMetrics (awt)
Cursor (awt)
GraphicsDevice (awt)
GraphicsEnvironment (awt)
Graphics (awt)
Graphics2D (awt)
DebugGraphics (swing)
Dimension2D (awt.geom)
Dimension (awt)
Point2D (awt.geom)
Point (awt)
Polygon (awt)
RectangularShape (awt.geom)
Rectangle2D (awt.geom)
Rectangle (awt)
PrintJob (awt)
MediaTracker (awt) <- Object (lang)
Image (awt)
ColorModel (awt.image)
IndexColorModel (awt.image)
PackedColorModel (awt.image)
DirectColorModel (awt.image)
FilteredImageSource (awt.image)
ImageFilter (awt.image)
CropImageFilter (awt.image)
ReplicateScaleFilter (awt.image)
AreaAveragingScaleFilter (awt.image)
RGBImageFilter (awt.image)
GrayFilter (swing)
ImageIcon (swing)
MemoryImageSource (awt.image)
PixelGrabber (awt.image)
Raster (awt.image)
WritableRaster (awt.image)
Realiseerime niisuguse fondivaliku dialoogi swing-komponentide
abil.
/*
* Fail FondiParameetrid.java
* author Jaanus Poial
* version 0.7
* @since JDK 1.2
*/
//======================================================
// Fondivaliku dialoog - swing
//======================================================
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import java.util.*;
public class FondiParameetrid extends Hashtable {
//===================================================
// FondiParameetrid on paisktabel (vt. java.util.*)
// Loomulikult vo~iks see olla ka midagi muud
//===================================================
String s = "ABCDabcd,.1234";
Boolean valmis = new Boolean (false);
// synkroniseerimiseks
JFrame raam;
FondiParameetrid () { // konstruktor
//================================================
// Paisktabeli algva"a"rtustamine
//================================================
put ("name", "Dialog");
put ("style", new Integer (Font.PLAIN));
put ("size", new Integer (14));
//================================================
// Va"lise raami loomine ja juhtimine
//================================================
raam = new JFrame();
raam.setSize (350, 300);
raam.setTitle ("Vali font");
raam.addWindowListener (new WindowAdapter() {
public void windowClosing (WindowEvent e) {
synchronized (valmis) {
valmis.notifyAll();
}
}
});
//================================================
// Tegeliku liidese ehitamine on eraldi meetodina
//================================================
looDialoog (raam.getContentPane());
raam.setVisible (true);
try {
synchronized (valmis) {
valmis.wait(); // ootame dialoogi lo'ppu
}
} catch (InterruptedException e) {}
raam.setVisible (false); // eemaldame akna
} // konstruktori lopp
//===================================================
// Kasutame Graphics-objekti saamiseks u"lekatmist
//===================================================
class JFondiNaide extends JPanel {
public void paint (Graphics g) {
g.setFont (votaFont()); // font
//=============================================
// Arvutame teksti asukoha fondimeetrika alusel
//=============================================
FontMetrics fm = g.getFontMetrics();
int tekstikorgus = fm.getHeight();
int tekstilaius = fm.stringWidth (s);
int kastikorgus = getSize().height;
int kastilaius = getSize().width;
if ((kastilaius < tekstilaius) ||
(kastikorgus < tekstikorgus)) {
// throw new RuntimeException ("Ei mahu!");
}
int x = (kastilaius - tekstilaius) / 2;
int y = (kastikorgus - tekstikorgus) / 2 +
fm.getAscent(); // alusjoone saamiseks
g.setColor (Color.white);
g.fillRect (0, 0, kastilaius, kastikorgus);
g.setColor (Color.black);
g.drawString (s, x, y);
} // paint lopp
} // JFondiNaide lopp
//===================================================
// Dialoogi loomine etteantud konteinerisse
//===================================================
void looDialoog (Container kest) {
//================================================
// Aknaelemendid
//================================================
JPanel valikutePaneel = new JPanel();
JPanel nimePaneel = new JPanel();
JPanel ryhmaPaneel = new JPanel();
JFondiNaide fondiNaide = new JFondiNaide();
JLabel nimeSilt = new JLabel ("Nimi");
String [] fondid = GraphicsEnvironment.
getLocalGraphicsEnvironment().
getAvailableFontFamilyNames();
JList nimed = new JList (fondid);
JScrollPane nimePaan = new JScrollPane (nimed);
JLabel tekstiSilt = new JLabel ("Tekst");
JTextField tekstiVali = new JTextField (s, 14);
JLabel suuruseSilt = new JLabel ("Suurus");
String [] psuurused = { "6", "8", "10", "12",
"14","16","18","20","24","30","36","40" };
JComboBox suurused = new JComboBox (psuurused);
JLabel stiiliSilt = new JLabel ("Stiil");
JCheckBox rasvane = new JCheckBox ("Paks kiri");
JCheckBox kaldkiri = new JCheckBox ("Kaldkiri");
JButton okNupp = new JButton ("Valmis");
//================================================
// Ka"itumine
//================================================
nimed.addListSelectionListener
(new ListSelectionListener() {
public void valueChanged
(ListSelectionEvent e) {
String s = (String)((JList)e.getSource()).
getSelectedValue();
put ("name", s);
JFondiNaide n = (JFondiNaide)
((Container)((JPanel)((JPanel)
((JScrollPane)((JViewport)((JList)e.
getSource()).getParent()).getParent()).
getParent()).getParent()).getParent()).
getComponent (0);
n.repaint();
}
} );
tekstiVali.addActionListener
(new ActionListener() {
public void actionPerformed (ActionEvent e) {
s = ((JTextField)e.getSource()).getText();
JFondiNaide n = (JFondiNaide)
((Container)((JPanel)((JPanel)
((JTextField)e.getSource()).
getParent()).getParent()).getParent()).
getComponent (0);
n.repaint();
}
} );
suurused.addItemListener (new ItemListener() {
public void itemStateChanged (ItemEvent e) {
int suurus = Integer.parseInt ((String)
((JComboBox)e.getSource()).
getSelectedItem());
put ("size", new Integer (suurus));
JFondiNaide n = (JFondiNaide)
((Container)((JPanel)((JPanel)
((JComboBox)e.getSource()).
getParent()).getParent()).getParent()).
getComponent (0);
n.repaint();
}
} );
rasvane.addItemListener (new ItemListener() {
public void itemStateChanged (ItemEvent e) {
int stiil =
((Integer)(get ("style"))).intValue();
boolean olek = ((JCheckBox)e.getSource()).
isSelected();
if (olek)
stiil = stiil + Font.BOLD;
else stiil = stiil - Font.BOLD;
put ("style", new Integer (stiil));
JFondiNaide n = (JFondiNaide)
((Container)((JPanel)((JPanel)
((JCheckBox)e.getSource()).getParent()).
getParent()).getParent()).
getComponent (0);
n.repaint();
}
} );
kaldkiri.addItemListener (new ItemListener() {
public void itemStateChanged (ItemEvent e) {
int stiil =
((Integer)(get ("style"))).intValue();
boolean olek = ((JCheckBox)e.getSource()).
isSelected();
if (olek)
stiil = stiil + Font.ITALIC;
else stiil = stiil - Font.ITALIC;
put ("style", new Integer (stiil));
JFondiNaide n = (JFondiNaide)
((Container)((JPanel)((JPanel)
((JCheckBox)e.getSource()).
getParent()).getParent()).getParent()).
getComponent (0);
n.repaint();
}
} );
okNupp.addActionListener (new ActionListener() {Selle näite puhul saaks paljusid asju teha teisiti (lihtsamalt), aga on tahetud näidata erinevaid aspekte, mis liideste realiseerimisel ette võivad tulla.
public void actionPerformed (ActionEvent e) {
synchronized (valmis) {
valmis.notifyAll();
}
}
} );
//================================================
// Va"ljana"gemine
//================================================
kest.setLayout (new BoxLayout
(kest, BoxLayout.Y_AXIS));
kest.add (fondiNaide);
kest.add (valikutePaneel);
nimed.setVisibleRowCount (7);
nimePaneel.setLayout (new BoxLayout
(nimePaneel, BoxLayout.Y_AXIS));
nimePaneel.add (nimeSilt);
nimePaneel.add (nimePaan);
ryhmaPaneel.setLayout (new BoxLayout
(ryhmaPaneel, BoxLayout.Y_AXIS));
ryhmaPaneel.add (tekstiSilt);
ryhmaPaneel.add (tekstiVali);
ryhmaPaneel.add (suuruseSilt);
ryhmaPaneel.add (suurused);
ryhmaPaneel.add (stiiliSilt);
ryhmaPaneel.add (rasvane);
ryhmaPaneel.add (kaldkiri);
ryhmaPaneel.add (okNupp);
valikutePaneel.setLayout (new GridLayout (1,2));
valikutePaneel.add (nimePaneel);
valikutePaneel.add (ryhmaPaneel);
nimed.setSelectedValue (get ("name"), true);
suurused.setSelectedItem
(get ("size").toString());
} // looDialoog lopp
//===================================================
// Po~hiprogramm -- silumiskest
//===================================================
public static void main (String[] parameetrid) {
FondiParameetrid fp = new FondiParameetrid();
Font f = fp.votaFont();
System.out.println ("Valiti kiri: " + f);
System.exit (0);
} // main lopp
//===================================================
// Fondi loomine parameetritest
//===================================================
public Font votaFont() {
return new Font ((String)get ("name"),
((Integer)(get ("style"))).intValue(),
((Integer)(get ("size"))).intValue());
} // votaFont lopp
} // FondiParameetrid lopp