{"id":334,"date":"2011-11-03T11:29:23","date_gmt":"2011-11-03T09:29:23","guid":{"rendered":"http:\/\/www.kristiansborg.dk\/bibliotek\/?page_id=334"},"modified":"2011-11-07T08:39:57","modified_gmt":"2011-11-07T06:39:57","slug":"kapitel-1-grundlaeggende-swing","status":"publish","type":"page","link":"https:\/\/www.kristiansborg.dk\/bibliotek\/b%c3%b8ger\/avanceret-java-programmering\/kapitel-1-grundlaeggende-swing\/","title":{"rendered":"Kapitel 1 Grundl\u00e6ggende Swing"},"content":{"rendered":"<h1>Kapitel 1 : Generelt om Swing<\/h1>\n<p>&nbsp;<\/p>\n<p>Swing er oprindeligt en del af Java Foundation Classes (JFC), som Sun udviklede som en tilf\u00f8jelse til Java-standarden, svarende til det Standard Template Library (STL), der kendes fra C++. Swing er den grafiske den af JFC, som udvider Abstract Window Toolkit (AWT), der altid har v\u00e6ret en del af Java-standarden.<\/p>\n<p>&nbsp;<\/p>\n<p>Som n\u00e6vnt er JFC \u2013 og dermed Swing \u2013 oprindeligt t\u00e6nkt som en tilf\u00f8jelse til Java-standarden, og det er derfor muligt at downloade JFC-klasserne som en separat udvidelse til Java Development Kit 1.1. Hvis man opgraderer sin Internet-browsers Java Virtual Machine med Java Activator, installeres underst\u00f8ttelse af JFC automatisk. Bruger man Java Development Kit version 1.2, er Swing en integreret del af API\u2019et. Klasserne h\u00f8rende til Swing ligger i pakker, der starter med java.awt.swing.<\/p>\n<div style=\"border: 1px solid red; color: red;\"><strong>Du l\u00e6ser en gammel bog<\/strong><\/p>\n<p>Den bog, du l\u00e6ser her, er fra 1998, og mange ting kan have \u00e6ndret sig siden da.<br \/>\nVi h\u00e5ber, at du stadig kan finde relevant information i den.<br \/>\nHvis du vil l\u00e6se aktuelle oplysninger om de avancerede dele af Java, anbefaler vi<br \/>\nbogen <a href=\"http:\/\/clk.tradedoubler.com\/click?p(197229)a(2029446)g(19172914)url(http:\/\/www.adlibris.com\/dk\/product.aspx?isbn=0132354799)\" target=\"_blank\">Core Java &#8211; Advanced Features<\/a><img decoding=\"async\" src=\"http:\/\/impdk.tradedoubler.com\/imp?type(inv)g(19172914)a(2029446)\" alt=\"\" \/><\/div>\n<h1>Swing kontra AWT<\/h1>\n<p>&nbsp;<\/p>\n<p>Der er store forskelle p\u00e5 Swing og AWT. AWT b\u00e6rer pr\u00e6g af at v\u00e6re fra f\u00f8rste version af Java \u2013 sproget har udviklet sig meget siden, mens den st\u00f8rste opgradering i AWT har v\u00e6ret skift af event-model fra version 1.0 til 1.1. Derudover er AWT\u2019s udseende \u2013 look and feel \u2013 specielt udviklet til Java med det form\u00e5l at v\u00e6re platformsuafh\u00e6ngigt. Det betyder b\u00e5de, at programmer skrevet i Java ser v\u00e6sentligt anderledes ud, end det brugere kender fra programmer, der er skrevet direkte til det p\u00e5g\u00e6ldende operativsystem, men ogs\u00e5 at man har v\u00e6ret n\u00f8dt til at lave en brugergr\u00e6nseflade, der nemt kunne implementeres p\u00e5 de fleste platforme. Derfor har AWT manglet mange af de avancerede komponenter, som for eksempel Win32-programm\u00f8rer, har v\u00e6nnet sig til.<\/p>\n<p>&nbsp;<\/p>\n<p>Swing er ogs\u00e5 platformsuafh\u00e6ngig, men det er muligt at designe brugergr\u00e6nseflader, der har samme udseende, som et bestemt operativsystem. Hvilke operativsystem, brugergr\u00e6nsen skal tilpasse sig, kan bestemmes dynamisk, og man kan s\u00e5ledes ved programstart lave en kontrol af, hvilket operativsystem programmet afvikles under, og s\u00e5 automatisk f\u00e5 brugergr\u00e6nsefladen tilpasset hertil.<\/p>\n<p>&nbsp;<\/p>\n<h1>Vinduer<\/h1>\n<p>&nbsp;<\/p>\n<p>I AWT bruger man klassen java.awt.Frame til at lave et vindue. Hvis man vil bruge Swing, bruger man i stedet java.awt.swing.JFrame. JFrame adskiller sig fra Frame ved at have underst\u00f8ttelse for en Swing-menulinie og ved at v\u00e6re organiseret ved hj\u00e6lp af et <em>content pane<\/em>. Det har indflydelse p\u00e5, hvordan man h\u00e5ndterer elementer i vinduet. Bruger man en almindelig AWT Frame, kan man tilf\u00f8je en knap ved at skrive<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>frame.add(knap);<\/p>\n<p>&nbsp;<\/p>\n<p>mens man i Swing skal skrive<\/p>\n<p>&nbsp;<\/p>\n<p>frame.getContentPane().add(knap);<\/p>\n<p>&nbsp;<\/p>\n<p>Det samme g\u00e6lder andre handlinger, som for eksempel valg af layout manager og fjernelse af elementer. getContentPane vil altid returnere en v\u00e6rdi, der ikke er null. Hvis man fors\u00f8ger at s\u00e6tte et vindues content pane\u00a0til at v\u00e6re null, vil man f\u00e5 en exception.<\/p>\n<p>&nbsp;<\/p>\n<p>Hvis andet ikke er angivet, vil et vindues content pane have border layout som layout manager.<\/p>\n<p>&nbsp;<\/p>\n<p>Ovenst\u00e5ende g\u00e6lder ogs\u00e5 for den anden Java-klasse, der h\u00e5ndterer vinduer \u2013 Dialog. I Swing-terminologi hedder den JDialog. JDialog skal bruges til at lave brugerdefinerede dialogbokse. Man kan ogs\u00e5 v\u00e6lge at bruge en af de, der er defineret i JOptionPane. JOptionPane vil blive beskrevet i detaljer senere i kapitlet.<\/p>\n<p>&nbsp;<\/p>\n<p>public class JFrame\u00a0extends Frame implements WindowConstants, Accesible<\/p>\n<p>{<\/p>\n<p>&nbsp;<\/p>\n<p>public java.awt.Component getComponentAt (int, int);<\/p>\n<p>public java.awt.Component getComponentAt (java.awt.Point);<\/p>\n<p>public synchronized java.awt.dnd.DropTarget getDropTarget ();<\/p>\n<p>public synchronized void setDropTarget (java.awt.dnd.DropTarget);<\/p>\n<p>public void setSize (int, int);<\/p>\n<p>public void setSize (java.awt.Dimension);<\/p>\n<p>public void show ();<\/p>\n<p>public void show (boolean);<\/p>\n<p>public java.awt.Container getContentPane ();<\/p>\n<p>public int getDefaultCloseOperation ();<\/p>\n<p>public void setDefaultCloseOperation (int);<\/p>\n<p>}<\/p>\n<p>&nbsp;<\/p>\n<p>public class JDialog\u00a0extends Dialog implements WindowConstants, Accessible<\/p>\n<p>{<\/p>\n<p>public JDialog();<\/p>\n<p>public JDialog(java.awt.Frame);<\/p>\n<p>public JDialog(java.awt.Frame, java.lang.String);<\/p>\n<p>public JDialog(java.awt.Frame, java.lang.String, boolean);<\/p>\n<p>public JDialog(java.awt.Frame, boolean);<\/p>\n<p>&nbsp;<\/p>\n<p>public java.awt.Component getComponentAt (int, int);<\/p>\n<p>public java.awt.Component getComponentAt (java.awt.Point);<\/p>\n<p>public synchronized java.awt.dnd.DropTarget getDropTarget ();<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>public synchronized void setDropTarget (java.awt.dnd.DropTarget);<\/p>\n<p>public void setSize (int, int);<\/p>\n<p>public void setSize (java.awt.Dimension);<\/p>\n<p>public void show ();<\/p>\n<p>public void show (boolean);<\/p>\n<p>public java.awt.Container getContentPane ();<\/p>\n<p>public int getDefaultCloseOperation ();<\/p>\n<p>public void setDefaultCloseOperation (int);<\/p>\n<p>}<\/p>\n<p>&nbsp;<\/p>\n<p>Som det ses af ovenst\u00e5ende specifikation er en del af metoderne i de to vinduesklasser nedarvet fra henholdsvis java.awt.Frame og java.awt.Dialog. I det omfang deres semantik ikke afviger v\u00e6sentligt fra superklassernes, vil de ikke blive beskrevet her. Det skal dog n\u00e6vnes, at alle de metoder, der bruges til at tilf\u00f8je og redigere elementer i vinduet i stedet skal kaldes p\u00e5 vinduets content pane. Bliver de kaldt p\u00e5 selve vinduet, resulterer kaldet i en &lt;&lt;kode&gt;&gt; Error &lt;&lt;\/kode&gt;&gt;, hvis rootPaneChecking\u00a0er sat til true.<\/p>\n<p>&nbsp;<\/p>\n<p>Metoderne setDefaultCloseOperation\u00a0og getDefaultCloseOperation\u00a0bruges til henholdsvis at s\u00e6tte og l\u00e6se, hvilken handling, der skal udf\u00f8res, n\u00e5r brugeren v\u00e6lger at lukke vinduet. I Windows 95 sker dette enten ved at klikke p\u00e5 krydset i \u00f8verste h\u00f8jre hj\u00f8rne eller ved at v\u00e6lge Luk fra systemmenuen. Tre forskellige handlinger kan udf\u00f8res, og hver af disse har tilknyttet en konstant int-v\u00e6rdi, der definerer den. V\u00e6rdierne og deres tilknyttede handlinger er:<\/p>\n<p>&nbsp;<\/p>\n<ul>\n<li>DO_NOTHING_ON_CLOSE<br \/>\nUdf\u00f8rer ingen handlinger, n\u00e5r vinduet lukkes. Det er op til programmet selv at h\u00e5ndtere handlingen ved hj\u00e6lp af en WindowListener.<\/li>\n<li>HIDE_ON_CLOSE<br \/>\nSkjuler automatisk vinduet, n\u00e5r brugeren v\u00e6lger at lukke det. Alle tilknyttede WindowListener-objekter kaldes, inden vinduet skjules.<\/li>\n<li>DISPOSE_ON_CLOSE<br \/>\nSkjuler og fjerner automatisk vinduet, n\u00e5r brugern v\u00e6lger at lukke det. Inden da udf\u00f8res alle tilknyttede WindowListener-objekter.<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<p>Angives andet ikke, bliver defaultCloseOperation sat til HIDE_ON_CLOSE<\/p>\n<p><script type=\"text\/javascript\">\/\/ <![CDATA[\nvar uri = 'http:\/\/impdk.tradedoubler.com\/imp?type(js)g(19172330)a(2029446)' + new String (Math.random()).substring (2, 11);\ndocument.write('<sc'+'ript type=\"text\/javascript\" src=\"'+uri+'\" charset=\"\"><\/sc'+'ript>');\n\/\/ ]]><\/script><\/p>\n<p>&nbsp;<\/p>\n<h1>Standarddialogbokse<\/h1>\n<p>&nbsp;<\/p>\n<p>Ved hj\u00e6lp af JDialog og JFrame-klasserne er det muligt at designe vinduer og dialogbokse pr\u00e6cis som man vil have dem. Ofte har man imidlertid bare brug for at give brugeren en besked, eller stille vedkommende et simpelt sp\u00f8rgsm\u00e5l. Til disse form\u00e5l er det overdrevet at skulle designe en dialogboks fra bunden \u2013 til dette form\u00e5l har Swing en r\u00e6kke standarddialogbokse, der er nemme at anvende.<\/p>\n<p>&nbsp;<\/p>\n<p>Til dette form\u00e5l bruges klassen JoptionPane, der har f\u00f8lgende specifikation:<\/p>\n<p>public class JOptionPane\u00a0extends Jcomponent<\/p>\n<p>{<\/p>\n<p>public JOptionPane();<\/p>\n<p>&nbsp;<\/p>\n<p>public JOptionPane(java.lang.Object);<\/p>\n<p>public JOptionPane(java.lang.Object, int);<\/p>\n<p>public JOptionPane(java.lang.Object, int, int);<\/p>\n<p>public JOptionPane(java.lang.Object, int, int, java.awt.swing.Icon);<\/p>\n<p>public JOptionPane(java.lang.Object, int, int, java.awt.swing.Icon, Ljava.lang.Object[]);<\/p>\n<p>public JOptionPane(java.lang.Object, int, int, java.awt.swing.Icon, java.lang.Object[], java.lang.Object);<\/p>\n<p>&nbsp;<\/p>\n<p>public static int showConfirmDialog (java.awt.Component, java.lang.Object);<\/p>\n<p>public static int showConfirmDialog (java.awt.Component, java.lang.Object,\u00a0\u00a0 java.lang.String, int);<\/p>\n<p>public static int showConfirmDialog (java.awt.Component, java.lang.Object, java.lang.String, int, int);<\/p>\n<p>public static int showConfirmDialog (java.awt.Component, java.lang.Object, java.lang.String, int, int, java.awt.swing.Icon);<\/p>\n<p>public static java.lang.String showInputDialog (java.awt.Component, java.lang.Object);<\/p>\n<p>public static java.lang.String showInputDialog (java.awt.Component, java.lang.Object, java.lang.String, int);<\/p>\n<p>public static java.lang.Object showInputDialog (java.awt.Component, java.lang.Object, java.lang.String, int, java.awt.swing.Icon,\u00a0\u00a0 java.lang.Object[], java.lang.Object);<\/p>\n<p>public static java.lang.String showInputDialog (java.lang.Object);<\/p>\n<p>public static int showInternalConfirmDialog (java.awt.Component, java.lang.Object);<\/p>\n<p>public static int showInternalConfirmDialog (java.awt.Component,\u00a0 java.lang.Object, java.lang.String, int);<\/p>\n<p>public static int showInternalConfirmDialog (java.awt.Component, java.lang.Object, java.lang.String, int, int);<\/p>\n<p>public static int showInternalConfirmDialog (java.awt.Component, java.lang.Object, java.lang.String, int, int, java.awt.swing.Icon);<\/p>\n<p>public static java.lang.String showInternalInputDialog (java.awt.Component, java.lang.Object);<\/p>\n<p>public static java.lang.String showInternalInputDialog (java.awt.Component, java.lang.Object, java.lang.String, int);<\/p>\n<p>public static java.lang.Object showInternalInputDialog (java.awt.Component, java.lang.Object, java.lang.String, int, java.awt.swing.Icon,\u00a0\u00a0 java.lang.Object[], java.lang.Object);<\/p>\n<p>public static void showInternalMessageDialog (java.awt.Component, java.lang.Object);<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>public static void showInternalMessageDialog (java.awt.Component, java.lang.Object, java.lang.String, int);<\/p>\n<p>public static void showInternalMessageDialog (java.awt.Component, java.lang.Object, java.lang.String, int, java.awt.swing.Icon);<\/p>\n<p>public static int showInternalOptionDialog (java.awt.Component, java.lang.Object, java.lang.String, int, int, java.awt.swing.Icon, java.lang.Object[], java.lang.Object);<\/p>\n<p>public static void showMessageDialog (java.awt.Component, java.lang.Object);<\/p>\n<p>public static void showMessageDialog (java.awt.Component, java.lang.Object,\u00a0 java.lang.String, int);<\/p>\n<p>public static void showMessageDialog (java.awt.Component, java.lang.Object, java.lang.String, int, java.awt.swing.Icon);<\/p>\n<p>public static int showOptionDialog (java.awt.Component, java.lang.Object, java.lang.String, int, int, java.awt.swing.Icon, [Ljava.lang.Object;, java.lang.Object);<\/p>\n<p>}<\/p>\n<p>&nbsp;<\/p>\n<p>Umiddelbart ser JOptionPane-klassen relativt kompliceret ud, men faktisk kan dens funktionalitet begr\u00e6nses til fire statiske funktioner:<\/p>\n<p>&nbsp;<\/p>\n<ul>\n<li>showMessageDialog<br \/>\nGiver brugeren en besked.<\/li>\n<li>showInputDialog<br \/>\nBeder brugeren indtaste et svar.<\/li>\n<li>showConfirmDialog<br \/>\nStiller et sp\u00f8rgsm\u00e5l, der kr\u00e6ver bekr\u00e6ftelse \u2013 for eksempel med ja\/nej\/annull\u00e9r.<\/li>\n<li>showOptionDialog<br \/>\nEn kombination af de tre ovenst\u00e5ende.<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<p>Disse funktioner findes i et utal af afskygninger. Som det ses findes de ogs\u00e5 i showInternalXXX. Disse bruger en intern ramme \u2013 JInternalFrame \u2013 til at vise dialogboksen. Derudover findes der en r\u00e6kke overloadede funktioner, der g\u00f8r det muligt at angive forskellige former for parametre. Dette afsnit vil beskrive de generelle funktioner og vise, hvordan de pr\u00e6senteres med det almindelige Java look and feel. Sk\u00e6rmbillederne er fra en Windows 95 Java Virtuel Maskine.<\/p>\n<p>&nbsp;<\/p>\n<p>Linien<\/p>\n<p>&nbsp;<\/p>\n<p>JOptionPane.showMessageDialog(null, &#8220;Der er af ukendte \u00e5rsager opst\u00e5et en fejl&#8221;, &#8220;Fejl&#8221;, JOptionPane.ERROR_MESSAGE);<\/p>\n<p>&nbsp;<\/p>\n<p>viser en dialogboks som i figur 1.1. Metodens f\u00f8rste parameter angiver, hvilket vindue, der ejer dialogboksen. Har dialogboksen ingen ejer \u2013 som i dette tilf\u00e6lde \u2013 kan ejeren angives med null. Den n\u00e6ste parameter er den<\/p>\n<p>&nbsp;<\/p>\n<p>tekst, der skal vises i dialogboksen. Denne tekst efterf\u00f8lges af titlen. Den sidste parameter angiver, hvilken type dialogboks der skal vises. Forskellige typer dialogbokse er ERROR_MESSAGE, INFORMATION_MESSAGE, WARNING_MESSAGE, QUESTION_MESSAGE\u00a0og PLAIN_MESSAGE. Dialogboksens type angiver hvilket ikon, der skal vises i dialogboksen.<\/p>\n<p>&nbsp;<\/p>\n<p><a href=\"http:\/\/www.kristiansborg.dk\/bibliotek\/wp-content\/uploads\/2011\/11\/0101.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignleft size-full wp-image-345\" title=\"0101\" src=\"http:\/\/www.kristiansborg.dk\/bibliotek\/wp-content\/uploads\/2011\/11\/0101.png\" alt=\"\" width=\"322\" height=\"119\" srcset=\"https:\/\/www.kristiansborg.dk\/bibliotek\/wp-content\/uploads\/2011\/11\/0101.png 322w, https:\/\/www.kristiansborg.dk\/bibliotek\/wp-content\/uploads\/2011\/11\/0101-300x110.png 300w\" sizes=\"auto, (max-width: 322px) 100vw, 322px\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n<p>Fig. 1.1 \u00ad\u2013 en MessageDialog.<\/p>\n<p>&nbsp;<\/p>\n<p>Har man brug for input fra brugeren, skal man som n\u00e6vnt anvende showInputDialog. Det kan for eksempel g\u00f8res s\u00e5ledes:<\/p>\n<p>&nbsp;<\/p>\n<p>String navn = JOptionPane.showInputDialog(null, &#8220;Hvad er dit navn&#8221;, &#8220;Personlig information&#8221;, JOptionPane.QUESTION_MESSAGE);<\/p>\n<p>&nbsp;<\/p>\n<p>Denne linie vil vise en dialogboks svarende til den i figur 1.2.<\/p>\n<p>&nbsp;<\/p>\n<p>Som det ses, returnerer showInputDialog\u00a0en streng. Det er den tekst, brugeren indtaster. Parametrene til funktionen er de samme som ved showMessageDialog.<\/p>\n<p>&nbsp;<\/p>\n<p><a href=\"http:\/\/www.kristiansborg.dk\/bibliotek\/wp-content\/uploads\/2011\/11\/0102.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignleft size-full wp-image-346\" title=\"0102\" src=\"http:\/\/www.kristiansborg.dk\/bibliotek\/wp-content\/uploads\/2011\/11\/0102.png\" alt=\"\" width=\"297\" height=\"121\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n<p>Figur 1.2 \u2013 en InputDialog.<\/p>\n<p>&nbsp;<\/p>\n<p>Hvis man vil stille brugeren et mindre komplekst sp\u00f8rgsm\u00e5l, kan man n\u00f8jes med en dialogboks, der har en knap pr. svarmulighed. Denne funktionalitet stilles til r\u00e5dighed af showConfirmDialog. Den kan bruges s\u00e5ledes:<\/p>\n<p>&nbsp;<\/p>\n<p>int valg = JOptionPane.showConfirmDialog(null, &#8220;Er du sikker p\u00e5, at du vil formatere C:&#8221;, &#8220;Formatering&#8221;, JOptionPane.YES_NO_OPTION);<\/p>\n<p>&nbsp;<\/p>\n<p>Som det ses, returnerer showConfirmDialog en int-v\u00e6rdi. Denne v\u00e6rdi angiver, hvilken knap brugeren har valgt. F\u00f8lgende statiske variable i JoptionPane bruges til at angive valget:<\/p>\n<p>&nbsp;<\/p>\n<ul>\n<li>CANCEL_OPTION<\/li>\n<li>CLOSED_OPTION<\/li>\n<li>NO_OPTION<\/li>\n<li>OK_OPTION<\/li>\n<li>YES_OPTION<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>P\u00e5n\u00e6r CLOSED_OPTION, b\u00f8r returv\u00e6rdierne betydning v\u00e6re \u00e5benlys. CLOSED_OPTION bruges, n\u00e5r brugeren \u2013 i stedet for at klikke p\u00e5 en knap \u2013 v\u00e6lger at lukke dialogboksen. Som regel skal denne returv\u00e6rdi behandles som CANCEL_OPTION eller NO_OPTION. Parametrene til showConfirmDialog svarer til parametrene til de tidligere gennemg\u00e5ede metoder. Dog skal det n\u00e6vnes, at den sidste parameter ikke angiver dialogboksens ikon, men hvilke knapper der skal vises. Her er mulighederne DEFAULT_OPTION, YES_NO_OPTION, YES_NO_CANCEL_OPTION og OK_CANCEL_OPTION.<\/p>\n<p>&nbsp;<\/p>\n<p><a href=\"http:\/\/www.kristiansborg.dk\/bibliotek\/wp-content\/uploads\/2011\/11\/0103.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignleft size-full wp-image-347\" title=\"0103\" src=\"http:\/\/www.kristiansborg.dk\/bibliotek\/wp-content\/uploads\/2011\/11\/0103.png\" alt=\"\" width=\"306\" height=\"119\" srcset=\"https:\/\/www.kristiansborg.dk\/bibliotek\/wp-content\/uploads\/2011\/11\/0103.png 306w, https:\/\/www.kristiansborg.dk\/bibliotek\/wp-content\/uploads\/2011\/11\/0103-300x116.png 300w\" sizes=\"auto, (max-width: 306px) 100vw, 306px\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n<p>Fig. 1.3 \u2013 en ConfirmDialog.<\/p>\n<p>&nbsp;<\/p>\n<p>Hvis man gerne vil bruge en standarddialogboks, men ikke kan n\u00f8jes med de, der er blevet gennemg\u00e5et indtil nu, kan man m\u00e5ske bruge en OptionDialog. showOptionDialog\u00a0er lidt mere kompliceret at bruge end de \u00f8vrige metoder. Som det ses af metoden signatur, der er vist tidligere i kapitlet, tager showOptionDialog 8 parametre. Den f\u00f8rste parameter er som vanligt dialogboksens ejer. Den n\u00e6ste er den besked, der skal vises, efterfulgt at dialogboksens titel. Dette er som det har v\u00e6ret tidligere, men herefter bliver det interessant. Funktionens fjerde parameter angiver, hvilke knapper der skal vises. Dette sker efter samme metode, som ved showConfirmDialog. Dern\u00e6st skal det angives, hvilket ikon der skal vises i dialogboksen \u2013 her kan de samme konstanter som ved showMessageDialog bruges. Hvis man ikke \u00f8nsker et af de indbyggede ikoner vist, kan man v\u00e6lge at angive sit eget \u2013 det g\u00f8r man ved at angive et Icon-objekt som den n\u00e6ste parameter. Den n\u00e6ste parameter er et array af typen Object. Dette array indeholder de valgmuligheder, brugeren har. Hvis arrayet indeholder objekter, der er komponenter \u2013 dvs. instanser af subklasser af Component \u2013 bliver disse vist i dialogboksen. Ellers bliver objektets toString-metode kaldt, og resultatet deraf, bliver vist som tekst p\u00e5 knapper.<\/p>\n<p>&nbsp;<\/p>\n<p>Nedenst\u00e5ende er et eksempel p\u00e5 brug af showOptionDialog. Her vises en dialogboks, hvor brugeren har mulighed for at v\u00e6lge, hvilke komponenter, der skal installeres. Dialogboksen ses i figur 1.4.<\/p>\n<p>&nbsp;<\/p>\n<p>Object elementer[] = new Object[5];<\/p>\n<p>elementer[0] = new Checkbox(&#8220;Programfiler&#8221;);<\/p>\n<p>elementer[1] = new Checkbox(&#8220;Hj\u00e6lpefiler&#8221;);<\/p>\n<p>elementer[2] = new Checkbox(&#8220;Eksempelfiler&#8221;);<\/p>\n<p>elementer[3] = new Button (&#8220;OK&#8221;);<\/p>\n<p>elementer[4] = new Button (&#8220;Annuller&#8221;);<\/p>\n<p>JOptionPane.showOptionDialog(null, &#8220;Hvilke komponenter vil du installere&#8221;, null, 0, JOptionPane.QUESTION_MESSAGE, null, elementer, null);<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p><a href=\"http:\/\/www.kristiansborg.dk\/bibliotek\/wp-content\/uploads\/2011\/11\/0104.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignleft size-full wp-image-348\" title=\"0104\" src=\"http:\/\/www.kristiansborg.dk\/bibliotek\/wp-content\/uploads\/2011\/11\/0104.png\" alt=\"\" width=\"436\" height=\"117\" srcset=\"https:\/\/www.kristiansborg.dk\/bibliotek\/wp-content\/uploads\/2011\/11\/0104.png 436w, https:\/\/www.kristiansborg.dk\/bibliotek\/wp-content\/uploads\/2011\/11\/0104-300x80.png 300w\" sizes=\"auto, (max-width: 436px) 100vw, 436px\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n<p>fig. 1.4 \u2013 en OptionDialog<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<h1>Tr\u00e6k og slip<\/h1>\n<p>Tr\u00e6k og slip\u00a0er et velkendt begreb i de fleste operativsystemer med grafiske brugergr\u00e6nseflader. Systemet g\u00f8r det muligt for brugeren at overf\u00f8re information mellem to elementer, der er repr\u00e6senteret p\u00e5 den grafiske brugergr\u00e6nseflade. Med tr\u00e6k og slip er det endvidere muligt at g\u00f8re brugeren opm\u00e6rksom p\u00e5, hvad der vil ske, hvis det element, der tr\u00e6kkes, slippes over det element, mark\u00f8ren befinder sig over. Dette sker oftest ved at \u00e6ndre udseendet af musemark\u00f8ren.<\/p>\n<p>P\u00e5 den baggrund er det kun naturligt, at Java ogs\u00e5 underst\u00f8tter tr\u00e6k og slip. Alle komponenter \u2013 det vil sige klasser, der nedarver fra java.awt.Component \u2013 har metoder, der muligg\u00f8r tr\u00e6k og slip. Det vil alts\u00e5 sige, at tr\u00e6k og slip ikke er begr\u00e6nset til at kunne bruges med komponenter fra Swing.<\/p>\n<p>Tr\u00e6k og slip kan implementeres p\u00e5 flere m\u00e5der. Man kan v\u00e6lge selv at programmere det hele. Det kan g\u00f8res ved at h\u00e5ndtere de <em>mouse events<\/em>, der opst\u00e5r, n\u00e5r brugeren begynder at tr\u00e6kke i et element. Herefter kan man bruge metoden getComponentAt til at konvertere event\u2019ens x- og y-koordinater til et komponent i vinduet. Det samme kan g\u00f8res, n\u00e5r brugeren slipper elementet.<\/p>\n<p>Hvis man ikke beh\u00f8ver meget specialiseret tr\u00e6k og slip-h\u00e5ndtering er det imidlertid v\u00e6sentligt nemmere at bruge Javas indbyggede funktioner til tr\u00e6k og slip.<\/p>\n<p>En tr\u00e6k og slip-operation indeholder typisk disse elementer:<\/p>\n<ul>\n<li>En drag source\u00a0opst\u00e5r. Denne er tilknyttet et komponent p\u00e5 brugergr\u00e6nsefladen, og eventuelt nogle data.<\/li>\n<li>Et eller flere drop targets\u00a0opst\u00e5r og forsvinder. Drop targets er tilknyttet elementer, der kan modtage data ved hj\u00e6lp af tr\u00e6k og slip.<\/li>\n<li>En bruger starter en tr\u00e6k og slip-operation ved at begynde at tr\u00e6kke musen over et komponent, der er tilknyttet en drag source.<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<h1>Knapper<\/h1>\n<p>&nbsp;<\/p>\n<p>I Swing findes der mange forskellige former for knapper. Det drejer sig om almindelige knapper, checkbokse, radioknapper og\u00a0 menuer.<\/p>\n<h2>Almindelige knapper<\/h2>\n<p>Almindelige knapper bliver i Swing repr\u00e6senteret af objekter af klassen JButton. I forhold til de knapper, som kendes fra AWT (java.awt.Button), er der en del forskelle. Eksempelvis har man mulighed for at tilf\u00f8je grafik til Swings knapper. Dette vil blive beskrevet yderligere i kapitel 3.<\/p>\n<p>En anden interessant forskel er muligheden for at have genvejstaster. Brugergr\u00e6nsefladen i AWT er ikke s\u00e6rlig tastaturorienteret \u2013 det forventes, at brugeren benytter en mus. Ved at bruge Swing kan man imidlertid aktivere en knap blot ved et enkelt tastetryk. Det g\u00f8r man ved hj\u00e6lp af metoden setMnemonic. Nedenst\u00e5ende program er et eksempel p\u00e5, hvordan genvejstaster kan bruges.<\/p>\n<p>import java.awt.swing.*;<\/p>\n<p>import java.awt.*;<\/p>\n<p>public class Genvejstaster extends JFrame<\/p>\n<p>{<\/p>\n<p>public Genvejstaster()<\/p>\n<p>{<\/p>\n<p>super (&#8220;Genvejstaster&#8221;);<\/p>\n<p>JButton b1 = new JButton (&#8220;Aktiv\u00e9r&#8221;);<\/p>\n<p>b1.setMnemonic(&#8216;a&#8217;);<\/p>\n<p>getContentPane().add(b1);<\/p>\n<p>&nbsp;<\/p>\n<p>JButton b2 = new JButton (&#8220;Deaktiv\u00e9r&#8221;);<\/p>\n<p>b2.setMnemonic(&#8216;d&#8217;);<\/p>\n<p>getContentPane().add(b2);<\/p>\n<p>getContentPane().setLayout (new GridLayout());<\/p>\n<p>setSize(200,70);<\/p>\n<p>}<\/p>\n<p>&nbsp;<\/p>\n<p>public static final void main (String args[])<\/p>\n<p>{<\/p>\n<p>Genvejstaster me = new Genvejstaster();<\/p>\n<p>me.show();<\/p>\n<p>}<\/p>\n<p>}<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>Som det ses af figur 1.5, bliver genvejstasten automatisk understreget, hvis den findes i den tekst, som bliver vist p\u00e5 knappen.<\/p>\n<p>&nbsp;<\/p>\n<p><a href=\"http:\/\/www.kristiansborg.dk\/bibliotek\/wp-content\/uploads\/2011\/11\/0105.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignleft size-full wp-image-349\" title=\"0105\" src=\"http:\/\/www.kristiansborg.dk\/bibliotek\/wp-content\/uploads\/2011\/11\/0105.png\" alt=\"\" width=\"200\" height=\"70\" \/><\/a><\/p>\n<p>Figur 1.5 \u2013 knappers genvejstaster bliver automatisk understreget.<\/p>\n<p>&nbsp;<\/p>\n<p>Metoden setMnemonics\u00a0kan bruges p\u00e5 alle former for knapper.<\/p>\n<p>&nbsp;<\/p>\n<h2>Checkbokse<\/h2>\n<p>&nbsp;<\/p>\n<p>En afkrydsningsfelt\u00a0er en knap, der enten kan v\u00e6re markeret eller ikke. Hvorvidt knappen er markeret er uafh\u00e6ngig af andre komponenter. I Swing bliver checkbokse repr\u00e6senteret af klassen JCheckBox. Nedenst\u00e5ende eksempel viser, hvordan man benytter checkbokse.<\/p>\n<p>&nbsp;<\/p>\n<p>import java.awt.*;<\/p>\n<p>import java.awt.swing.*;<\/p>\n<p>import java.awt.event.*;<\/p>\n<p>&nbsp;<\/p>\n<p>public class CheckBoxExample extends JFrame implements ItemListener<\/p>\n<p>{<\/p>\n<p>private JCheckBox b1, b2, b3;<\/p>\n<p>private JTextArea t;<\/p>\n<p>&nbsp;<\/p>\n<p>private boolean kina, tomat, agurk;<\/p>\n<p>&nbsp;<\/p>\n<p>public CheckBoxExample ()<\/p>\n<p>{<\/p>\n<p>super (&#8220;Salatblander&#8221;);<\/p>\n<p>kina = false;<\/p>\n<p>tomat = false;<\/p>\n<p>agurk = false;<\/p>\n<p>&nbsp;<\/p>\n<p>JPanel panel = new JPanel();<\/p>\n<p>&nbsp;<\/p>\n<p>b1 = new JCheckBox (&#8220;Kinak\u00e5l&#8221;);<\/p>\n<p>b2 = new JCheckBox (&#8220;Tomater&#8221;);<\/p>\n<p>b3 = new JCheckBox (&#8220;Agurk&#8221;);<\/p>\n<p>&nbsp;<\/p>\n<p>b1.addItemListener(this);<\/p>\n<p>b2.addItemListener(this);<\/p>\n<p>b3.addItemListener(this);<\/p>\n<p>&nbsp;<\/p>\n<p>panel.setLayout (new GridLayout());<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>panel.add (b1);<\/p>\n<p>panel.add (b2);<\/p>\n<p>panel.add (b3);<\/p>\n<p>&nbsp;<\/p>\n<p>t = new JTextArea ();<\/p>\n<p>&nbsp;<\/p>\n<p>getContentPane().setLayout(new GridLayout(2,1));<\/p>\n<p>getContentPane().add (panel);<\/p>\n<p>getContentPane().add (t);<\/p>\n<p>setSize (300,200);<\/p>\n<p>}<\/p>\n<p>&nbsp;<\/p>\n<p>public void itemStateChanged (ItemEvent e)<\/p>\n<p>{<\/p>\n<p>if (e.getItem() == b1)<\/p>\n<p>kina = !kina;<\/p>\n<p>else<\/p>\n<p>if (e.getItem() == b2)<\/p>\n<p>tomat = !tomat;<\/p>\n<p>else<\/p>\n<p>if (e.getItem() == b3)<\/p>\n<p>agurk = !agurk;<\/p>\n<p>&nbsp;<\/p>\n<p>t.setText (&#8220;Din salat best\u00e5r nu af f\u00f8lgende:\\n&#8221;);<\/p>\n<p>if (kina)<\/p>\n<p>t.append (&#8220;Kinak\u00e5l\\n&#8221;);<\/p>\n<p>if (tomat)<\/p>\n<p>t.append (&#8220;Tomat\\n&#8221;);<\/p>\n<p>if (agurk)<\/p>\n<p>t.append (&#8220;Agurk&#8221;);<\/p>\n<p>}<\/p>\n<p>&nbsp;<\/p>\n<p>public static final void main(String args[])<\/p>\n<p>{<\/p>\n<p>CheckBoxExample me = new CheckBoxExample();<\/p>\n<p>me.show();<\/p>\n<p>}<\/p>\n<p>}<\/p>\n<p>&nbsp;<\/p>\n<p>Grunden, til at klassen implementerer interfacet ItemListener, er, at klassen selv skal h\u00e5ndtere de events, der opst\u00e5r, n\u00e5r der trykkes p\u00e5 en af checkboksene. Dette foreg\u00e5r i metoden itemStateChanged.<\/p>\n<p>&nbsp;<\/p>\n<p>Ovenst\u00e5ende program resulterer i et sk\u00e6rmbillede svarende til figur 1.6.<\/p>\n<p>&nbsp;<\/p>\n<p><a href=\"http:\/\/www.kristiansborg.dk\/bibliotek\/wp-content\/uploads\/2011\/11\/0106.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignleft size-full wp-image-350\" title=\"0106\" src=\"http:\/\/www.kristiansborg.dk\/bibliotek\/wp-content\/uploads\/2011\/11\/0106.png\" alt=\"\" width=\"300\" height=\"200\" \/><\/a><\/p>\n<p>Figur 1.6 \u2013 Brug af checkbokse<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<h2>Radioknapper<\/h2>\n<p>&nbsp;<\/p>\n<p>I mods\u00e6tning til checkbokse kan kun \u00e9n radioknap i en gruppe v\u00e6re markeret. Radioknapper bruges s\u00e5ledes, n\u00e5r brugeren kan v\u00e6lge en (og kun en) af flere muligheder. Klassen RadioButtonExample viser, hvordan radioknapper kan bruges.<\/p>\n<p>&nbsp;<\/p>\n<p>import java.awt.*;<\/p>\n<p>import java.awt.event.*;<\/p>\n<p>import java.awt.swing.*;<\/p>\n<p>&nbsp;<\/p>\n<p>public class RadioButtonExample extends JFrame implements ActionListener<\/p>\n<p>{<\/p>\n<p>private JRadioButton b1, b2, b3;<\/p>\n<p>private JTextField t;<\/p>\n<p>&nbsp;<\/p>\n<p>public RadioButtonExample()<\/p>\n<p>{<\/p>\n<p>super(&#8220;Hvilken type is vil du have?&#8221;);<\/p>\n<p>&nbsp;<\/p>\n<p>JRadioButton b1 = new JRadioButton (&#8220;Jordb\u00e6r&#8221;);<\/p>\n<p>JRadioButton b2 = new JRadioButton (&#8220;Chokolade&#8221;);<\/p>\n<p>JRadioButton b3 = new JRadioButton (&#8220;Vanille&#8221;);<\/p>\n<p>&nbsp;<\/p>\n<p>b1.setActionCommand(&#8220;jordb\u00e6r&#8221;);<\/p>\n<p>b2.setActionCommand(&#8220;chokolade&#8221;);<\/p>\n<p>b3.setActionCommand(&#8220;vanille&#8221;);<\/p>\n<p>&nbsp;<\/p>\n<p>b1.addActionListener (this);<\/p>\n<p>b2.addActionListener (this);<\/p>\n<p>b3.addActionListener (this);<\/p>\n<p>&nbsp;<\/p>\n<p>ButtonGroup bg = new ButtonGroup();<\/p>\n<p>bg.add (b1);<\/p>\n<p>bg.add (b2);<\/p>\n<p>bg.add (b3);<\/p>\n<p>&nbsp;<\/p>\n<p>JPanel panel = new JPanel();<\/p>\n<p>panel.setLayout(new GridLayout(1,3));<\/p>\n<p>&nbsp;<\/p>\n<p>panel.add(b1);<\/p>\n<p>panel.add(b2);<\/p>\n<p>panel.add(b3);<\/p>\n<p>&nbsp;<\/p>\n<p>t = new JTextField();<\/p>\n<p>&nbsp;<\/p>\n<p>getContentPane().setLayout(new GridLayout(2,1));<\/p>\n<p>getContentPane().add(panel);<\/p>\n<p>getContentPane().add(t);<\/p>\n<p>&nbsp;<\/p>\n<p>setSize (400,100);<\/p>\n<p>&nbsp;<\/p>\n<p>}<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>public void actionPerformed (ActionEvent e)<\/p>\n<p>{<\/p>\n<p>if (e.getActionCommand().equals(&#8220;jordb\u00e6r&#8221;))<\/p>\n<p>t.setText (&#8220;En jordb\u00e6ris p\u00e5 vej&#8230;&#8221;);<\/p>\n<p>else<\/p>\n<p>if (e.getActionCommand().equals(&#8220;chokolade&#8221;))<\/p>\n<p>t.setText (&#8220;En chokoladeis p\u00e5 vej&#8230;&#8221;);<\/p>\n<p>else<\/p>\n<p>if (e.getActionCommand().equals(&#8220;vanille&#8221;))<\/p>\n<p>t.setText (&#8220;En vanilleis p\u00e5 vej&#8230;&#8221;);<\/p>\n<p>}<\/p>\n<p>&nbsp;<\/p>\n<p>public static final void main (String args[])<\/p>\n<p>{<\/p>\n<p>RadioButtonExample me = new RadioButtonExample();<\/p>\n<p>me.show();<\/p>\n<p>}<\/p>\n<p>}<\/p>\n<p>&nbsp;<\/p>\n<p>Radioknapper skal samles i en gruppe for at sikre, at kun \u00e9n af dem er markeret ad gangen. Det g\u00f8res ved at tilf\u00f8je dem til et ButtonGroup-objekt. Derudover skal man l\u00e6gge m\u00e6rke til, at radioknapper bruger action-events og ikke item-events. Figur 1.7 viser et vindue med radioknapper.<\/p>\n<p>&nbsp;<\/p>\n<p><a href=\"http:\/\/www.kristiansborg.dk\/bibliotek\/wp-content\/uploads\/2011\/11\/0107.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignleft size-full wp-image-351\" title=\"0107\" src=\"http:\/\/www.kristiansborg.dk\/bibliotek\/wp-content\/uploads\/2011\/11\/0107.png\" alt=\"\" width=\"400\" height=\"100\" srcset=\"https:\/\/www.kristiansborg.dk\/bibliotek\/wp-content\/uploads\/2011\/11\/0107.png 400w, https:\/\/www.kristiansborg.dk\/bibliotek\/wp-content\/uploads\/2011\/11\/0107-300x75.png 300w\" sizes=\"auto, (max-width: 400px) 100vw, 400px\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n<p>Et vindue med radioknapper<\/p>\n<p>&nbsp;<\/p>\n<h1>Tooltips<\/h1>\n<p>&nbsp;<\/p>\n<p>Tooltips er de sm\u00e5 gule beskeder, som bliver vist, n\u00e5r man lader musemark\u00f8ren vente over et komponent. Hvis man vil tilf\u00f8je et tooltip\u00a0til et komponent, er det relativt simpelt. Nedenst\u00e5ende programstump viser, hvordan det kan g\u00f8res.<\/p>\n<p>&nbsp;<\/p>\n<p>import java.awt.swing.*;<\/p>\n<p>import java.awt.*;<\/p>\n<p>&nbsp;<\/p>\n<p>public class ToolTipExample extends JFrame<\/p>\n<p>{<\/p>\n<p>public ToolTipExample()<\/p>\n<p>{<\/p>\n<p>JButton b1 = new JButton (&#8220;Knap 1&#8221;);<\/p>\n<p>JButton b2 = new JButton (&#8220;Knap 2&#8221;);<\/p>\n<p>&nbsp;<\/p>\n<p>b1.setToolTipText (&#8220;Dette er den f\u00f8rste knap&#8221;);<\/p>\n<p>b2.setToolTipText (&#8220;Dette er den anden knap&#8221;);<\/p>\n<p>getContentPane().add(b1);<\/p>\n<p>getContentPane().add(b2);<\/p>\n<p>getContentPane().setLayout(new GridLayout());<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>setSize(200,70);<\/p>\n<p>}<\/p>\n<p>&nbsp;<\/p>\n<p>public static final void main(String args[])<\/p>\n<p>{<\/p>\n<p>ToolTipExample me = new ToolTipExample();<\/p>\n<p>me.show();<\/p>\n<p>}<\/p>\n<p>}<\/p>\n<p>&nbsp;<\/p>\n<p>Figur 1.8 viser, hvordan vinduet og tooltippet kommer til at se ud.<\/p>\n<p>&nbsp;<\/p>\n<p><a href=\"http:\/\/www.kristiansborg.dk\/bibliotek\/wp-content\/uploads\/2011\/11\/0108.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignleft size-full wp-image-352\" title=\"0108\" src=\"http:\/\/www.kristiansborg.dk\/bibliotek\/wp-content\/uploads\/2011\/11\/0108.png\" alt=\"\" width=\"200\" height=\"147\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n<p>Figur 1.8 \u2013 Tooltip<\/p>\n<p>&nbsp;<\/p>\n<p>Hvis man selv skriver en komponent, og gerne selv vil specificere, hvordan tooltips skal h\u00e5ndteres skal man bruge klassen java.awt.swing.JToolTip. Denne klasse har f\u00f8lgende signatur:<\/p>\n<p>&nbsp;<\/p>\n<p>public class JToolTip extends java.awt.swing.JComponent implements java.awt.accessibility.Accessible<\/p>\n<p>{<\/p>\n<p>public java.awt.swing.JToolTip();<\/p>\n<p>public java.awt.swing.JComponent getComponent();<\/p>\n<p>public java.lang.String getTipText();<\/p>\n<p>public void setComponent(java.awt.swing.JComponent);<\/p>\n<p>public void setTipText(java.lang.String);<\/p>\n<p>}<\/p>\n<p>&nbsp;<\/p>\n<p>Metoderne getTipText og setTipText bruges naturligvis til at manipulere den tekst, der vises i tooltippet. getComponent og setComponent bruges til at l\u00e6se og angive, hvilket komponent tooltippet er tilknyttet.<\/p>\n<h1>Valg af brugergr\u00e6nseflade<\/h1>\n<p>&nbsp;<\/p>\n<p>Som n\u00e6vnt tidligere underst\u00f8tter Swing flere forskellige brugergr\u00e6nseflader. Nogle brugergr\u00e6nseflader kan f\u00f8lger med Java Development Kit, mens andre skal installeres s\u00e6rskilt. Klassen UIManager h\u00e5ndterer installerede brugergr\u00e6nseflader.<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>public class UIManager extends Obejct implements Serializable<\/p>\n<p>{<\/p>\n<p>public UIManager();<\/p>\n<p>&nbsp;<\/p>\n<p>public static java.awt.swing.UIManager$LookAndFeelInfo[] getInstalledLookAndFeels\u00a0();<\/p>\n<p>&nbsp;<\/p>\n<p>public static void installLookAndFeel (java.lang.String, java.lang.String);<\/p>\n<p>}<\/p>\n<p>&nbsp;<\/p>\n<p>Det er ikke overraskende metoden, getInstalledLookAndFeels, der bruges til at hente en oversigt over de installerede gr\u00e6nseflader. Denne funktion returnerer de installerede gr\u00e6nseflader i et array af LookAndFeelInfo-objekter:<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>public class UIManager.LookAndFeelInfo extends Object<\/p>\n<p>{<\/p>\n<p>public LookAndFeelInfo(java.lang.String, java.lang.String);<\/p>\n<p>&nbsp;<\/p>\n<p>public java.lang.String getClassName ();<\/p>\n<p>public java.lang.String getName ();<\/p>\n<p>}<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>N\u00e5r man har et LookAndFeel-objekt, kan man kalde funktionen getClassName for at f\u00e5 navnet p\u00e5 den tilknyttede klasse.<\/p>\n<p>&nbsp;<\/p>\n<p>Dette navn kan man bruge til at v\u00e6lge at anvende den p\u00e5g\u00e6ldende brugergr\u00e6nseflade. Det g\u00f8r man med den statiske metode UIManager.setLookAndFeel.setLookAndFeel. setLookAndFeel kan kaldes n\u00e5r som helst i programmet \u2013 man kan s\u00e5ledes godt \u00e6ndre udseendet af brugergr\u00e6nsefladen, mens den vises. Nedenst\u00e5ende eksempel viser, hvordan man kan lave en oversigt over installerede brugergr\u00e6nseflader og herefter lade brugeren v\u00e6lge mellem dem. Figur 1.5 og 1.6 viser sk\u00e6rmbilledet med to forskellige typer af brugergr\u00e6nseflader.<\/p>\n<p>&nbsp;<\/p>\n<p>import java.awt.swing.*;<\/p>\n<p>import java.awt.*;<\/p>\n<p>import java.awt.event.*;<\/p>\n<p>&nbsp;<\/p>\n<p>public class LookAndFeelChanger extends JFrame {<\/p>\n<p>public static LookAndFeelChanger myFrame = null;<\/p>\n<p>&nbsp;<\/p>\n<p>public LookAndFeelChanger() {<\/p>\n<p>getContentPane().setLayout(null);<\/p>\n<p>UIManager.LookAndFeelInfo info[] = UIManager.getInstalledLookAndFeels();<\/p>\n<p>for (int i = 0; i &lt; info.length; i++) {<\/p>\n<p>JButton b = new JButton(info[i].getClassName());<\/p>\n<p>b.setBounds(10, i * 30, 400,20);<\/p>\n<p>b.addActionListener(new LAFCListener());<\/p>\n<p>getContentPane().add(b);<\/p>\n<p>}<\/p>\n<p>setSize(440, 120);<\/p>\n<p>setVisible(true);<\/p>\n<p>}<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>public static final void main(String args[])<\/p>\n<p>{<\/p>\n<p>myFrame = new LookAndFeelChanger();<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>}<\/p>\n<p>&nbsp;<\/p>\n<p>class LAFCListener implements ActionListener {<\/p>\n<p>public void actionPerformed (ActionEvent e) {<\/p>\n<p>try {<\/p>\n<p>UIManager.setLookAndFeel(e.getActionCommand());<\/p>\n<p>SwingUtilities.updateComponentTreeUI(myFrame);<\/p>\n<p>}<\/p>\n<p>catch(ClassNotFoundException cnfe) {<\/p>\n<p>System.err.println(cnfe.toString());<\/p>\n<p>}<\/p>\n<p>catch(UnsupportedLookAndFeelException ulafe) {<\/p>\n<p>System.err.println(ulafe.toString());<\/p>\n<p>}<\/p>\n<p>catch(IllegalAccessException iae) {<\/p>\n<p>System.err.println(iae.toString());<\/p>\n<p>}<\/p>\n<p>catch(InstantiationException ie) {<\/p>\n<p>System.err.println(ie.toString());<\/p>\n<p>}<\/p>\n<p>}<\/p>\n<p>}<\/p>\n<p>}<\/p>\n<p>&nbsp;<\/p>\n<p><a href=\"http:\/\/www.kristiansborg.dk\/bibliotek\/wp-content\/uploads\/2011\/11\/0109.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignleft size-full wp-image-353\" title=\"0109\" src=\"http:\/\/www.kristiansborg.dk\/bibliotek\/wp-content\/uploads\/2011\/11\/0109.png\" alt=\"\" width=\"440\" height=\"120\" srcset=\"https:\/\/www.kristiansborg.dk\/bibliotek\/wp-content\/uploads\/2011\/11\/0109.png 440w, https:\/\/www.kristiansborg.dk\/bibliotek\/wp-content\/uploads\/2011\/11\/0109-300x81.png 300w\" sizes=\"auto, (max-width: 440px) 100vw, 440px\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n<p>fig. 1.9 \u2013 En MetalLookAndFeel dialogboks.<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p><a href=\"http:\/\/www.kristiansborg.dk\/bibliotek\/wp-content\/uploads\/2011\/11\/0110.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignleft size-full wp-image-354\" title=\"0110\" src=\"http:\/\/www.kristiansborg.dk\/bibliotek\/wp-content\/uploads\/2011\/11\/0110.png\" alt=\"\" width=\"440\" height=\"120\" srcset=\"https:\/\/www.kristiansborg.dk\/bibliotek\/wp-content\/uploads\/2011\/11\/0110.png 440w, https:\/\/www.kristiansborg.dk\/bibliotek\/wp-content\/uploads\/2011\/11\/0110-300x81.png 300w\" sizes=\"auto, (max-width: 440px) 100vw, 440px\" \/><\/a><\/p>\n<p>fig. 1.10 \u2013 En Windows dialogboks.<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<h1>FAQ<\/h1>\n<p>&nbsp;<\/p>\n<p><em>Ved almindelige <\/em><em>Dialog-objekter kan man angive, om dialogboksen skal v\u00e6re modal. Har standarddialogbokse den samme mulighed.<\/em><\/p>\n<p><em> <\/em><\/p>\n<p>Nej. Standarddialogbokse er altid modale. Det vil sige, at udf\u00f8rslen af den tr\u00e5d, der kalder dialogboksen, stoppes, indtil dialogboksen er blevet lukket.<\/p>\n<p>&nbsp;<\/p>\n<p><em>Hvordan sikrer man, at ens program har den samme brugergr\u00e6nseflade p\u00e5 flere forskellige platforme?<\/em><\/p>\n<p><em> <\/em><\/p>\n<p>Hvis man ikke \u00e6ndrer udseendet af brugergr\u00e6nsefladen, f\u00e5r den MetalLookAndFeel. Denne brugergr\u00e6nseflader er installeret p\u00e5 alle implementationer af Java, og programmer, der bruger denne gr\u00e6nseflade, vil derfor, v\u00e6re stort set ens p\u00e5 alle platforme. Det kan v\u00e6re en fordel, n\u00e5r der skal udarbejdes manualer og onlinehj\u00e6lp.<\/p>\n<p>&nbsp;<\/p>\n<p><em>Kan man anvende double-buffering med Swing?<\/em><\/p>\n<p>&nbsp;<\/p>\n<p>Double-buffering\u00a0er en teknik, der kan forbedre udseendet af brugergr\u00e6nseflader, der \u00e6ndres tit. Swing anvender automatisk double-buffering, s\u00e5 man beh\u00f8ver ikke l\u00e6ngere selv at skrive den del af programmet. Hvis man ikke vil bruge double-buffering kan man kalde metoden setDoubleBuffered(false) p\u00e5 et komponent.<\/p>\n<p>&nbsp;<\/p>\n<div style=\"border: 1px solid red; color: red;\"><strong>Du l\u00e6ser en gammel bog<\/strong><\/p>\n<p>Den bog, du l\u00e6ser her, er fra 1998, og mange ting kan have \u00e6ndret sig siden da.<br \/>\nVi h\u00e5ber, at du stadig kan finde relevant information i den.<br \/>\nHvis du vil l\u00e6se aktuelle oplysninger om de avancerede dele af Java, anbefaler vi<br \/>\nbogen <a href=\"http:\/\/clk.tradedoubler.com\/click?p(197229)a(2029446)g(19172914)url(http:\/\/www.adlibris.com\/dk\/product.aspx?isbn=0132354799)\" target=\"_blank\">Core Java &#8211; Advanced Features<\/a><img decoding=\"async\" src=\"http:\/\/impdk.tradedoubler.com\/imp?type(inv)g(19172914)a(2029446)\" alt=\"\" \/><\/div>\n","protected":false},"excerpt":{"rendered":"<p>Kapitel 1 : Generelt om Swing &nbsp; Swing er oprindeligt en del af Java Foundation Classes (JFC), som Sun udviklede som en tilf\u00f8jelse til Java-standarden, svarende til det Standard Template Library (STL), der kendes fra C++. Swing er den grafiske den af JFC, som udvider Abstract Window Toolkit (AWT), der altid har v\u00e6ret en del [&hellip;]<\/p>\n","protected":false},"author":3,"featured_media":0,"parent":332,"menu_order":10,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_monsterinsights_skip_tracking":false,"footnotes":""},"class_list":["post-334","page","type-page","status-publish","hentry"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.0.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"Swing er oprindeligt en del af Java Foundation Classes (JFC), som Sun udviklede som en tilf\u00f8jelse til Java-standarden, svarende til det Standard Template Library (STL), der kendes fra C++. Swing er den grafiske den af JFC, som udvider Abstract Window Toolkit (AWT), der altid har v\u00e6ret en del af Java-standarden.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"keywords\" content=\"java,swing,awt,jfc,menu,vinduer,windows,frames,jframe,jdialog,dialog,content pane,pane,knap,button,jbutton\" \/>\n\t<link rel=\"canonical\" href=\"https:\/\/www.kristiansborg.dk\/bibliotek\/b%c3%b8ger\/avanceret-java-programmering\/kapitel-1-grundlaeggende-swing\/\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.0.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"da_DK\" \/>\n\t\t<meta property=\"og:site_name\" content=\"Biblioteket | Samling af artikler og b\u00f8ger\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"Grundl\u00e6ggende Swing | Biblioteket\" \/>\n\t\t<meta property=\"og:description\" content=\"Swing er oprindeligt en del af Java Foundation Classes (JFC), som Sun udviklede som en tilf\u00f8jelse til Java-standarden, svarende til det Standard Template Library (STL), der kendes fra C++. Swing er den grafiske den af JFC, som udvider Abstract Window Toolkit (AWT), der altid har v\u00e6ret en del af Java-standarden.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/www.kristiansborg.dk\/bibliotek\/b%c3%b8ger\/avanceret-java-programmering\/kapitel-1-grundlaeggende-swing\/\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2011-11-03T09:29:23+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2011-11-07T06:39:57+00:00\" \/>\n\t\t<meta name=\"twitter:card\" content=\"summary\" \/>\n\t\t<meta name=\"twitter:title\" content=\"Grundl\u00e6ggende Swing | Biblioteket\" \/>\n\t\t<meta name=\"twitter:description\" content=\"Swing er oprindeligt en del af Java Foundation Classes (JFC), som Sun udviklede som en tilf\u00f8jelse til Java-standarden, svarende til det Standard Template Library (STL), der kendes fra C++. Swing er den grafiske den af JFC, som udvider Abstract Window Toolkit (AWT), der altid har v\u00e6ret en del af Java-standarden.\" \/>\n\t\t<script type=\"application\/ld+json\" class=\"aioseo-schema\">\n\t\t\t{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.kristiansborg.dk\\\/bibliotek\\\/b%c3%b8ger\\\/avanceret-java-programmering\\\/kapitel-1-grundlaeggende-swing\\\/#breadcrumblist\",\"itemListElement\":[{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.kristiansborg.dk\\\/bibliotek#listItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.kristiansborg.dk\\\/bibliotek\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.kristiansborg.dk\\\/bibliotek\\\/b%c3%b8ger\\\/#listItem\",\"name\":\"B\\u00f8ger\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.kristiansborg.dk\\\/bibliotek\\\/b%c3%b8ger\\\/#listItem\",\"position\":2,\"name\":\"B\\u00f8ger\",\"item\":\"https:\\\/\\\/www.kristiansborg.dk\\\/bibliotek\\\/b%c3%b8ger\\\/\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.kristiansborg.dk\\\/bibliotek\\\/b%c3%b8ger\\\/avanceret-java-programmering\\\/#listItem\",\"name\":\"Avanceret Java-programmering\"},\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.kristiansborg.dk\\\/bibliotek#listItem\",\"name\":\"Home\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.kristiansborg.dk\\\/bibliotek\\\/b%c3%b8ger\\\/avanceret-java-programmering\\\/#listItem\",\"position\":3,\"name\":\"Avanceret Java-programmering\",\"item\":\"https:\\\/\\\/www.kristiansborg.dk\\\/bibliotek\\\/b%c3%b8ger\\\/avanceret-java-programmering\\\/\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.kristiansborg.dk\\\/bibliotek\\\/b%c3%b8ger\\\/avanceret-java-programmering\\\/kapitel-1-grundlaeggende-swing\\\/#listItem\",\"name\":\"Kapitel 1 Grundl\\u00e6ggende Swing\"},\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.kristiansborg.dk\\\/bibliotek\\\/b%c3%b8ger\\\/#listItem\",\"name\":\"B\\u00f8ger\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.kristiansborg.dk\\\/bibliotek\\\/b%c3%b8ger\\\/avanceret-java-programmering\\\/kapitel-1-grundlaeggende-swing\\\/#listItem\",\"position\":4,\"name\":\"Kapitel 1 Grundl\\u00e6ggende Swing\",\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.kristiansborg.dk\\\/bibliotek\\\/b%c3%b8ger\\\/avanceret-java-programmering\\\/#listItem\",\"name\":\"Avanceret Java-programmering\"}}]},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.kristiansborg.dk\\\/bibliotek\\\/#organization\",\"name\":\"Biblioteket\",\"description\":\"Samling af artikler og b\\u00f8ger\",\"url\":\"https:\\\/\\\/www.kristiansborg.dk\\\/bibliotek\\\/\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.kristiansborg.dk\\\/bibliotek\\\/b%c3%b8ger\\\/avanceret-java-programmering\\\/kapitel-1-grundlaeggende-swing\\\/#webpage\",\"url\":\"https:\\\/\\\/www.kristiansborg.dk\\\/bibliotek\\\/b%c3%b8ger\\\/avanceret-java-programmering\\\/kapitel-1-grundlaeggende-swing\\\/\",\"name\":\"Grundl\\u00e6ggende Swing | Biblioteket\",\"description\":\"Swing er oprindeligt en del af Java Foundation Classes (JFC), som Sun udviklede som en tilf\\u00f8jelse til Java-standarden, svarende til det Standard Template Library (STL), der kendes fra C++. Swing er den grafiske den af JFC, som udvider Abstract Window Toolkit (AWT), der altid har v\\u00e6ret en del af Java-standarden.\",\"inLanguage\":\"da-DK\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.kristiansborg.dk\\\/bibliotek\\\/#website\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.kristiansborg.dk\\\/bibliotek\\\/b%c3%b8ger\\\/avanceret-java-programmering\\\/kapitel-1-grundlaeggende-swing\\\/#breadcrumblist\"},\"datePublished\":\"2011-11-03T11:29:23+02:00\",\"dateModified\":\"2011-11-07T08:39:57+02:00\"},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.kristiansborg.dk\\\/bibliotek\\\/#website\",\"url\":\"https:\\\/\\\/www.kristiansborg.dk\\\/bibliotek\\\/\",\"name\":\"Biblioteket\",\"description\":\"Samling af artikler og b\\u00f8ger\",\"inLanguage\":\"da-DK\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.kristiansborg.dk\\\/bibliotek\\\/#organization\"}}]}\n\t\t<\/script>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"Grundl\u00e6ggende Swing | Biblioteket","description":"Swing er oprindeligt en del af Java Foundation Classes (JFC), som Sun udviklede som en tilf\u00f8jelse til Java-standarden, svarende til det Standard Template Library (STL), der kendes fra C++. Swing er den grafiske den af JFC, som udvider Abstract Window Toolkit (AWT), der altid har v\u00e6ret en del af Java-standarden.","canonical_url":"https:\/\/www.kristiansborg.dk\/bibliotek\/b%c3%b8ger\/avanceret-java-programmering\/kapitel-1-grundlaeggende-swing\/","robots":"max-image-preview:large","keywords":"java,swing,awt,jfc,menu,vinduer,windows,frames,jframe,jdialog,dialog,content pane,pane,knap,button,jbutton","webmasterTools":{"miscellaneous":""},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"BreadcrumbList","@id":"https:\/\/www.kristiansborg.dk\/bibliotek\/b%c3%b8ger\/avanceret-java-programmering\/kapitel-1-grundlaeggende-swing\/#breadcrumblist","itemListElement":[{"@type":"ListItem","@id":"https:\/\/www.kristiansborg.dk\/bibliotek#listItem","position":1,"name":"Home","item":"https:\/\/www.kristiansborg.dk\/bibliotek","nextItem":{"@type":"ListItem","@id":"https:\/\/www.kristiansborg.dk\/bibliotek\/b%c3%b8ger\/#listItem","name":"B\u00f8ger"}},{"@type":"ListItem","@id":"https:\/\/www.kristiansborg.dk\/bibliotek\/b%c3%b8ger\/#listItem","position":2,"name":"B\u00f8ger","item":"https:\/\/www.kristiansborg.dk\/bibliotek\/b%c3%b8ger\/","nextItem":{"@type":"ListItem","@id":"https:\/\/www.kristiansborg.dk\/bibliotek\/b%c3%b8ger\/avanceret-java-programmering\/#listItem","name":"Avanceret Java-programmering"},"previousItem":{"@type":"ListItem","@id":"https:\/\/www.kristiansborg.dk\/bibliotek#listItem","name":"Home"}},{"@type":"ListItem","@id":"https:\/\/www.kristiansborg.dk\/bibliotek\/b%c3%b8ger\/avanceret-java-programmering\/#listItem","position":3,"name":"Avanceret Java-programmering","item":"https:\/\/www.kristiansborg.dk\/bibliotek\/b%c3%b8ger\/avanceret-java-programmering\/","nextItem":{"@type":"ListItem","@id":"https:\/\/www.kristiansborg.dk\/bibliotek\/b%c3%b8ger\/avanceret-java-programmering\/kapitel-1-grundlaeggende-swing\/#listItem","name":"Kapitel 1 Grundl\u00e6ggende Swing"},"previousItem":{"@type":"ListItem","@id":"https:\/\/www.kristiansborg.dk\/bibliotek\/b%c3%b8ger\/#listItem","name":"B\u00f8ger"}},{"@type":"ListItem","@id":"https:\/\/www.kristiansborg.dk\/bibliotek\/b%c3%b8ger\/avanceret-java-programmering\/kapitel-1-grundlaeggende-swing\/#listItem","position":4,"name":"Kapitel 1 Grundl\u00e6ggende Swing","previousItem":{"@type":"ListItem","@id":"https:\/\/www.kristiansborg.dk\/bibliotek\/b%c3%b8ger\/avanceret-java-programmering\/#listItem","name":"Avanceret Java-programmering"}}]},{"@type":"Organization","@id":"https:\/\/www.kristiansborg.dk\/bibliotek\/#organization","name":"Biblioteket","description":"Samling af artikler og b\u00f8ger","url":"https:\/\/www.kristiansborg.dk\/bibliotek\/"},{"@type":"WebPage","@id":"https:\/\/www.kristiansborg.dk\/bibliotek\/b%c3%b8ger\/avanceret-java-programmering\/kapitel-1-grundlaeggende-swing\/#webpage","url":"https:\/\/www.kristiansborg.dk\/bibliotek\/b%c3%b8ger\/avanceret-java-programmering\/kapitel-1-grundlaeggende-swing\/","name":"Grundl\u00e6ggende Swing | Biblioteket","description":"Swing er oprindeligt en del af Java Foundation Classes (JFC), som Sun udviklede som en tilf\u00f8jelse til Java-standarden, svarende til det Standard Template Library (STL), der kendes fra C++. Swing er den grafiske den af JFC, som udvider Abstract Window Toolkit (AWT), der altid har v\u00e6ret en del af Java-standarden.","inLanguage":"da-DK","isPartOf":{"@id":"https:\/\/www.kristiansborg.dk\/bibliotek\/#website"},"breadcrumb":{"@id":"https:\/\/www.kristiansborg.dk\/bibliotek\/b%c3%b8ger\/avanceret-java-programmering\/kapitel-1-grundlaeggende-swing\/#breadcrumblist"},"datePublished":"2011-11-03T11:29:23+02:00","dateModified":"2011-11-07T08:39:57+02:00"},{"@type":"WebSite","@id":"https:\/\/www.kristiansborg.dk\/bibliotek\/#website","url":"https:\/\/www.kristiansborg.dk\/bibliotek\/","name":"Biblioteket","description":"Samling af artikler og b\u00f8ger","inLanguage":"da-DK","publisher":{"@id":"https:\/\/www.kristiansborg.dk\/bibliotek\/#organization"}}]},"og:locale":"da_DK","og:site_name":"Biblioteket | Samling af artikler og b\u00f8ger","og:type":"article","og:title":"Grundl\u00e6ggende Swing | Biblioteket","og:description":"Swing er oprindeligt en del af Java Foundation Classes (JFC), som Sun udviklede som en tilf\u00f8jelse til Java-standarden, svarende til det Standard Template Library (STL), der kendes fra C++. Swing er den grafiske den af JFC, som udvider Abstract Window Toolkit (AWT), der altid har v\u00e6ret en del af Java-standarden.","og:url":"https:\/\/www.kristiansborg.dk\/bibliotek\/b%c3%b8ger\/avanceret-java-programmering\/kapitel-1-grundlaeggende-swing\/","article:published_time":"2011-11-03T09:29:23+00:00","article:modified_time":"2011-11-07T06:39:57+00:00","twitter:card":"summary","twitter:title":"Grundl\u00e6ggende Swing | Biblioteket","twitter:description":"Swing er oprindeligt en del af Java Foundation Classes (JFC), som Sun udviklede som en tilf\u00f8jelse til Java-standarden, svarende til det Standard Template Library (STL), der kendes fra C++. Swing er den grafiske den af JFC, som udvider Abstract Window Toolkit (AWT), der altid har v\u00e6ret en del af Java-standarden."},"aioseo_meta_data":{"post_id":"334","title":"Grundl\u00e6ggende Swing | #site_title","description":"Swing er oprindeligt en del af Java Foundation Classes (JFC), som Sun udviklede som en tilf\u00f8jelse til Java-standarden, svarende til det Standard Template Library (STL), der kendes fra C++. Swing er den grafiske den af JFC, som udvider Abstract Window Toolkit (AWT), der altid har v\u00e6ret en del af Java-standarden.","keywords":[{"label":"Java","value":"Java"},{"label":"Swing","value":"Swing"},{"label":"AWT","value":"AWT"},{"label":"JFC","value":"JFC"},{"label":"Menu","value":"Menu"},{"label":"vinduer","value":"vinduer"},{"label":"windows","value":"windows"},{"label":"frames","value":"frames"},{"label":"jframe","value":"jframe"},{"label":"jdialog","value":"jdialog"},{"label":"dialog","value":"dialog"},{"label":"content pane","value":"content pane"},{"label":"pane","value":"pane"},{"label":"knap","value":"knap"},{"label":"button","value":"button"},{"label":"jbutton","value":"jbutton"}],"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"location":null,"local_seo":null,"breadcrumb_settings":null,"limit_modified_date":false,"ai":null,"created":"2020-12-21 06:59:21","updated":"2025-06-04 02:17:13","seo_analyzer_scan_date":null,"focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"aioseo_breadcrumb":"<div class=\"aioseo-breadcrumbs\"><span class=\"aioseo-breadcrumb\">\n\t\t\t<a href=\"https:\/\/www.kristiansborg.dk\/bibliotek\" title=\"Home\">Home<\/a>\n\t\t<\/span><span class=\"aioseo-breadcrumb-separator\">&raquo;<\/span><span class=\"aioseo-breadcrumb\">\n\t\t\t<a href=\"https:\/\/www.kristiansborg.dk\/bibliotek\/b%c3%b8ger\/\" title=\"B\u00f8ger\">B\u00f8ger<\/a>\n\t\t<\/span><span class=\"aioseo-breadcrumb-separator\">&raquo;<\/span><span class=\"aioseo-breadcrumb\">\n\t\t\t<a href=\"https:\/\/www.kristiansborg.dk\/bibliotek\/b%c3%b8ger\/avanceret-java-programmering\/\" title=\"Avanceret Java-programmering\">Avanceret Java-programmering<\/a>\n\t\t<\/span><span class=\"aioseo-breadcrumb-separator\">&raquo;<\/span><span class=\"aioseo-breadcrumb\">\n\t\t\tKapitel 1 Grundl\u00e6ggende Swing\n\t\t<\/span><\/div>","aioseo_breadcrumb_json":[{"label":"Home","link":"https:\/\/www.kristiansborg.dk\/bibliotek"},{"label":"B\u00f8ger","link":"https:\/\/www.kristiansborg.dk\/bibliotek\/b%c3%b8ger\/"},{"label":"Avanceret Java-programmering","link":"https:\/\/www.kristiansborg.dk\/bibliotek\/b%c3%b8ger\/avanceret-java-programmering\/"},{"label":"Kapitel 1 Grundl\u00e6ggende Swing","link":"https:\/\/www.kristiansborg.dk\/bibliotek\/b%c3%b8ger\/avanceret-java-programmering\/kapitel-1-grundlaeggende-swing\/"}],"_links":{"self":[{"href":"https:\/\/www.kristiansborg.dk\/bibliotek\/wp-json\/wp\/v2\/pages\/334","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.kristiansborg.dk\/bibliotek\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.kristiansborg.dk\/bibliotek\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.kristiansborg.dk\/bibliotek\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/www.kristiansborg.dk\/bibliotek\/wp-json\/wp\/v2\/comments?post=334"}],"version-history":[{"count":7,"href":"https:\/\/www.kristiansborg.dk\/bibliotek\/wp-json\/wp\/v2\/pages\/334\/revisions"}],"predecessor-version":[{"id":356,"href":"https:\/\/www.kristiansborg.dk\/bibliotek\/wp-json\/wp\/v2\/pages\/334\/revisions\/356"}],"up":[{"embeddable":true,"href":"https:\/\/www.kristiansborg.dk\/bibliotek\/wp-json\/wp\/v2\/pages\/332"}],"wp:attachment":[{"href":"https:\/\/www.kristiansborg.dk\/bibliotek\/wp-json\/wp\/v2\/media?parent=334"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}