Avatar billede jgthb Nybegynder
28. december 2008 - 20:44 Der er 10 kommentarer og
1 løsning

JPanel disable enable

Hej

Jeg har et JPanel indeholdende nogle JButtons, og jeg vil gerne disable alle disse knapper. Jeg har så prøvet at disable panelet, som indeholder dem, men knappernes actionevents udføres stadig. Bliver jeg virkelig nødt til at disable hver enkelte knap, eller gør jeg noget forkert?

Mvh
Jonathan
Avatar billede arne_v Ekspert
28. december 2008 - 21:28 #1
Er det et problem at disable alle buttons individuelt ?
Avatar billede jgthb Nybegynder
28. december 2008 - 21:46 #2
nej. men det er besværligt sammenlignet med at disable en enkelt ting.

altså det jeg ønsker, er at man ikke kan trykke på knapperne og evt. at de bliver lysegrå for at vise, at man ikke kan. men jeg håbede på, at man bare kunne disable panelet, og alle dens underobjekter (eller hvad man nu kan kalde det) så automatisk også var disablet. problemet er så bare, at dette ikke sker, når jeg disabler panelet
Avatar billede arne_v Ekspert
28. december 2008 - 21:59 #3
Docs er ret klar:

http://java.sun.com/javase/6/docs/api/javax/swing/JComponent.html#setEnabled(boolean)

Note: Disabling a component does not disable its children.
Avatar billede arne_v Ekspert
28. december 2008 - 22:00 #4
Men det må være nemt at lave en lille utility metode som disabler en component *og* alle
sub components.
Avatar billede arne_v Ekspert
28. december 2008 - 22:15 #5
Noget hurtigt bixet kode:

import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Container;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class SuperEnableDisable extends JFrame implements ActionListener {
    private JPanel real;
    public SuperEnableDisable() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setTitle("Demo");
        getContentPane().setLayout(new BorderLayout());
        JButton toggle = new JButton("Toogle");
        toggle.addActionListener(this);
        getContentPane().add(toggle, BorderLayout.SOUTH);
        real = new JPanel();
        real.setLayout(new GridLayout(1, 2));
        JPanel real1 = new JPanel();
        real1.setLayout(new GridLayout(2, 1));
        real1.add(new JButton("A"));
        real1.add(new JButton("B"));
        real.add(real1);
        JPanel real2 = new JPanel();
        real2.setLayout(new GridLayout(2, 1));
        real2.add(new JButton("C"));
        real2.add(new JButton("D"));
        real.add(real2);
        getContentPane().add(real, BorderLayout.CENTER);
        pack();
    }
    @Override
    public void actionPerformed(ActionEvent e) {
        setRecursiveEnabled(real, !real.isEnabled());
    }
    private void setRecursiveEnabled(Component c, boolean status) {
        c.setEnabled(status);
        if(c instanceof Container) {
            Container c2 = (Container)c;
            for(Component sc2 : c2.getComponents()) {
                setRecursiveEnabled(sc2, status);
            }
        }
    }
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                JFrame f = new SuperEnableDisable();
                f.setVisible(true);
            }
        });
    }
}
Avatar billede jgthb Nybegynder
28. december 2008 - 22:17 #6
ja, det har du formentlig ret i. jeg kigger på det og vender tilbage
Avatar billede jgthb Nybegynder
28. december 2008 - 22:32 #7
havde ikke set, du havde skrevet kode. så kigger jeg på det også
Avatar billede jgthb Nybegynder
28. december 2008 - 22:52 #8
smukt!

Tusind tak. jeg fattede ikke helt pointen med "actionPerformed(ActionEvent e)" og har heller ikke brugt metoden, men "setRecursiveEnabled(Component c, boolean status)" er simpelthen en dejlig metode.

Jeg forstår dog ikke linjen:

Container c2 = (Container)c;

Hvad betyder det, at Container står i parentes før c (jeg går ud fra, at der laves en kopi, men er det rigtigt?)

Men ellers skal du være meget velkommen til at lægge et svar
Avatar billede arne_v Ekspert
28. december 2008 - 22:55 #9
Jeg har en actionPerformed fordi jeg har lavet en button som toggler de 4 andre buttons
mellem visible og ikke visible.
Avatar billede arne_v Ekspert
28. december 2008 - 22:59 #10
if(c instanceof Container) {
  Container c2 = (Container)c;

betyder at hvis Component c er en Container (som kan idneholde andre Component's), så
caster vi til en Container

Container er en sub klasse af Component

metoden getComponents finde i Container men ikke i Component
Avatar billede arne_v Ekspert
28. december 2008 - 22:59 #11
og svar
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