JmRag
JmRag

Reputation: 1459

Toggle visibility of a JComponent Swing

I am trying to toggle visibility of a JTextField with a checkbox. If the checkbox is selected I want the JTextField to be displayed and vice-versa. My program works fine until I add the line that initializes the JTextField to be invisible at the start. If I remove this the segment works fine! Can you help me?

final JCheckBox chckbxNewCheckBox_1 = new JCheckBox("New Folder");
        panel_3.add(chckbxNewCheckBox_1);

        final JTextField textField_3 = new JTextField();
        panel_3.add(textField_3);

        textField_3.setColumns(20);
        //textField_3.setVisible(false); if a comment it in.. it never becomes visible

        chckbxNewCheckBox_1.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent arg0) {
                if(chckbxNewCheckBox_1.isSelected()){
                    textField_3.setVisible(true);
                }
                else 
                    textField_3.setVisible(false);
            }
        });

Upvotes: 0

Views: 962

Answers (4)

user1803551
user1803551

Reputation: 13427

You will do better with ItemListener

chckbxNewCheckBox_1.addItemListener(new ItemListener() {

    @Override
    public void itemStateChanged(ItemEvent e) {

        if (e.getStateChange() == ItemEvent.DESELECTED))
            textField_3.setVisible(false);
        else if (e.getStateChange() == ItemEvent.SELECTED))
            textField_3.setVisible(true);
        textField_3.revalidate();
    }
});

Note: pelase follow naming conventions and use underscores only for constants.

Upvotes: 0

Denis Tulskiy
Denis Tulskiy

Reputation: 19187

When an element is invisible during container initialization, it never gets its dimensions initialized. You can check it by calling getWidth() and getHeight() on the text area after you set it to visible. They're both zero. So follow @Braj edit and call panel.revalidate() after you change element visibility to let layout manager know that it's time to reposition/recalculate some elements and give them proper size.

Upvotes: 1

ka3ak
ka3ak

Reputation: 3201

Consider calling pack() method

Below is the complete code I experimented with:

import java.awt.FlowLayout;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class Test {

    public static void main(String[] args) {
        final JFrame frame = new JFrame();
        frame.setLayout(new FlowLayout());

        final JCheckBox chckbxNewCheckBox_1 = new JCheckBox("New Folder");
        final JPanel panel_3 = new JPanel();
        frame.add(panel_3);

        panel_3.add(chckbxNewCheckBox_1);

        final JTextField textField_3 = new JTextField();
        panel_3.add(textField_3);

        textField_3.setColumns(20);
        textField_3.setVisible(false); //if a comment it in.. it never becomes visible

        chckbxNewCheckBox_1.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent arg0) {
                if (chckbxNewCheckBox_1.isSelected()) {
                    textField_3.setVisible(true);
                } else
                    textField_3.setVisible(false);

                frame.pack();
            }
        });

        frame.pack();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }

}

Upvotes: -1

Braj
Braj

Reputation: 46891

Try with ActionListener instead of MouseListener

checkBox.addActionListener(new ActionListener() {

    @Override
    public void actionPerformed(ActionEvent arg0) {
        textField_3.setVisible(checkBox.isSelected());
    }
});

--EDIT--

call panel_3.revalidate(); after changing its visibility.

Upvotes: 2

Related Questions