Avatar billede banielsen Nybegynder
30. januar 2005 - 19:30 Der er 7 kommentarer og
1 løsning

flere JLabel end der er plads til på skærmen

Hej eksperter

Jeg er ved at lave et program hvor der vertikalt skal være flere JLabel's end der kan være på skærmen.
Hvordan kan jeg lave dette??

Forslag: Et JPanel med Jscroolpane(?), men hvordan laver man så det?

På forhånd tak
Avatar billede arne_v Ekspert
30. januar 2005 - 19:38 #1
Prøv noget a la:

JPanel p = new JPanel();
p.add(new JLabel("..."));
...
p.add(new JLabel("..."));
getContentPane().add(new JScrollPane(p));
Avatar billede arne_v Ekspert
30. januar 2005 - 19:38 #2
Du skal lige selv tilføje evt. argumenter til add p.g.a. layout managers.
Avatar billede _carsten Nybegynder
30. januar 2005 - 19:43 #3
Køreklart eksempel


import javax.swing.*;

public class TestLabels extends javax.swing.JFrame {
    public TestLabels() {
        initComponents();
        setSize(200,600);
    }

    private void initComponents() {
        jScrollPane1 = new javax.swing.JScrollPane();
        manyLabels1 = new ManyLabels();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        jScrollPane1.setViewportView(manyLabels1);

        getContentPane().add(jScrollPane1, java.awt.BorderLayout.CENTER);

        pack();
    }

    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new TestLabels().setVisible(true);
            }
        });
    }

    private javax.swing.JScrollPane jScrollPane1;
    private ManyLabels manyLabels1;
}



class ManyLabels extends javax.swing.JPanel {
    public ManyLabels() {
        initComponents();
    }
   
    private void initComponents() {
        setLayout(new java.awt.GridLayout(100, 1));

        for(int i = 0; i < 100; i++){
            add(new JLabel("Label nr.: " + i));
        }
    }
}
Avatar billede banielsen Nybegynder
30. januar 2005 - 22:02 #4
Perfekt eksempel Carsten - tak!!

Jeg har lige et tillægsspørgsmål :-)

Jeg har sat og forsøgt på at få JPanellet opdateret dynamisk med en knap.

Jeg har tilføjet:
*****
public void addLabel()
{
    add(new JLabel("Label nr.: " + 101));
}
*****
i ManyLabels-klassen

og så en ActionLIstener til en knap:
*****
class AddListener implements ActionListener  //ved klik på Opret-knappen
    {
        public void actionPerformed(ActionEvent e)
        {
            manyLabels1.addLabel();
        }
    }
*****

ActionListener er tilføjet til knappen og jeg har forsøgt at fyre en "repaint" efter, men jeg kan ikke rigtig få det til at spille
Avatar billede _carsten Nybegynder
30. januar 2005 - 22:17 #5
Det er fordi jeg bruger GridLayout, tilføj følgende metode til ManyLabels
HUSK import java.awt.*; i ManyLabels !!!!

    public void addLabel(){
        GridLayout lay = (GridLayout)getLayout();
        int rows = lay.getRows();
        lay.setRows(rows + 1);
        add(new JLabel("Label nr.: " + (rows + 1) ));
        validate();
    }


Herefter tilføjer du knappen i TestLabels, så TestLabels kommer til at se sådan ud:


public class TestLabels extends javax.swing.JFrame {
    public TestLabels() {
        initComponents();
        setSize(200,600);
    }
   
    private void initComponents() {
        jScrollPane1 = new javax.swing.JScrollPane();
        manyLabels1 = new ManyLabels();
        jButton1 = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        jScrollPane1.setViewportView(manyLabels1);

        getContentPane().add(jScrollPane1, java.awt.BorderLayout.CENTER);

        jButton1.setText("Add new label to JPanel");
        jButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                addLabel(evt);
            }
        });

        getContentPane().add(jButton1, java.awt.BorderLayout.NORTH);

        pack();
    }

    private void addLabel(java.awt.event.ActionEvent evt) {
        manyLabels1.addLabel();
    }

    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new TestLabels().setVisible(true);
            }
        });
    }

    private javax.swing.JButton jButton1;
    private javax.swing.JScrollPane jScrollPane1;
    private ManyLabels manyLabels1;
}
Avatar billede banielsen Nybegynder
31. januar 2005 - 13:06 #6
Det virker fint, men hvorfor bliver der tilføjet ca. 10 nye "rækker" til gridlayoutet nogle gange. F.eks. den første gang man trykker på knappen?
(ikke noget som jeg ikke kan leve med - blot nysgerrig :-))
Avatar billede _carsten Nybegynder
31. januar 2005 - 14:28 #7
Der bliver kun tilføjet én række for hver gang knappen aktiveres.

Skyldes min fejlplacering af validate()

    private void addLabel(java.awt.event.ActionEvent evt) {
        manyLabels1.addLabel();
        validate();  // Her skal den være !!
    }

Og fjern derefter validate() fra metoden addLabel i ManyLabels - den er unødvendig.

Og et svar.
Avatar billede banielsen Nybegynder
31. januar 2005 - 14:31 #8
perfekt :-)
takker
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