980 likes | 1.18k Views
8. Swing komponensek 1. Swing konstansok - SwingConstants 2. Címke – JLabel 3. A gombok őse – AbstractButton 4. Nyomógomb – JButton 5. Jelölőmező – JCheckBox 6. Rádiógomb – JRadioButton, csoportosítás 7. Kombinált lista – JComboBox 8. MVC modell, dokumentumkezelés
E N D
8. Swing komponensek 1. Swing konstansok - SwingConstants 2. Címke – JLabel 3. A gombok őse – AbstractButton 4. Nyomógomb – JButton 5. Jelölőmező – JCheckBox 6. Rádiógomb – JRadioButton, csoportosítás 7. Kombinált lista – JComboBox 8. MVC modell, dokumentumkezelés 9. A szövegek őse – JTextComponent II. Grafikus felhasználói interfész 10. Szövegmező – JTextField 11. Szövegterület – JTextArea 12. Lista – JList 13. Görgetősáv – JScrollBar 14. Menüsor – JMenuBar... 15. Ablak – JWindow 16. Dialógusablak – JDialog, kész dialógusok - JOptionPane 17. Időzítő – Timer
JComponent +--JLabel +--AbstractButton | +--JButton | +--JToggleButton | | +--JCheckBox | | +--JRadioButton | +--JMenuItem | | +--JCheckBoxMenuItem | | +--JRadioButtonMenuItem | | +--JMenu +--JMenuBar +--JComboBox +--JTextComponent | +--JTextField | +--JTextArea +--JList +--JScrollBar +--JScrollPane +--JPanel +--JColorChooser +--JOptionPane javax.swing Object +--Component | +--Container | | +--Panel | | | +--Applet | | | | +--JApplet | | +--Window | | | +--JWindow | | | +--Frame | | | | +--JFrame | | | +--Dialog | | | | +--JDialog | | +--JComponent | | | + ... +--ImageIcon +--Timer
Swing konstansok – SwingConstants interfész • Általános konstansokat deklarál • Mindegyik:static int … • Igazítások: TOP, BOTTOM, LEFT, RIGHT, CENTER, LEADING, TRAILING • Állás: VERTICAL, HORIZONTAL • Irány: NORTH, SOUTH, EAST, WEST Példa: JLabel lbInfo = new JLabel("Információs szöveg"); lbInfo.setHorizontalAlignment(SwingConstants.CENTER); lbInfo.setHorizontalAlignment(JLabel.CENTER); lbInfo.setHorizontalAlignment(lbInfo.CENTER);
Címke – JLabel • Információ (szöveg / ikon) kiírására használatos • Magas szintű esemény nem keletkezik rajta • Nem kerülhet billentyűzetfókuszba • Jellemzők • String text • Icon icon • int horizontalAlignmentint verticalAlignment • int horizontalTextPositionint verticalTextPosition
Példák: cp.add(new JLabel("Nincsen ikonja, alapértelmezett igazítás")); ImageIcon iiJobb = new ImageIcon("icons/jobb.jpg"); JLabel lb = new JLabel("Csak előre!",iiJobb,JLabel.CENTER); cp.add(lb); lb.setHorizontalTextPosition(JLabel.LEADING);
A gombok őse – AbstractButton • Gombszerű komponensek absztrakt őse: AbstractButton +--JButton +--JToggleButton | +--JCheckBox | +--JRadioButton +--JMenuItem • A gombok a ButtonGroup segítségével csoportba foglalhatók
A gombok őse – AbstractButton (folyt.) • Események • ActionEvent • Jellemzők • String text • Icon icon • int mnemonic • boolean selected • String actionCommand • Metódusok • void doClick()
Nyomógomb – JButton • Valamilyen akció, parancs elindítására használatos • Események (örökölt) • ActionEvent • Jellemzők(örökölt) • String text • Icon icon • int mnemonic • boolean selected • String actionCommand • Metódusok (örökölt) • void doClick()
Feladat – ButtonTest • Tegyünk a képernyőre egy keretet; a felső részén egy színes terület legyen, benne a "Válassz színt!" felirattal. A terület színe kezdetben legyen piros, a felirat mindig fehér alapon fekete. A keret alsó részére tegyünk négy gombot; három a terület színét állítsa a gomb felirata szerint, a negyedik gomb állítsa le a programot. Az ablakot ne is lehessen másképp becsukni.
:SzinvalasztFrame (ActionListener – btPiros, btFeher, btZold, btKilep) btPiros (ActionEvent) btFeher (ActionEvent) btZold (ActionEvent) btKilep (ActionEvent) pnSzin pnGombok lbSzoveg 1. megoldás: A keret a figyelő
Figyelő Mindegyik gomb figyelőláncára a keret van felfűzve ButtonTest1 :SzinvalasztFrame cp pnSzin:JPanel pnGombok:JPanel lbSzoveg :JLabel btPiros :JButton btFeher :JButton btZold :JButton btKilep :JButton ButtonTest1 figyelőláncai
... class SzinvalasztFrame extends JFrame implements ActionListener { Container cp = getContentPane(); JButton btPiros, btFeher, btZold, btKilep; JPanel pnSzin; JLabel lbSzoveg; public SzinvalasztFrame() { setDefaultCloseOperation(DO_NOTHING_ON_CLOSE); setTitle("Színválasztás"); cp.add(pnSzin = new JPanel(),BorderLayout.NORTH); pnSzin.setBackground(Color.RED); lbSzoveg = new JLabel(" Válassz színt! ",JLabel.CENTER); lbSzoveg.setBackground(Color.WHITE); lbSzoveg.setOpaque(true); lbSzoveg.setBorder(BorderFactory.createRaisedBevelBorder());
pnSzin.add(lbSzoveg); JPanel pnGombok = new JPanel(); pnGombok.add(btPiros = new JButton("Piros")); pnGombok.add(btFeher = new JButton("Fehér")); pnGombok.add(btZold = new JButton("Zöld")); pnGombok.add(btKilep = new JButton("Kilép")); cp.add(pnGombok,BorderLayout.SOUTH); btPiros.addActionListener(this); btFeher.addActionListener(this); btZold.addActionListener(this); btKilep.addActionListener(this); pack(); show(); }
public void actionPerformed(ActionEvent e) { if (e.getSource() == btPiros) pnSzin.setBackground(Color.RED); else if (e.getSource() == btFeher) pnSzin.setBackground(Color.WHITE); else if (e.getSource() == btZold) pnSzin.setBackground(Color.GREEN); else if (e.getSource() == btKilep) System.exit(0); } } public class ButtonTest1 { public static void main(String[] args) { new SzinvalasztFrame(); } }
pnSzin:SzinesPanel (ActionListener – btPiros, btFeher, btZold) :SzinvalasztFrame (ActionListener –btKilep) btPiros (ActionEvent) btFeher (ActionEvent) btZold (ActionEvent) btKilep (ActionEvent) pnGombok lbSzoveg 2. megoldás: A SzínesPanel a figyelő
Figyelő Három gomb figyelőláncára most a pnSzin van felfűzve ButtonTest2 :SzinvalasztFrame cp Figyelő pnSzin:SzinesPanel pnGombok:JPanel lbSzoveg :JLabel btPiros :JButton btFeher :JButton btZold :JButton btKilep :JButton ButtonTest2 figyelőláncai
... class SzinesPanel extends JPanel implements ActionListener { public void actionPerformed(ActionEvent e) { if (e.getActionCommand().equals("Piros")) setBackground(Color.RED); else if (e.getActionCommand().equals("Fehér")) setBackground(Color.WHITE); else if (e.getActionCommand().equals("Zöld")) setBackground(Color.GREEN); } }
class SzinvalasztFrame extends JFrame implements ActionListener { Container cp = getContentPane(); JButton btPiros, btFeher, btZold, btKilep; SzinesPanel pnSzin; JLabel lbSzoveg; public SzinvalasztFrame() { … cp.add(pnSzin = new SzinesPanel(),BorderLayout.NORTH); … btPiros.addActionListener(pnSzin); btFeher.addActionListener(pnSzin); btZold.addActionListener(pnSzin); btKilep.addActionListener(this); … }
public void actionPerformed(ActionEvent e) { System.exit(0); } } // SzinvalasztFrame public class ButtonTest2 { public static void main(String[] args) { new SzinvalasztFrame(); } }
Jelölőmező – JCheckBox • Kétállapotú gomb logikai igaz/hamis állapot jelölésére • Egymástól független jelölésekre szokás használni • Események (örökölt) • ActionEvent • Jellemzők(örökölt) • String text • Icon icon • int mnemonic • boolean selected • String actionCommand • Metódusok (örökölt) • void doClick()
Rádiógomb – JRadioButton, csoportosítás • Kétállapotú gomb logikai igaz/hamis állapot jelölésére • Egymástól függő jelölésekre szokás használni • Csoportosítani szokás (ButtonGroup segítségével) • Események (örökölt) • ActionEvent • Jellemzők(örökölt) • String text • Icon icon • int mnemonic • boolean selected • String actionCommand • Metódusok (örökölt) • void doClick()
Gombok csoportosítása – ButtonGroup osztály • Logikai csoportosítás • A csoport gombjai közül egyszerre egy jelölhető be • Csoport elemei: rádiógombok, AbstractButton utódok • A ButtonGroup objektum összefogja a gombokat, felügyeli azok ki-be kapcsolását • Nem komponens, nem keletkezik rajta esemény • Konstruktor, metódusok • ButtonGroup() • void add(AbstractButton b) • int getButtonCount()
:KeretezesFrame (ActionListener) rbVesett (ActionEvent) rbKiemelt (ActionEvent) rbSullyesztett (ActionEvent) pnValaszt bg: ButtonGroup • Feladat – RadioButtonTest • A keretben 3 jelölőmező látszik, mindhárom egy-egy szegélyfajtát jelöl. Vegyük körül a gombok paneljét a kiválasztott szegéllyel! Egyszerre persze csak egy szegélyt lehet választani.
class KeretezesFrame extends JFrame implements ActionListener { Container cp = getContentPane(); ButtonGroup bg = new ButtonGroup(); JRadioButton rbVesett = new JRadioButton("Vésett"); JRadioButton rbKiemelt = new JRadioButton("Kiemelt"); JRadioButton rbSullyesztett=new JRadioButton("Süllyesztett"); JPanel pnValaszt; public KeretezesFrame() { setDefaultCloseOperation(EXIT_ON_CLOSE); setTitle("Keretezés próba"); cp.setLayout(new FlowLayout()); pnValaszt = new JPanel();
bg.add(rbVesett); pnValaszt.add(rbVesett); rbVesett.addActionListener(this); bg.add(rbKiemelt); pnValaszt.add(rbKiemelt); rbKiemelt.addActionListener(this); bg.add(rbSullyesztett); pnValaszt.add(rbSullyesztett); rbSullyesztett.addActionListener(this); cp.add(pnValaszt); pack(); show(); } // konstruktor
public void actionPerformed(ActionEvent ev) { JRadioButton rb = (JRadioButton) ev.getSource(); javax.swing.border.Border border = null; if (rb.getText().equals("Vésett")) border = BorderFactory.createEtchedBorder(); else if (rb.getText().equals("Kiemelt")) border = BorderFactory.createRaisedBevelBorder(); else if (rb.getText().equals("Süllyesztett")) border = BorderFactory.createLoweredBevelBorder(); pnValaszt.setBorder(border); } // actionPerformed } // KeretezesFrame public class RadioButtonTest { … }
Kombinált lista – JComboBox • Szerkeszthető szövegmező és legördülő lista kombinációja • Események • ActionEvent • Jellemzők • boolean editable • int maximumRowCount • boolean popupVisible • Object selectedItemint selectedIndex • Konstruktorok • JComboBox() • JComboBox(Object[] items) • JComboBox(Vector items)
Példa: JComboBox cb = new JComboBox(); cp.add(cb); cb.addItem("Erika"); cb.addItem("Margó"); cb.addItem("Mari"); Kombinált lista – JComboBox (folyt.) • Metódusok • void addItem(Object anObject)void insertItemAt(Object anObject, int index) • void removeItem(Object anObject)void removeItemAt(int anIndex)void removeAllItems()
:SzinekFrame (ActionListener) cbSzinek (ActionEvent) • Feladat – ComboBoxTest • A keret felső részére tegyünk egy különböző színeket (fehéret, pirosat stb.) felkínáló kombinált listát! A keret háttérszíne mindig a kiválasztott szín legyen!
... class SzinekFrame extends JFrame implements ActionListener { Color[] colors = {Color.WHITE,Color.BLACK,…,Color.RED}; String[] colorStrings = {"fehér","fekete",…,"piros"}; Container cp = getContentPane(); JComboBox cbSzinek; public SzinekFrame() { setDefaultCloseOperation(EXIT_ON_CLOSE); setTitle("Szinek"); setBounds(300,100,200,200); cp.setLayout(new FlowLayout()); cp.add(cbSzinek = new JComboBox(colorStrings));
cbSzinek.addActionListener(this); show(); } // konstruktor public void actionPerformed(ActionEvent ev) { cp.setBackground(colors[cbSzinek.getSelectedIndex()]); } // actionPerformed } // SzinekFrame public class ComboBoxTest { public static void main (String args[]) { new SzinekFrame(); } }
JComponent View Megjelenítés Állapot kiolvasása Látható értékek változtatása Értesítés az állapotváltozásról Model Controller Felhasználói események Állapot- változtatás View factory (Windows/Motif/Metal) MVC modell
MVC modell összetevői • Model (modell): a komponens adatai, állapota • View (nézet): a komponens megjelenése a képernyőn (look and feel, skin) • Controller (vezérlő): a komponens viselkedése • Egy modellen több nézet osztozhat • Javában a nézet és a viselkedés csak részben válik el • Javában modell adatainak kiolvasása:komponens.getModel().getAdat()Például: ta.getDocument().getLength()
A szövegek őse – JTextComponent • Szövegkomponensek absztrakt őse: JTextComponent +--JTextField | +--JPasswordField +--JTextArea • Adatmodellje: Document • Esemény • DocumentEvent (adatmodellen)
A szövegek őse – JTextComponent (folyt.) • Jellemzők • Document doc • String text • Caret caretint caretPositionColor caretColor • boolean editable • int selectionStartint selectionEndColor selectionColorColor selectedTextColor
Szövegmező – JTextField • Beviteli mező • Események • ActionEvent • DocumentEvent (adatmodellen, örökölt) • Jellemzők • örökölt: doc, text, caret, caretPosition, caretColor, editable, selectionStart, selectionEnd, selectionColor, selectedTextColor • int columns • int horizontalAlignment
Szövegterület – JTextArea • Többsoros beviteli mező • Nincs görgetősávja; görgetés: JTextArea ta = new JTextArea(); cp.add(new JScrollPane(ta)); • Esemény • DocumentEvent (adatmodellen, örökölt) • Jellemzők • örökölt: doc, text, caret, caretPosition, caretColor, editable, selectionStart, selectionEnd, selectionColor, selectedTextColor
Szövegterület – JTextArea (folyt.) • Jellemzők (folyt.) • int columnsint rows • int tabSize • boolean lineWrap • boolean wrapStyleWord • Metódusok • void insert(String str, int pos) • void append(String str) • void replaceRange(String str, int start, int end)
Szövegterület – JTextArea (folyt.) • Metódusok (folyt.) • int getLineCount() • int getLineStartOffset(int line)int getLineEndOffset(int line) • int getLineOfOffset(int offset) • AbstractDocument osztály metódusai • String getText(int offset, int length) • int getLength()
Feladat – TextAreaTest • Szerkesszünk meg egy önéletrajzot! Az önéletrajz egy 6 soros, 30 oszlopnyi, szükség esetén görgethető szövegterületen van. A szövegterület felett áll az önéletrajz írójának neve, alatta pedig egy „Nyugtáz” gomb. Tegyünk a szövegterületre egy kezdőszöveget, és állítsuk a kurzort a szöveg végére! • Amikor elkezdjük szerkeszteni a szöveget, a szövegterület feletti név váltson dőlt betűsre. A „Nyugtáz” gomb lenyomására nyugtázzuk a szöveget; ekkor a név egyenesedjék ki. De mihelyt megváltozik a szöveg, a név megint dőlt betűvel íródjon ki. A nyugtázással a szövegterület ne veszítse el a fókuszt!
:OneletRajz (ActionListener, DocumentListener) lbNev taCV (DocumentEvent) btNyugtaz (ActionEvent) ... class Oneletrajz extends JPanel implements ActionListener, DocumentListener { JLabel lbNev; JTextArea taCV; JButton btNyugtaz; Font fntItalic = new Font("Dialog",Font.ITALIC+Font.BOLD,12); Font fntNormal = new Font("Dialog",Font.PLAIN+Font.BOLD,12);
public Oneletrajz(String nev) { setLayout(new BorderLayout()); add(lbNev = new JLabel(nev),"North"); lbNev.setFont(fntNormal); taCV = new JTextArea(6,30); taCV.setText("Önéletrajz\n\nNév: " + nev + "\n\n"); add(new JScrollPane(taCV)); add(btNyugtaz = new JButton("Nyugtáz"),"South"); taCV.getDocument().addDocumentListener(this); btNyugtaz.addActionListener(this); taCV.setCaretPosition(taCV.getText().length()); }
public void actionPerformed(ActionEvent ev) { lbNev.setFont(fntNormal); taCV.requestFocus(); } public void insertUpdate(DocumentEvent e) { lbNev.setFont(fntItalic); } public void removeUpdate(DocumentEvent e) { lbNev.setFont(fntItalic); } public void changedUpdate(DocumentEvent e) { } } // Oneletrajz
public class TextAreaTest extends JFrame { public TextAreaTest() { setDefaultCloseOperation(EXIT_ON_CLOSE); setTitle("Önéletrajz"); setLocation(300,200); getContentPane().add(new Oneletrajz("Dudás Mari")); pack(); show(); } public static void main (String args[]) { new TextAreaTest(); } // main } // TextAreaTest
Lista – JList • Választható szövegek listája • Nem gördül le, fix területen helyezkedik el • Egyszerre több eleme is kiválasztható • Adatmodellje: ListModel • Kiválasztásmodellje: ListSelectionModel • Esemény • ListSelectionEvent (kiválasztásmodellen) Példák az adatmodell kezelésére: JList lista=new JList(); lista.getModel().addElement("Hosszúhetény"); DefaultListModel model = new DefaultListModel(); JList lista=new JList(model); model.addElement("Hosszúhetény");
Lista – JList (folyt.) • Jellemzők • ListModel model (alapért.:DefaultListModel) • int selectionModeLehetséges értékei (ListSelectionModel):SINGLE_SELECTION,SINGLE_INTERVAL_SELECTION, MULTIPLE_INTERVAL_SELECTION • int selectedIndex • int visibleRowCount • int fixedCellWidthint fixedCellHeight
Lista – JList (folyt.) • Metódusok • void setListData(Object[] listData)void setListData(Vector listData) • void setSelectedValue( Object anObject, boolean shouldScroll) • Object getSelectedValue()Object[] getSelectedValues() • void setSelectedIndex(int index)int getSelectedIndex() • void setSelectedIndices(int[] indices)int[] getSelectedIndices()
Lista – JList (folyt.) • Metódusok (folyt.) • boolean isSelectedIndex(int index)boolean isSelectionEmpty() • void clearSelection() • int getFirstVisibleIndex()int getLastVisibleIndex() • DefaultListModel osztály • Vectorhoz hasonló Egyszerű bevitel – javax.swing.JOptionPane • static String showInputDialog( Component parentComp, Object message)
:KarbantartFrame (ActionListener,ListSelectionListener) lbInfo lstSzovegek (ListSelectionEvent) pnVezer btKilep (ActionEvent) btUj (ActionEvent) btTorles (ActionEvent) • Feladat – Szövegek karbantartása – ListTest • Készítsünk egy olyan alkalmazást, amellyel új szövegeket lehet felvinni, s ki lehet törölni a már meglévőket. Az új szöveget egy kis dialógus segítségével kérjük be. Írjuk ki a felső sorba, ha az első vagy az utolsó szöveg van kiválasztva!