Avatar billede backupmand Nybegynder
18. december 2003 - 16:28 Der er 22 kommentarer og
1 løsning

JPanel vil ikke opdateres med nye data

Er der nogle, der kender til dette problem?

1) Jeg har et JPanel placeret i min frame,
idette JPanel kommer en gruppe af checkboxes til syne,
som er placeret i et GridLayout. Ved siden af disse
checkboxes er der bare JLabels med text
2) Ved tryk på externe knap skiftes antal checkboxes og teksten skiftes også, men

anden gang det sker ser det ikke pænt ud. Når man hakker af i en checkbox, kommer de forrige data frem og man kan slet ikke hakke af i de nye checkboxes...

Min checkbox / JLabel klasse er bare en custom klase, der arver fra JPanel. Dette JPanel smides ind i en JScrollPane, der så tilføres hovedframen. Den ser således ud:

class CustomCheckBoxClass extends JPanel
    {
        JCheckBox manyboxes[];
        JLabel labels[];
        Vector row2data;
        GridLayout aLayout;
       
        CustomCheckBoxClass(Vector r2)
        {
        this.removeAll();
        this.row2data=r2;
        aLayout=null;
        aLayout=new GridLayout(r2.size(),1,2,2);
        this.setLayout(aLayout);       
        manyboxes=null;
        labels=null;
        manyboxes=new JCheckBox[row2data.size()];
        labels=new JLabel[row2data.size()];
       
        for (int i=0;i<row2data.size();i++)
            {
            manyboxes[i]=new JCheckBox();
            labels[i]=new JLabel((row2data.get(i)).toString());
            }
       
        for (int i=0;i<row2data.size();i++)
            {add(manyboxes[i]);
              add(labels[i]);
            }
       
        paintImmediately(440,120,170,220);

           
        }       
       
    }

----------------------------------------------------

Som man kan se, er den data der skal renderes overført som parameter til min custom klasse.

Der hvor der laves en instans af klassen, ser det således ud:

cbc=new CustomCheckBoxClass(row2data);
accessorytablepane=new JScrollPane(cbc);              accessorytablepane.setBounds(440,120,170,220);   
under1.add(accessorytablepane);                 

Som man kan se, forsøger jeg at bruge paintImmediately() for at få refreshet data i min JPanel
Avatar billede _carsten Nybegynder
18. december 2003 - 16:46 #1
Det kan kun være fordi du med de externe knapper tilføjer CustomCheckBoxClass igen og igen og igen

du remove gammel panel inden du tilføjer nyt

Som din CustomCheckBoxClass er nu den brugbar, har dog tilladt mig at rediere lidt i den, og fjernet det som er unødvendigt


class CustomCheckBoxClass extends JPanel {
    private JCheckBox manyboxes[];
    private JLabel labels[];
    private Vector row2data;
       
    CustomCheckBoxClass(Vector r2){
        this.row2data=r2;
        setLayout(new GridLayout(r2.size(),1,2,2));
        manyboxes=new JCheckBox[row2data.size()];
        labels=new JLabel[row2data.size()];
       
        for (int i=0;i<row2data.size();i++){
            manyboxes[i]=new JCheckBox();
            labels[i]=new JLabel((row2data.get(i)).toString());
            add(manyboxes[i]);
            add(labels[i]);
        }     
    }       
}
Avatar billede _carsten Nybegynder
18. december 2003 - 16:50 #2
Håber det er til at læse, selv om der mangler et ord hist og her
Avatar billede agrezz Nybegynder
18. december 2003 - 17:19 #3
rapaint();

:D
Avatar billede agrezz Nybegynder
18. december 2003 - 17:20 #4
repaint();

:D
Avatar billede labanos Nybegynder
19. december 2003 - 08:22 #5
hvis du har nogle rendering problemer, så prøve med:
        Runnable updateAComponent = new Runnable() {
            public void run() {
                repaint();
            }
        };
        SwingUtilities.invokeLater(updateAComponent);

Ovenstående, altså efter du har lavet de ændringer du vil. Ved ik hvordan din update kommer, om det er fra en tråd du selv har lavet?
Avatar billede labanos Nybegynder
19. december 2003 - 08:22 #6
prøv med even
Avatar billede backupmand Nybegynder
19. december 2003 - 15:53 #7
vender lige tilbage om et par minutter
Avatar billede backupmand Nybegynder
19. december 2003 - 16:37 #8
Ok bruger nu din klasse, Carsten. Det er godt det samme, de gamle værdier er stadig til syne. De gamle værdier er også stadig til syne, selvom jeg remover mit JPanel (dvs min custom klasse) og selvom jeg repainter() efter scrollpane er tilføjet panelet eller efter jeg tilfører repaint() som det sidste i min Custom klasse
Avatar billede backupmand Nybegynder
19. december 2003 - 16:38 #9
Nej der bruges ikke tråde, i øvrigt
Avatar billede _carsten Nybegynder
19. december 2003 - 16:43 #10
Skifter du et panel i et panel ???

Altså noget a la

MainPanel.add(panel_1);
MainPanel.remove(panel_1);
MainPanel.add(panel_2);
Avatar billede _carsten Nybegynder
19. december 2003 - 19:22 #11
Jeg kan ikke lige gennemskue hvad du gør, normalt virker det at remove og adde, men det du skal bruge, er et CardLayout - eneste rigtige løsningen på det jeg tror du sidder og tumler med.
Nedenstående er et eksempel på CardLayout og BorderLayout, panelet i venstre side bruger et Cardlayout med 3 JPanel's i, højre side er bare ét JPanel, du skifter panelerne i venstre side med menuen.

Gem nedenstående fil som TestCardLayout, kompiler og kør.



import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class TestCardLayout extends JFrame{
   
    public TestCardLayout() {
        initComponents();
        setSize(500,500);
    }
   
    private void initComponents(){
        panelWest = new JPanel();
        panelEast = new JPanel();
        panel2 = new Panel2();
        panel3 = new Panel3();
        panel4 = new Panel4();
       
        menuBar = new JMenuBar();
        menu = new JMenu();
        item2 = new JMenuItem();
        item3 = new JMenuItem();
        item4 = new JMenuItem();
       
        panelWest.setLayout(new CardLayout());
        panelWest.setPreferredSize(new Dimension(250,500));
       
        panelEast.setBackground(new java.awt.Color(255,255,0));
        panelEast.setPreferredSize(new Dimension(250,500));
       
        panel2.setBackground(new Color(0,102,255));
        panel3.setBackground(new Color(255,0,50));
        panel4.setBackground(new Color(50,150,0));
       
        panelWest.add(panel2, "panelA");
        panelWest.add(panel3, "panelB");
        panelWest.add(panel4, "panelC");
       
        menu.setText("Menu");
       
        item2.setText("Vis blåt JPanel");
        item2.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent evt){
                menuTakeAction(evt);
            }
        });
        item3.setText("Vis rødt JPanel");
        item3.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent evt){
                menuTakeAction(evt);
            }
        });
        item4.setText("Vis grønt JPanel");
        item4.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent evt){
                menuTakeAction(evt);
            }
        });
       
        menu.add(item2);
        menu.add(item3);
        menu.add(item4);
       
        menuBar.add(menu);
       
        setJMenuBar(menuBar);
       
        getContentPane().add(panelWest, BorderLayout.WEST);
        getContentPane().add(panelEast, BorderLayout.EAST);
       
        addWindowListener(new java.awt.event.WindowAdapter() {
            public void windowClosing(java.awt.event.WindowEvent evt) {
                System.exit(0);
            }
        });
       
        pack();
    }
   
    private void menuTakeAction(ActionEvent evt){
        CardLayout cl = (CardLayout) panelWest.getLayout();

        if(evt.getSource().equals(item2)){
            cl.show(panelWest, "panelA");
        }
        else if(evt.getSource().equals(item3)){
            cl.show(panelWest, "panelB");
        }
        else if(evt.getSource().equals(item4)){
            cl.show(panelWest, "panelC");
        }
    }
   
    public static void main(String[] args) {
        new TestCardLayout().show();
    }
   
    private JPanel panelWest, panelEast;
    private Panel2 panel2;
    private Panel3 panel3;
    private Panel4 panel4;
    private JMenuBar menuBar;
    private JMenu menu;
    private JMenuItem item2, item3, item4;
}


class Panel2 extends JPanel{
    public Panel2(){
        setBackground(new Color(0,102,255));
    }
}

class Panel3 extends JPanel{
    public Panel3(){
        setBackground(new Color(255,0,50));
    }
}

class Panel4 extends JPanel{
    public Panel4(){
        setBackground(new Color(50,150,0));
    }
}
Avatar billede backupmand Nybegynder
20. december 2003 - 01:16 #12
Jeg kender godt cardlayout, du har lige givet mig noget mere inspiration.
Jeg må lige vende tilbage...
Avatar billede _carsten Nybegynder
22. december 2003 - 10:23 #13
Har du fået det til at virke ??
Avatar billede backupmand Nybegynder
22. december 2003 - 13:57 #14
øjeblik ....
Avatar billede backupmand Nybegynder
22. december 2003 - 20:11 #15
Problemet er, at jeg aldrig kender antallet af JPanels
Avatar billede _carsten Nybegynder
22. december 2003 - 20:38 #16
Det må der være en løsning på.
Kan du forklare hvad det er du skal lave ???
Avatar billede backupmand Nybegynder
22. december 2003 - 21:00 #17
Jeg skal opdatere et JPanel med et antal checkboxes og det samme antal JLabels for hver gang der trykkes på en ekstern knap. Jeg kender ikke antallet af gange dette sker. Det er for kompliceret at forklare, hvorfor jeg ikke kender antallet af gange det sker.
Avatar billede _carsten Nybegynder
22. december 2003 - 21:06 #18
Ok - prøver lige at lave et eller andet.........
Avatar billede backupmand Nybegynder
22. december 2003 - 21:10 #19
Jeg er code blinded og behøver inspiration, så jegh er dig meget taknemmelig!
Avatar billede _carsten Nybegynder
22. december 2003 - 21:30 #20
Prøv lige den her, det tager faktisk ikke lang tid at tilføje 1000 JCheckBox's
Og så er vi nok der henne hvor jeg får svært ved at hjælpe dig yderligere

import javax.swing.*;
import java.awt.*;
public class JFrame_2 extends javax.swing.JFrame {

    public JFrame_2() {
        initComponents();
        setSize(500, 500);
    }

    private void initComponents() {
        jPanel1 = new javax.swing.JPanel();
        jButton1 = new javax.swing.JButton();
        jPanel2 = new javax.swing.JPanel();

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

        jButton1.setText("Tryk p\u00e5 knappen og skriv hvor mange der skal tilf\u00f8jes");
        jButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                addBoxes(evt);
            }
        });

        jPanel1.add(jButton1);

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

        jPanel2.setLayout(new java.awt.FlowLayout(java.awt.FlowLayout.LEFT));

        jPanel2.setBackground(new java.awt.Color(153, 153, 255));
        getContentPane().add(jPanel2, java.awt.BorderLayout.CENTER);

        pack();
    }

    private void addBoxes(java.awt.event.ActionEvent evt) {
        String s = JOptionPane.showInputDialog(this, "Skriv antallet af CheckBoxes du vil have");
        try{
            int i = Integer.parseInt(s);
            checkBox = new JCheckBox[i];
            nowAddBoxes();
        }
        catch(NumberFormatException nf){
            JOptionPane.showMessageDialog(this, "Du må kun skrive tal !!",
                                            "Besked",
                                          JOptionPane.ERROR_MESSAGE);
        }
    }
   
    private void nowAddBoxes(){
        java.awt.Component[] comp = jPanel2.getComponents();
       
        for(int i = 0; i < comp.length; i++){
            jPanel2.remove(comp[i]);
        }

        for(int i = 0; i < checkBox.length; i++){
            checkBox[i] = new JCheckBox();
            jPanel2.add(checkBox[i]);
        }
        jPanel2.revalidate();
        jPanel2.repaint();
    }

    private void exitForm(java.awt.event.WindowEvent evt) {
        System.exit(0);
    }
   
    public static void main(String args[]) {
        new JFrame_2().show();
    }
   
    private javax.swing.JButton jButton1;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JPanel jPanel2;
    private JCheckBox[] checkBox;
}
Avatar billede backupmand Nybegynder
22. december 2003 - 21:45 #21
Jeg synes du har gjort nok for nu, så jeg giver dig lige de her point. Det kan dog være, at jeg vender tilbage senere med nogle spørgsmål.
Avatar billede backupmand Nybegynder
23. december 2003 - 22:00 #22
Der er en sten i skoen, når jeg placerer det i en JScrollPane
Avatar billede backupmand Nybegynder
23. december 2003 - 23:14 #23
ah vent lidt det problem har jeg nu løst
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