0

JPanel と JButtons を含む JPanel があります。内側の JPanel には、最初に選択された JCheckBox がいくつかあります。各 JCheckBoxes が未選択に変更された場合にアクションが実行されるかどうかをチェックする JButtons に actionListener を追加しました。しかし、うまくいきません。これは私のコードですが、どこに問題がありますか?

public LimitPanel(String[] dates, int column) {

    GridLayout layout = new GridLayout(1 + dates.length, 0);
    setLayout(layout);
    setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);
    setVisible(true);

    this.dates = dates;

    checks = new JCheckBox[dates.length][column-1];

    for (int i = 0; i < dates.length; i++) {

        for (int j = 0; j < column - 1; j++) {
            checks[i][j] = new JCheckBox();
            checks[i][j].setSelected(true);
            checks[i][j]
                    .setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);
            add(checks[i][j]);

        }
    }
}
public JCheckBox[][] getChecks() {
    return checks;
}

メインクラスには、次を含む別のメソッドがあります。

ResultSet e = connect.select("Invi", "*");
        try {
            while (e.next()) {
                final int inviID = e.getInt("inviID");
                    JPanel pn = new JPanel();
                pn.setSize(d.width, d.height);
            pn.setLocation(0, 0);
                    pn.setLayout(new BoxLayout(pn, BoxLayout.PAGE_AXIS));

                    lp = new LimitPanel(st, 6);
                    pn.add(lp);



                    JButton sabt = new JButton("  ثبت  ");
                    sabt.addActionListener(new ActionListener() {

                        @Override
                        public void actionPerformed(ActionEvent arg0) {
                            System.out.println("saaaaaaaaaaaaaaaabt");
                            JCheckBox[][] jcb = new JCheckBox[lp.getDates().length][5];
                            jcb = lp.getChecks();
                            for (int i = 0; i < lp.getDates().length; i++)
                                for (int j = 0; j < 5; j++) {
                                    if (!jcb[i][j].isSelected()) {
                                        System.out.println("naaaaaaaaa");
                                        connect.insertLimit(inviID, (lp
                                                .getDates())[i], j+"");
                                    }

                                }

                        }
                    });
                    pn.add(sabt);

                    panels.add(pn);

                }
            } catch (SQLException e1) {
                e1.printStackTrace();
            }
            setContentPane(panels.get(p));
            revalidate();

必要なものを含むように編集しました。私の問題はSystem.out.println("saaaaaaaaaaaaaaaabt");、ボタンを押すと常に機能しますが、チェックボックスで何をしても機能しSystem.out.println("naaaaaaaaa");ません。

4

1 に答える 1

2

while( ) を使用してwhile (e.next()) {、プログラムの一部を構築します。その中で、各反復で lpとへの新しい参照を作成します。JButtonsabt

作成されActionListenerたの最後のインスタンスのみを参照できますlp。これが、あなたactionPerformedがそうあるべきだと思うことをしている理由である可能性が最も高いです...

このように考えてみてください...私がそうするなら...

lp = new new LimitPanel(st, 6);
lp = new new LimitPanel(st, 6);
lp = new new LimitPanel(st, 6);
lp = new new LimitPanel(st, 6);

JCheckBox[] = lp.getChecks();

どのインスタンスlpからチェック ボックスを取得しましたか??

詳細を更新しました

// Create a new instance of "LimitPanel"
lp = new LimitPanel(st, 6);
// You can check this by using the hashCode of the object...
System.out.println(lp.hashCode());
pn.add(lp);

JButton sabt = new JButton("  ثبت  ");
sabt.addActionListener(new ActionListener() {

    @Override
    public void actionPerformed(ActionEvent arg0) {
        /*...*/
        // Use what ever was last assigned to "lp"
        jcb = lp.getChecks();
        // You can check this by using the hashCode of the object...
        System.out.println(lp.hashCode());
        /*...*/
    }
});

ActionListenerが の特定のインスタンスを使用していることを本当に確認したい場合は、その参照を...LimitPanelの特別なインスタンスに渡す必要があります。ActionListener

例えば...

lp = new LimitPanel(st, 6);
// You can check this by using the hashCode of the object...
System.out.println(lp.hashCode());
pn.add(lp);

JButton sabt = new JButton("  ثبت  ");
sabt.addActionListener(new LimitActionHandler(lp));

そしてLimitActionHandler...

public class LimitActionHandler implements ActionListener {

    private LimitPanel limitPane;

    public LimitActionHandler(LimitPanel limitPane) {
        this.limitPane = limitPane;
    }

    @Override
    public void actionPerformed(ActionEvent arg0) {
        /*...*/
        // Use what ever was last assigned to "lp"
        jcb = limitPane.getChecks();
        // You can check this by using the hashCode of the object...
        System.out.println(limitPane.hashCode());
        /*...*/
    }
}

JCheckBoxコメントで述べたように、から esを公開するのは悪い考えだと思いLimitPanelます。アプリケーションの他の部分がこれらのオブジェクトに無制限にアクセスできるようにするためです。

JCheckBox[] jcb = limitPane.getChecks();
for (JCheckBox cb : jcb) {
    cb.setSelected(false); //...
}
for (JCheckBox cb : jcb) {
    cb.getParent().remove(cb); //...
}

これは非常に危険です。アプリケーションがこれらのことをしないと主張することはできますが、それを止めることはできません...

于 2013-08-19T21:26:29.793 に答える