Configurar JScrollPane visible/invisible a través de JCheckBox no funciona

Hay un JCheckBox llamado "." y otro llamado "dos". También hay un JScrollPane llamado "sp". En él hay un JTextArea. El objetivo de las casillas de verificación es ocultar y mostrar ciertas partes del programa. Simplifiqué el programa y aquí explico tediosamente lo que se supone que sucederá solo para asegurarme de que entiendas el programa.

Se supone que esto debe suceder:

Inicialmente solo . es visible y no está seleccionado. En cualquier momento . está seleccionado, dos debe quedar visible. En cualquier momento dos está seleccionado, sp debe quedar visible. Cuando una casilla de verificación no está seleccionada, el componente correspondiente se vuelve invisible. Sin embargo, cuando uno no está seleccionado, sp también se establece invisible. (. controles dos y sp).

El problema:

Cuándo . está seleccionado, dos es visible. Pero cuando dos está seleccionado, sp no es visible (debería ser). Cuando uno no está seleccionado mientras dos está seleccionado, dos es invisible (esto debería suceder). Pero cuando . está seleccionado, dos es visible y de repente sp ahora es visible. Después de este punto, el programa funciona como se esperaba.

Sin embargo, esto funciona con otros JComponents (en reemplazo de JScrollPane).

¿Qué podría estar mal?

package tests;

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

public class Checkboxscrollpane extends JPanel {

    private JCheckBox one, two;
    private JScrollPane sp;

    private Checkboxscrollpane() {
        Listener listener = new Listener();

        one = new JCheckBox();
        one.addActionListener(listener);
        add(one);

        two = new JCheckBox();
        two.addActionListener(listener);
        add(two);

        sp = new JScrollPane(new JTextArea("hello"));
        add(sp);

        one.setVisible(true);
        two.setVisible(false);
        sp.setVisible(false);
    }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);

        one.setLocation(50, 50);
        two.setLocation(70, 70);
        sp.setLocation(90, 90);
    }

    private class Listener implements ActionListener {

        public void actionPerformed(ActionEvent e) {
            if (e.getSource() == one) {
                two.setVisible(one.isSelected());
            }
            sp.setVisible(one.isSelected() && two.isSelected());
        }
    }

    public static void main(String[] args) {
        JFrame frame = new JFrame();
        frame.setSize(300, 200);
        frame.add(new Checkboxscrollpane());
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }
}

preguntado el 27 de julio de 12 a las 18:07

1 Respuestas

Debes revalidar el Checkboxscrollpane panel.

Pero no debe establecer la ubicación de los componentes en cada evento de pintura:

setLayout(null);

    one.setSize(100, 20);
    two.setSize(100, 20);
    sp.setSize(100, 20);
    one.setLocation(50, 50);
    two.setLocation(70, 70);
    sp.setLocation(90, 90);

Y quita el public void paintComponent(Graphics g) { método.

Respondido 27 Jul 12, 19:07

Lo hago como lo hice porque quiero mis componentes en ciertos lugares. Hacer lo que dijiste ubica los componentes usando el diseño del panel predeterminado, que es lo que no quiero. - Alan

Sí, olvidé agregar la línea: setLayout(null) - Xeon

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.