11. januar 2003 - 17:52
Der er
14 kommentarer og 2 løsninger
JList og JScrollPane
Hej eksperter Jeg har de sidste par timer siddet og arbejdet med et lille program jeg er ved at lave, og er derved løbet ind i nogle små problemer. Første problem: Hvordan for man en JList til kun at akseaptere en markering? Andet problem: Hvordan for man en JList til at scrolle, når antallet af elementer bliver så stort at der ikke længere er plads til at vise dem? Jeg ved at man skal bruge et JScrollPane, men jeg kan ikke få det til at virke. Håber i kan hjælpe, for synes efterhånden at jeg har prøvet alt, og jeg kan sku' ikke finde ud af det. Det er sikker temmelig simpelt, så grin ikke. :) B_M_P
Annonceindlæg fra Infor
11. januar 2003 - 18:13
#1
Kun ét element kan markeres: JList list = new JList(); list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); Med scrollpane: Du indsætter dit JScrollPane (her kaldt 'scroll') i et panel som normalt og skriver: scroll.getViewport().add(list, null); så er din JList korrekt indlejret i JScrollPane og du burde kunne se det i din GUI.
11. januar 2003 - 18:58
#2
Det virker... næsten, den vil bare ikke scrolle. Kan du ikke forklare lidt nærmere hvad linien "scroll.getViewport().add(list, null);" gør?
11. januar 2003 - 19:21
#3
Du skal være opmærksom på, at den kun vil scrolle, hvis der er flere elementer i listen, end der kan vises, ellers vil det ikke være muligt. Et JScrollPane har en wievport, hvorigennem alt indholdet vises, "scroll.getViewport().add(list, null);" ganske enkelt det, at din JList indlejres i denne viewport, så JScrollPane'ts indhold kan ses.
11. januar 2003 - 19:41
#4
Den måde har jeg dog aldrig gjort det på... jeg troede følgende var de facto: import javax.swing.*; import java.awt.event.*; public class Liste extends JFrame{ private JList liste; private JScrollPane scrollPane; private String[] indhold = { "1", "2", "3", "1", "2", "3", "1", "2", "3", "1", "2", "3", "1", "2", "3", "1", "2", "3", "1", "2", "3", "1", "2", "3", "1", "2", "3" }; public Liste() { setTitle("Liste"); setSize(400,400); liste = new JList(indhold); setContentPane(new JScrollPane(liste)); setVisible(true); } } class Test { public static void main(String[] args) { new Liste(); } }
11. januar 2003 - 19:45
#5
Du laver altså bare et JScrollPane objekt med den komponent du vil scrolle i som inputparameter til constructoren. Det vigtige er at du så blot tilføjer JScrollPane objektet til contentPane: JTextArea area = new JTextArea(); JScrollPane scroller = new JScrollPane(area); getContentPane().add(scroller);
11. januar 2003 - 19:47
#6
11. januar 2003 - 20:40
#7
viht >> hvis man gør det på din måde bruger man jo ikke JList, som b_m_p ville og har dermed ikke alle de funktioner JList tilbyder.
11. januar 2003 - 20:42
#8
eller jo, det fik jeg lige øje på. Du har bare indlejret den...
11. januar 2003 - 22:29
#9
Jeg har lige en smule kode her. Den virker ikke, så kunne i ikke lige kikke lidt på den, og fortælle mig hvad der er galt. listePanel.setSize(465, 520); listePanel.setLocation(120, 40); listePanel.setBackground(Color.white); listePanel.setBorder(BorderFactory.createLineBorder(Color.black)); dvdListe = new JList(opdaterListe()); dvdListe.setBounds(5, 5, 455, 700); dvdListe.setFont(font); dvdListe.setSelectionBackground(Color.black); dvdListe.setSelectionForeground(Color.white); dvdListe.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); dvdListeScroll = new JScrollPane(dvdListe, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); listePanel.add(dvdListeScroll); cp.add(listePanel);
11. januar 2003 - 22:32
#10
Det skulle virke hvis du tilføjer nedenstående linie til alle sidst efter 'cp.add(listePanel);' dvdListeScroll.getViewport().add(dvdListe, null);
11. januar 2003 - 22:46
#11
Det virker stadig ikke.
11. januar 2003 - 23:42
#12
Her har jeg tilføjet en liste til et et JPanel som igen er tilføjet contentPane, er det det du søger? import javax.swing.*; import java.awt.*; public class ListeJPanel extends JFrame { private JPanel listePanel; private JList dvdListe; private JScrollPane scroller; private String[] indhold = { "1", "2", "3", "1", "2", "3", "1", "2", "3", "1", "2", "3", "1", "2", "3", "1", "2", "3", "1", "2", "3", "1", "2", "3", "1", "2", "3" }; public ListeJPanel() { super("Liste test"); setSize(400,400); listePanel = new JPanel(new BorderLayout()); listePanel.setBorder(BorderFactory.createEmptyBorder(20,20,20,20)); getContentPane().add(listePanel, BorderLayout.CENTER); dvdListe = new JList(indhold); scroller = new JScrollPane(dvdListe); listePanel.add(scroller, BorderLayout.CENTER); setVisible(true); } } class Test { public static void main(String[] args) { new ListeJPanel(); } }
12. januar 2003 - 00:25
#13
viht> Jeg kan godt få dit lille eksempel til at virke, men jeg kan stadig ikke få mit eget til at virke. Jeg smider lige min kode med, så håber jeg at du kan fortælle mig hvad der er galt. import javax.swing.*; import javax.swing.event.*; import java.awt.*; public class MainGUI extends JFrame { private GlobalModel gm = new GlobalModel(); private JPanel cp = new JPanel(null); private JPanel listePanel; private static final int FRAME_WIDTH = 600; private static final int FRAME_HEIGHT = 600; private static final int FRAME_X_ORIGIN = 100; private static final int FRAME_Y_ORIGIN = 100; private static final int BUTTON_WIDTH = 100; private static final int BUTTON_HEIGHT = 25; private Insets kant = new Insets(1, 1, 1, 1); private Font font = new Font("Courier New", Font.ROMAN_BASELINE, 12); private JButton visDVD; private JButton retDVD; private JButton sletDVD; private JButton hentFraFil; private JButton gemTilFil; private JButton afslut; private JLabel navn; private JLabel betegnelse; private JList dvdListe; private JScrollPane dvdListeScroll; public MainGUI() { //Testdata start gm.opretNyDVD("Ringenes Herre: Eventyret om Ringen"); gm.opretNyDVD("Ringenes Herre: De To Tårne"); gm.opretNyDVD("a05a5"); gm.opretNyDVD("a06a56"); gm.opretNyDVD("a07a567"); gm.opretNyDVD("a08a5678"); gm.opretNyDVD("a09a56789"); gm.opretNyDVD("a10a567890"); gm.opretNyDVD("a11a5678901"); gm.opretNyDVD("a12a56789012"); gm.opretNyDVD("a13a567890123"); gm.opretNyDVD("a14a5678901234"); gm.opretNyDVD("a15a56789012345"); gm.opretNyDVD("a20a5678901234567890"); gm.opretNyDVD("a25a567890123456789012345"); gm.opretNyDVD("a30a56789012345678901234567890"); gm.opretNyDVD("a31a567890123456789012345678901"); gm.opretNyDVD("a32a5678901234567890123456789012"); gm.opretNyDVD("a33a56789012345678901234567890123"); gm.opretNyDVD("a34a567890123456789012345678901234"); gm.opretNyDVD("a35a5678901234567890123456789012345"); gm.opretNyDVD("abc01"); gm.opretNyDVD("abc02"); gm.opretNyDVD("abc03"); gm.opretNyDVD("abc04"); gm.opretNyDVD("abc05"); gm.opretNyDVD("abc06"); gm.opretNyDVD("abc07"); gm.opretNyDVD("abc08"); gm.opretNyDVD("abc09"); gm.opretNyDVD("abc10"); gm.opretNyDVD("abc11"); gm.opretNyDVD("abc12"); gm.opretNyDVD("abc13"); gm.opretNyDVD("abc14"); gm.opretNyDVD("abc15"); gm.opretNyDVD("abc16"); gm.opretNyDVD("abc17"); gm.opretNyDVD("abc18"); gm.opretNyDVD("abc19"); gm.opretNyDVD("abc20"); //Testdata slut setSize(FRAME_WIDTH, FRAME_HEIGHT); setResizable(false); setTitle("DVD kartotek"); setLocation(FRAME_X_ORIGIN, FRAME_Y_ORIGIN); getContentPane().add(cp); cp.setBackground(Color.lightGray); visDVD = new JButton("Vis info"); visDVD.setBounds(10, 40, BUTTON_WIDTH, BUTTON_HEIGHT); visDVD.setFont(font); visDVD.setMargin(kant); cp.add(visDVD); retDVD = new JButton("Ret info"); retDVD.setBounds(10, 70, BUTTON_WIDTH, BUTTON_HEIGHT); retDVD.setFont(font); retDVD.setMargin(kant); cp.add(retDVD); sletDVD = new JButton("Slet DVD"); sletDVD.setBounds(10, 100, BUTTON_WIDTH, BUTTON_HEIGHT); sletDVD.setFont(font); sletDVD.setMargin(kant); cp.add(sletDVD); hentFraFil = new JButton("Hent liste"); hentFraFil.setBounds(10, 150, BUTTON_WIDTH, BUTTON_HEIGHT); hentFraFil.setFont(font); hentFraFil.setMargin(kant); cp.add(hentFraFil); gemTilFil = new JButton("Gem liste"); gemTilFil.setBounds(10, 180, BUTTON_WIDTH, BUTTON_HEIGHT); gemTilFil.setFont(font); gemTilFil.setMargin(kant); cp.add(gemTilFil); afslut = new JButton("Afslut"); afslut.setBounds(10, 535, BUTTON_WIDTH, BUTTON_HEIGHT); afslut.setFont(font); afslut.setMargin(kant); cp.add(afslut); navn = new JLabel("Navn:"); navn.setBounds(120, 10, BUTTON_WIDTH, BUTTON_HEIGHT); navn.setFont(font); navn.setForeground(Color.black); cp.add(navn); betegnelse = new JLabel("Betegnelse:"); betegnelse.setBounds(360, 10, BUTTON_WIDTH, BUTTON_HEIGHT); betegnelse.setFont(font); betegnelse.setForeground(Color.black); cp.add(betegnelse); listePanel = new JPanel(null); listePanel.setBounds(120, 40, 465, 520); listePanel.setBackground(Color.white); listePanel.setBorder(BorderFactory.createLineBorder(Color.black)); cp.add(listePanel, null); dvdListe = new JList(opdaterListe()); //dvdListe.setBounds(5, 5, 455, 510); dvdListe.setFont(font); dvdListe.setSelectionBackground(Color.black); dvdListe.setSelectionForeground(Color.white); dvdListe.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); dvdListeScroll = new JScrollPane(dvdListe);//, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); listePanel.add(dvdListe, null); setDefaultCloseOperation(EXIT_ON_CLOSE); } //public MainGUI private String[] opdaterListe() { String[] dvd = new String[gm.getAntalDVDer()]; for (int i = 0; i < gm.getAntalDVDer(); i++) { String tempNavn = gm.getDVD(i).getNavn(); String tempBeskrivelse = gm.getDVD(i).getBeskrivelse(); if (tempNavn.length() >= 31) { tempNavn = tempNavn.substring(0,28); tempNavn = tempNavn + "... "; } if (tempNavn.length() < 31) { while (tempNavn.length() <= 31) { tempNavn = tempNavn + " "; } } dvd[i] = tempNavn + tempBeskrivelse; } return dvd; } //private void opdaterListe } //public class MainGUI
12. januar 2003 - 08:34
#14
Jeg har fået dit eksemepel til at virke nu. Jeg ændrede listens indhold til det fra mit foregående eksempel i det jeg ikke har klassen GlobalModel som du bruger til det. Det bør dog ikke gøre nogen forskel. Jeg har ændret et par layouts og ændret lidt i nogle inputværdier, ikke det store. Skriv endelig igen hvis der er noget af det du ikke forstår. import javax.swing.*; import javax.swing.event.*; import java.awt.*; public class MainGUI extends JFrame { // private GlobalModel gm = new GlobalModel(); private JPanel cp; private JPanel listePanel; private static final int FRAME_WIDTH = 600; private static final int FRAME_HEIGHT = 600; private static final int FRAME_X_ORIGIN = 100; private static final int FRAME_Y_ORIGIN = 100; private static final int BUTTON_WIDTH = 100; private static final int BUTTON_HEIGHT = 25; private Insets kant = new Insets(1, 1, 1, 1); private Font font = new Font("Courier New", Font.ROMAN_BASELINE, 12); private JButton visDVD; private JButton retDVD; private JButton sletDVD; private JButton hentFraFil; private JButton gemTilFil; private JButton afslut; private JLabel navn; private JLabel betegnelse; private JList dvdListe; private JScrollPane dvdListeScroll; public MainGUI() { //Testdata start /* gm.opretNyDVD("Ringenes Herre: Eventyret om Ringen"); gm.opretNyDVD("Ringenes Herre: De To Tårne"); gm.opretNyDVD("a05a5"); gm.opretNyDVD("a06a56"); gm.opretNyDVD("a07a567"); gm.opretNyDVD("a08a5678"); gm.opretNyDVD("a09a56789"); gm.opretNyDVD("a10a567890"); gm.opretNyDVD("a11a5678901"); gm.opretNyDVD("a12a56789012"); gm.opretNyDVD("a13a567890123"); gm.opretNyDVD("a14a5678901234"); gm.opretNyDVD("a15a56789012345"); gm.opretNyDVD("a20a5678901234567890"); gm.opretNyDVD("a25a567890123456789012345"); gm.opretNyDVD("a30a56789012345678901234567890"); gm.opretNyDVD("a31a567890123456789012345678901"); gm.opretNyDVD("a32a5678901234567890123456789012"); gm.opretNyDVD("a33a56789012345678901234567890123"); gm.opretNyDVD("a34a567890123456789012345678901234"); gm.opretNyDVD("a35a5678901234567890123456789012345"); gm.opretNyDVD("abc01"); gm.opretNyDVD("abc02"); gm.opretNyDVD("abc03"); gm.opretNyDVD("abc04"); gm.opretNyDVD("abc05"); gm.opretNyDVD("abc06"); gm.opretNyDVD("abc07"); gm.opretNyDVD("abc08"); gm.opretNyDVD("abc09"); gm.opretNyDVD("abc10"); gm.opretNyDVD("abc11"); gm.opretNyDVD("abc12"); gm.opretNyDVD("abc13"); gm.opretNyDVD("abc14"); gm.opretNyDVD("abc15"); gm.opretNyDVD("abc16"); gm.opretNyDVD("abc17"); gm.opretNyDVD("abc18"); gm.opretNyDVD("abc19"); gm.opretNyDVD("abc20"); */ //Testdata slut setSize(FRAME_WIDTH, FRAME_HEIGHT); setResizable(false); setTitle("DVD kartotek"); setLocation(FRAME_X_ORIGIN, FRAME_Y_ORIGIN); cp = new JPanel(); cp.setLayout(null); getContentPane().add(cp); cp.setBackground(Color.lightGray); visDVD = new JButton("Vis info"); visDVD.setBounds(10, 40, BUTTON_WIDTH, BUTTON_HEIGHT); visDVD.setFont(font); visDVD.setMargin(kant); cp.add(visDVD); retDVD = new JButton("Ret info"); retDVD.setBounds(10, 70, BUTTON_WIDTH, BUTTON_HEIGHT); retDVD.setFont(font); retDVD.setMargin(kant); cp.add(retDVD); sletDVD = new JButton("Slet DVD"); sletDVD.setBounds(10, 100, BUTTON_WIDTH, BUTTON_HEIGHT); sletDVD.setFont(font); sletDVD.setMargin(kant); cp.add(sletDVD); hentFraFil = new JButton("Hent liste"); hentFraFil.setBounds(10, 150, BUTTON_WIDTH, BUTTON_HEIGHT); hentFraFil.setFont(font); hentFraFil.setMargin(kant); cp.add(hentFraFil); gemTilFil = new JButton("Gem liste"); gemTilFil.setBounds(10, 180, BUTTON_WIDTH, BUTTON_HEIGHT); gemTilFil.setFont(font); gemTilFil.setMargin(kant); cp.add(gemTilFil); afslut = new JButton("Afslut"); afslut.setBounds(10, 535, BUTTON_WIDTH, BUTTON_HEIGHT); afslut.setFont(font); afslut.setMargin(kant); cp.add(afslut); navn = new JLabel("Navn:"); navn.setBounds(120, 10, BUTTON_WIDTH, BUTTON_HEIGHT); navn.setFont(font); navn.setForeground(Color.black); cp.add(navn); betegnelse = new JLabel("Betegnelse:"); betegnelse.setBounds(360, 10, BUTTON_WIDTH, BUTTON_HEIGHT); betegnelse.setFont(font); betegnelse.setForeground(Color.black); cp.add(betegnelse); listePanel = new JPanel(new BorderLayout()); listePanel.setBounds(120, 40, 465, 520); listePanel.setBackground(Color.white); cp.add(listePanel); // dvdListe = new JList(opdaterListe()); dvdListe = new JList(new String[] { "1","2","3", "1","2","3", "1","2","3", "1","2","3", "1","2","3", "1","2","3", "1","2","3", "1","2","3", "1","2","3", "1","2","3", "1","2","3", "1","2","3", "1","2","3", "1","2","3", "1","2","3", "1","2","3", "1","2","3", "1","2","3", "1","2","3", "1","2","3", "1","2","3", "1","2","3", "1","2","3", "1","2","3", "1","2","3", } ); // ----- dvdListe.setFont(font); dvdListe.setSelectionBackground(Color.black); dvdListe.setSelectionForeground(Color.white); dvdListe.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); dvdListeScroll = new JScrollPane(dvdListe);//, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); listePanel.add(dvdListeScroll, BorderLayout.CENTER); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } /* private String[] opdaterListe() { String[] dvd = new String[gm.getAntalDVDer()]; for (int i = 0; i < gm.getAntalDVDer(); i++) { String tempNavn = gm.getDVD(i).getNavn(); String tempBeskrivelse = gm.getDVD(i).getBeskrivelse(); if (tempNavn.length() >= 31) { tempNavn = tempNavn.substring(0,28); tempNavn = tempNavn + "... "; } if (tempNavn.length() < 31) { while (tempNavn.length() <= 31) { tempNavn = tempNavn + " "; } } dvd[i] = tempNavn + tempBeskrivelse; } return dvd; } //private void opdaterListe */ } //public class MainGUI class Test { public static void main(String[] args) { MainGUI mg = new MainGUI(); mg.show(); } }
12. januar 2003 - 18:28
#15
Nu virker det. Mange tak for hjælpen.
12. januar 2003 - 23:07
#16
Det var så lidt.
Kurser inden for grundlæggende programmering