Avatar billede brianmp Nybegynder
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
Avatar billede dsj Nybegynder
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.
Avatar billede brianmp Nybegynder
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?
Avatar billede dsj Nybegynder
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.
Avatar billede viht Nybegynder
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();
   
    }
}
Avatar billede viht Nybegynder
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);
Avatar billede viht Nybegynder
11. januar 2003 - 19:47 #6
Avatar billede dsj Nybegynder
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.
Avatar billede dsj Nybegynder
11. januar 2003 - 20:42 #8
eller jo, det fik jeg lige øje på. Du har bare indlejret den...
Avatar billede brianmp Nybegynder
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);
Avatar billede dsj Nybegynder
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);
Avatar billede brianmp Nybegynder
11. januar 2003 - 22:46 #11
Det virker stadig ikke.
Avatar billede viht Nybegynder
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();
    }
}
Avatar billede brianmp Nybegynder
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
Avatar billede viht Nybegynder
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();
    }
   
}
Avatar billede brianmp Nybegynder
12. januar 2003 - 18:28 #15
Nu virker det. Mange tak for hjælpen.
Avatar billede viht Nybegynder
12. januar 2003 - 23:07 #16
Det var så lidt.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester