通过JCheckBox设置JScrollPane可见/不可见无效

时间:2012-07-27 17:47:23

标签: java swing jscrollpane visibility jcheckbox

有一个名为“一个”的JCheckBox,另一个名为“两个”。还有一个名为“ sp ”的JScrollPane。它是一个JTextArea。复选框的要点是隐藏和显示程序的某些部分。我简化了程序,在这里我单调乏味地解释了为了确保你理解程序而应该发生的事情。

这应该发生:

最初只有一个可见且未被选中。每当选择一个时,两个应设置为可见。每当选择两个时, sp 应设置为可见。取消选中复选框时,相应的组件将设置为不可见。但是,如果未选中一个, sp 也会设置为不可见。 (一个控件两个 sp )。

问题:

选择一个时,可以看到两个。但是当选择两个时, sp 不可见(应该是)。当选择两个时未选中一个两个是不可见的(这应该发生)。但是当选择一个时,可以看到两个,并且突然显示 sp 。在此之后,程序按预期运行。

然而,这适用于其他JComponents(替换JScrollPane)。

可能出现什么问题?

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);
    }
}

1 个答案:

答案 0 :(得分:2)

您应该重新验证Checkboxscrollpane面板。

但是你不应该在每个绘画事件上设置组件的位置:

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);

并删除public void paintComponent(Graphics g) {方法。