1

「 one 」と呼ばれる JCheckBox と「 two 」と呼ばれる別の JCheckBox があります。「 sp 」と呼ばれる JScrollPane もあります。その中に JTextArea があります。チェックボックスのポイントは、プログラムの特定の部分を非表示および表示することです。私はプログラムを単純化しました。ここでは、プログラムを確実に理解できるように、何が起こるのかを説明します。

これは起こるはずです:

最初は1 つだけが表示され、選択されていません。1 つが選択されるたびに、 2 つが表示されるように設定する必要があります。2 つが選択されている場合は常に、sp表示に設定する必要があります。チェックボックスが選択されていない場合、対応するコンポーネントは非表示に設定されます。ただし、いずれかが選択されていない場合、spも非表示に設定されます。( oneはtwospを制御します)。

問題:

1 つを選択すると、2が表示されます。ただし、2 つが選択されている場合、spは表示されません (表示されるはずです)。2 つが選択されているときに 1 つが選択されていない場合、2つが非表示になります (これは発生するはずです)。しかし、1 つを選択すると、2 つが表示され、突然spが表示されるようになりました。この時点以降、プログラムは意図したとおりに機能します。

ただし、これは (JScrollPane の代わりに) 他の JComponents で機能します。

何が間違っている可能性がありますか?

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

1 に答える 1

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) {メソッドを削除します。

于 2012-07-27T18:00:45.983 に答える