Avatar billede ullesan Nybegynder
13. september 2004 - 20:24 Der er 9 kommentarer og
1 løsning

scroll jpanels med jscrollpane

Hey

Med det program jeg er igang med pt, kan jeg generere jpanels med en fast størrelse. Disse panels vil jeg gerne smide ind i en jscollpane, så jeg kan scrolle op og ned afhængig hvilke paneler jeg vil se.

Mit problem ligger i at når jeg smider jpanels ind i en scrollpane, så fylder jpanelet hele scrollpanen og det er den sidst tilføjede som man ser - i sidste ende er det jeg gerne vil opnå er ligesom med en listbox, hvor tekst ligger under hinanden, men hvor det i mit tilfælde skal være paneler

så spørgsmålet lyder, hvad skal der til for at jeg kan opnå det ønskede
Avatar billede _carsten Nybegynder
13. september 2004 - 20:43 #1
Kan du ikke bare putte en tabel i dit scrollpane og så bruge et JPanel som cellRenderer  ??
Avatar billede ullesan Nybegynder
13. september 2004 - 20:49 #2
det kunne tænkes... undersøger det lige
Avatar billede _carsten Nybegynder
13. september 2004 - 20:50 #3
Et eksempel

public class EX extends javax.swing.JFrame {
   
    public EX() {
        initComponents();
        setSize(300,200);
    }
   
    private void initComponents() {
        jPanel1 = new javax.swing.JPanel();
        scroll = new javax.swing.JScrollPane();
        table = new javax.swing.JTable();

        addWindowListener(new java.awt.event.WindowAdapter() {
            public void windowClosing(java.awt.event.WindowEvent evt) {
                exitForm(evt);
            }
        });

        jPanel1.setLayout(new java.awt.BorderLayout());

        table.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {
                {null},
                {null},
                {null},
                {null},
                {null},
                {null},
                {null},
                {null},
                {null},
                {null},
                {null},
                {null}
            },
            new String [] {
                "Title 1"
            }
        ));
        TableColumn col = table.getColumnModel().getColumn(0);
        col.setCellRenderer(new MyPanel());
 
        scroll.setViewportView(table);

        jPanel1.add(scroll, java.awt.BorderLayout.CENTER);

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

        pack();
    }
   
    private void exitForm(java.awt.event.WindowEvent evt) {
        System.exit(0);
    }
   
    public static void main(String args[]) {
        new EX().show();
    }
   
    private javax.swing.JPanel jPanel1;
    private javax.swing.JScrollPane scroll;
    private javax.swing.JTable table;
}


class MyPanel extends JPanel implements TableCellRenderer{
    public MyPanel() {
    }
   
    public Component getTableCellRendererComponent(JTable table,
            Object value, boolean isSelected, boolean hasFocus,
            int row, int column) {
               
        if(row % 2 == 0)
            setBackground(Color.blue);
        else
            setBackground(Color.yellow);
        return this;
    }   
}
Avatar billede ullesan Nybegynder
13. september 2004 - 20:55 #4
hmm, okay... det var da en boost på vej mod en færdig løsning... det kigger jeg lige på
Avatar billede _carsten Nybegynder
13. september 2004 - 20:58 #5
Så smider jeg et svar imens.
Avatar billede ullesan Nybegynder
13. september 2004 - 21:17 #6
det er nu meget fint.. jeg har fået den til at vise panelet, men det der så er ulempen nu er at jeg ikke kan benytte de elemter som jeg nu engang os har på de enkelte paneler (knapper, tekstfelter, det glemte jeg vidst at skrive til at starte med) - de er "inaktive", så jeg kan ikke skrive i tekstfelterne eller trykke på knapperne :(

kan der rettes op på det eller skal jeg til at søge andre løsninger?
Avatar billede _carsten Nybegynder
13. september 2004 - 21:31 #7
Du udvider bare med en klasse som implementerer TableCellEditor, eller gør som jeg har gjort her - roder det hele sammen i en klasse (MyPanel) (hvilket ikke er det smarteste ) jeg har dog gjort det her.

Eksempel:

import java.awt.Color;
import java.awt.Component;
import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.table.TableCellEditor;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumn;


public class EX extends javax.swing.JFrame {

    public EX() {
        initComponents();
        setSize(300,200);
    }
   
    private void initComponents() {
        jPanel1 = new javax.swing.JPanel();
        scroll = new javax.swing.JScrollPane();
        table = new javax.swing.JTable();

        addWindowListener(new java.awt.event.WindowAdapter() {
            public void windowClosing(java.awt.event.WindowEvent evt) {
                exitForm(evt);
            }
        });

        jPanel1.setLayout(new java.awt.BorderLayout());

        table.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {
                {null},
                {null},
                {null},
                {null},
                {null},
                {null},
                {null},
                {null},
                {null},
                {null},
                {null},
                {null}
            },
            new String [] {
                "Title 1"
            }
        ));
        TableColumn col = table.getColumnModel().getColumn(0);
        col.setCellRenderer(new MyPanel());
        col.setCellEditor(new MyPanel());

        table.setRowHeight(40);
        scroll.setViewportView(table);

        jPanel1.add(scroll, java.awt.BorderLayout.CENTER);

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

        pack();
    }

    private void exitForm(java.awt.event.WindowEvent evt) {
        System.exit(0);
    }

    public static void main(String args[]) {
        new EX().show();
    }

    private javax.swing.JPanel jPanel1;
    private javax.swing.JScrollPane scroll;
    private javax.swing.JTable table;
}



class MyPanel extends JPanel implements TableCellRenderer, TableCellEditor{

    public MyPanel() {
        add(new JButton("Tryk"));
        add(new JTextField(15));
    }
   
    public Component getTableCellRendererComponent(JTable table,
            Object value, boolean isSelected, boolean hasFocus,
            int row, int column) {
               
        if(row % 2 == 0)
            setBackground(Color.blue);
        else
            setBackground(Color.yellow);
        return this;
    }
   
    public void addCellEditorListener(javax.swing.event.CellEditorListener l) {
    }
   
    public void cancelCellEditing() {
    }
   
    public Object getCellEditorValue() {
        return null;
    }
   
    public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
        return this;
    }
   
    public boolean isCellEditable(java.util.EventObject anEvent) {
        return true;
    }
   
    public void removeCellEditorListener(javax.swing.event.CellEditorListener l) {
    }
   
    public boolean shouldSelectCell(java.util.EventObject anEvent) {
        return true;
    }
   
    public boolean stopCellEditing() {
        return true;
    } 
}
Avatar billede _carsten Nybegynder
13. september 2004 - 21:37 #8
En celle i en tabel 'bruger' 2 objekter, et til at vise data og et til at redigere data.

Default renderer i en tabel en JLabel og editoren et JTextField

Du kan lave dine egne klasser som bare skal extende en komponent og implementere TableCellRenderer/TableCellEditor
Avatar billede _carsten Nybegynder
14. september 2004 - 07:53 #9
Hvis du har adskillige tekstfelter i de paneler, kommer du meget hurtigt ud i noget rigtigt rod, da du skal bruge et array eller lignende til at gemme værdierne som disse felter indeholder. Jeg ville nok vende rundt om se om ikke CardLayout er mere den løsning som du har behov for.
Prøv at kigge på min kommentar her: http://eksperten.dk/spm/476419, 13/03-2004 09:33:25
Avatar billede ullesan Nybegynder
16. september 2004 - 14:15 #10
hmm... æv, det var vel ikke så nemt endda... men pyt skidt, det var ikke noget der behøvede at blive lavet, så ideen er pt lagt på køl

Ellers tak for hjælpen
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