230 likes | 399 Views
Föreläsning 15 (16). Introduktion till Swing. Historik (java.awt). JDK 1.0 – AWT (Abstract Window Toolkit) Paket för gränssnittsprogrammering Har en del nackdelar: Använder s.k. native code Stödjer endast komponenter gemensamma för alla OS Antar plattformens look and feel
E N D
Föreläsning 15 (16) Introduktion till Swing
Historik (java.awt) • JDK 1.0 – AWT (Abstract Window Toolkit) • Paket för gränssnittsprogrammering • Har en del nackdelar: • Använder s.k. native code • Stödjer endast komponenter gemensamma för alla OS • Antar plattformens look and feel • Awful Window Toolkit!? • Fortfarande nödvändig att använda
Historik (javax.swing) • JDK 1.2 – Swing helt skrivet i Java • Bygger vidare på AWT • Innehåller fler komponenter än AWT • Har en look and feel som är oberoende av plattformen • Komponenter i Swing börjar på 'J’ • Swing bör användas framför AWT
Komponenter (JComponent) • Används för att bygga upp ett GUI • I stort sett allt som syns på skärmen är komponenter som kan: • Presenteras, positioneras • Visa grafik, fånga händelser e.t.c • Några användbara metoder är: void setBackground(Color c) // Sätter bakgrundsfärgenvoid setForeground(Color c) // Sätter förgurndsfärg (text)void setFont(Font f) // Sätter font på t.ex textvoid setToolTipText(String text) // Sätter hjälptext (muspekaren ovanför)void setBounds(int x, int y, // Flyttar och ändrar storlek int width, int height) void setEnabled(boolean b) // Valbar eller inte ("gråa ut")boolean hasFocus() // Är komponenten vald?
Containers (Container) • Container är ett fönster eller en yta i vilken komponenter kan placeras • Används för att gruppera GUI-objekt • JFrame – applikationsfönster • JDialog – dialogfönster • JApplet – tilldelas yta av webbläsaren • JPanel – tom yta att "rita" på • JComponent är också en container
Containers (forts) • Komponenter läggs till en container genom metoden add() void add(Component comp) // Lägger till en komponent • Fler användbara metoder i klassen: int getHeight() // Hur bred?int getWidth() // Hur hög?Component getComponent(int n) // Det n:te komponentenvoid removeComponent(Component c) // Tar bort komponetenvoid setLayout(LayoutManager mgr) // Sätter layoutInsets getInsets() // För att kolla ytanvoid paint(Graphics g) // Rita i containernvoid setBackground(Color c) // Bakgrundsfärgenvoid setVisible(boolean b) // Visas eller inte?
LayoutManager • Positioneringen av komponenterna görs med en LayoutManager • Placerar dynamiskt ut komponenter • Enklast att använda är FlowLayout • placeras ut i den följd de läggs till // sätter Layout till FlowLayoutsetLayout(newFlowLayout()); • Möjlighet till absolut positionering // sätter Layout till ingen alls (null)setLayout(null);
Klasshierarki (AWT och Swing) java.lang javax.swing java.awt Component JComponent Object Container JDialog JFrame JPanel JApplet Applet Window Panel Dialog Frame JButton JLabel JTextField java.applet
Applikationsfönster (JFrame) • Är ett fönster som innehåller: • En titelrad • Min- och max-knappar • Stäng-knapp • En ram runt fönstret • Eventuellt en meny • En applikation med ett GUI måste alltid minst ha ett ramfönster
JFrame (skapa) • JFrame har bl.a dessa konstruktorer // Skapar en tom JFrame utan titelJFrame myJFrame1 = new JFrame(); // Skapar en JFrame med en text på titelradenJFrame myJFrame2 = new JFrame("HelloWorld"); • Några användbara metoder: Container getContentPane() // Här placerar vi komponentervoid setSize(int width, int height) // Storleken på fönstretvoid setBounds(int x, int y, int w, int h) // placeringvoid setTitle(String titel) // Texten på titelradenvoid setResizable(boolean resizable) // Fast storlek eller ejvoid setLayout(LayoutManager mgr) // Fönstrets layoutvoid setVisible(boolean b) // true = fönstret synsvoid setIconImage(Image image) // Fönstrets ikonvoid setDefaultCloseOperation(int) // Händelse vid stängning
JLabel(fast text) JLabel jlabel = new JLabel("En textsträng.");jlabel.setBounds(10, 5, 100, 20);String text = jlabel.getText(); jlabel = new JLabel(new ImageIcon("figur.gif");jlabel.setHorizontalTextPosition( SwingConstants.RIGHT);jlabel.setText("Text och bild.");jlabel.setForeground(Color.black); • Består endast av en fast text som inte kan väljas eller manipuleras • Kan inte generera några händelser • Används mest som information eller ledtext i en applikation
JButton(knapp) JButton knapp = new JButton("Knapp");knapp.setBounds(10, 5, 100, 35);knapp.setToolTipText("Tryck på mig!"); knapp = new JButton(new ImageIcon("figur.gif"))knapp.setBounds(10, 5, 100, 35);knapp.setRolloverIcon(new ImageIcon("figur2.gif knapp = new JButton("Avbryt");knapp.setBounds(10, 5, 100, 35);knapp.setText("Ok");knapp.setMnemonic('O'); // Aktivera med Alt+Oknapp.setEnabled(false);knapp.addActionListener(this); • En komponent man kan trycka på • Genererar i så fall ett ActionEvent
JTextField(textfält) JTextField txt = new JTextField("Textfält");txt.setBounds(10, 5, 150, 20); String text = txt.getText(); // Textfält txt = new JTextField();txt.setBounds(10, 5, 150, 20);txt.setText("123 abc ÅÄÖ")txt.setFont(new Font("Courier", Font.PLAIN, 16)String text2 = txt.getSelectedText(); // abc ); txt.setEditable(false);txt.selectAll();txt.addActionListener(this); • En rad där text kan skrivas in • Enter genererar ett ActionEvent
JTextArea(textruta) JTextArea area = new JTextArea();JScrollPane scroll = new JScrollPane(txt);scroll.setBounds(10, 5, 175, 60);txt.setText("En text som sträcker sig " + "utanför våran textarea"); txt.setLineWrap(true); // Radbrytning påtxt.setWrapStyleWord(true); // Bryt efter ordettxt.append("\nAppend() lägger till text" + "\nsist i rutan");txt.replaceRange("håller sig innanför", 12, 32); • Flera rader där text kan skrivas in • Måste lägga till scroll-lister
Händelsehantering • Program med ett GUI genererar händelser (t.ex. knapptryck) • Med händelsehantering avses att hantera dessa när de inträffar • Till en komponent registreras olika lyssnare som lyssnar på händelser • När händelsen inträffar skickas den till de registrerade händelselyssnare
Action-händelser • Gränssnittet ActionListener innehåller endast en metod • actionPerformed(ActionEvent ae)signalerar att en komponent klickats på • Av ActionEvent-objektet kan man få reda på vilken komponent det gäller JButton knapp = newJButton("Tryck på mig!"); if (ae.getSource() == klick) // Knappen klick har genererat händelsen (tryckts på)
Registrera En Lyssnare • För att registrera en Action-lyssnare till en knapp anropas följande metod JButton knapp = new JButton("Tryck på mig!");// Registrerar den egna klassen som en lyssnare på ActionEventknapp.addActionListener(this); • Därefter måste gränssnittet ActionListener implementeras public class MyFrame extends JFrame implements ActionListener { public void actionPerformed(ActionEvent ae) {if (ae.getSource() == knapp) // Knappen knapp har tryckts på } }
FlowLayout Före storleksändring Efter storleksändring • Placerar komponenterna från vänster till höger i containern • Börjar på en ny rad när den är fylld • Ändrar placering automatisk
GridLayout Före storleksändring Efter storleksändring • GridLayout ser till att alla komponenter har samma storlek • Placeras i ett rutnät som definieras när managern konstrueras
BorderLayout Före storleksändring Efter storleksändring • Delar upp ytan i fem areor: • north, south, east, west och center • När en komponent läggs till måste detta ske i någon av dessa areor
JPanel • En generell container-klass som används för att innehålla ett antal komponenter • Har ingen ram och används därför normalt inuti en annan container • Används väldigt ofta vid mer avancerad GUI JPanel westPanel = new JPanel(); // Default FlowLayoutwestPanel.setLayout(new BorderLayout()); // Får BorderLayoutJPanel southPanel = new JPanel(new GridLayout(1, 3));
JPanel (forts) • Börja med att skapa en Panel • Skapa komponenterna • Lägg till komponenterna i panelen • Lägg till panelen i fönstret // I konstruktornJPanel westPanel = new JPanel(new GridLayout(3, 1));westPanel.add(new JButton("Öka talet"));westPanel.add(new JButton("Nollställ talet"));westPanel.add(new JButton("Avsluta"));getContantpane.add("West", westPanel);
Lite Nytt I Swing • Kan använda HTML-kod i texten för vissa komponenter (t.ex JLabel) JLabel label = new JLabel();label.setText"<html><font size=10>hej!</font></html>"); • Lätt att skapa bildknappar ImageIcon knappIcon = new ImageIcon("image.gif");JButton knapp = new JButton("Bildknapp", knappIcon); • Kan lägga till Border runt komponent Border loweredbevel = BorderFactory.createLoweredBevelBorder();JPanel southPanel = new JPanel();southPanel.setBorder(loweredbevel);