1

Netbeans 7.0.1 とそのビルドイン gui ビルダーを使用して、いくつかの異なることを行う Java アプリを作成しました。私が抱えている問題は、画面上にユーザー入力用のテキスト フィールドがいくつかあることです。最初は 1 セットのフィールドと、最大 10 まで追加するボタンがあります。フィールドを削除する削除ボタンもあります。したがって、基本的にボタンは jTextFields と jLabels をパネルに追加したり、パネルから削除したりします。

ボタンをクリックすると遅延があるように見えるので、いくつかの System.out.prints を追加したところ、ボタンが押されることがあることがわかりました。システムは本来のものを印刷しますが、コンポーネントの追加/削除は無視します.

これは既知の問題ですか?(検索の文言を 100% 確信しているわけではありませんが、まだ何も見つかりません) それとも何か間違っていますか?

コードのサンプル: 注: 現在のコンポーネントは、各コンポーネントとその値を含むマップです

private void addButtonMouseClicked(java.awt.event.MouseEvent evt) {                                       
    if(hiddenValue != 81) {
        currentComponents.get(hiddenValue).setVisible(true);
        currentComponents.get(hiddenValue + 1).setVisible(true);
        currentComponents.get(hiddenValue + 2).setVisible(true);
        currentComponents.get(hiddenValue + 3).setVisible(true);
        currentComponents.get(hiddenValue + 4).setVisible(true);
        currentComponents.get(hiddenValue + 5).setVisible(true);
        currentComponents.get(hiddenValue + 6).setVisible(true);
        currentComponents.get(hiddenValue + 7).setVisible(true);
        currentComponents.get(hiddenValue + 8).setVisible(true);
        hiddenValue =  hiddenValue + 10;
        numEntries++;
        removeButton.setVisible(true);
        removeButton.setEnabled(true);
        System.out.println(hiddenValue);
    }
    else {
        currentComponents.get(hiddenValue).setVisible(true);
        currentComponents.get(hiddenValue + 1).setVisible(true);
        currentComponents.get(hiddenValue + 2).setVisible(true);
        currentComponents.get(hiddenValue + 3).setVisible(true);
        currentComponents.get(hiddenValue + 4).setVisible(true);
        currentComponents.get(hiddenValue + 5).setVisible(true);
        currentComponents.get(hiddenValue + 6).setVisible(true);
        currentComponents.get(hiddenValue + 7).setVisible(true);
        currentComponents.get(hiddenValue + 8).setVisible(true);
        hiddenValue =  hiddenValue + 10;
        numEntries++;
        addButton.setVisible(false);
        addButton.setEnabled(false);
        System.out.println(hiddenValue);
    }
    }    
4

3 に答える 3

2

コンポーネントの非表示/表示に問題はありません:

import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;

public class TestVisibility {

    private class Pair<P1, P2> {
        public final P1 first;
        public final P2 second;

        public Pair(P1 first, P2 second) {
            this.first = first;
            this.second = second;
        }
    }

    private List<Pair<JLabel, JTextField>> pairs = new ArrayList<TestVisibility.Pair<JLabel, JTextField>>();

    protected void initUI() {
        JFrame frame = new JFrame("test");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().setLayout(new GridBagLayout());
        GridBagConstraints gbcLabel = new GridBagConstraints();
        gbcLabel.gridx = 0;
        gbcLabel.weightx = 0.0;
        gbcLabel.weighty = 0.0;
        gbcLabel.insets = new Insets(3, 3, 3, 3);
        GridBagConstraints gbcTF = new GridBagConstraints();
        gbcTF.gridx = 1;
        gbcTF.fill = GridBagConstraints.HORIZONTAL;
        gbcTF.weightx = 1.0;
        gbcTF.weighty = 1.0;
        gbcTF.insets = new Insets(3, 3, 3, 3);
        for (int i = 0; i < 10; i++) {
            gbcLabel.gridy = i;
            gbcTF.gridy = i;
            JLabel label = new JLabel("Field " + (i + 1) + ":");
            JTextField textField = new JTextField(50);
            label.setLabelFor(textField);
            Pair<JLabel, JTextField> pair = new Pair<JLabel, JTextField>(label, textField);
            pairs.add(pair);
            frame.add(label, gbcLabel);
            frame.add(textField, gbcTF);
        }
        JButton button = new JButton("Toggle");
        button.addActionListener(new ActionListener() {

            private boolean visible = true;

            @Override
            public void actionPerformed(ActionEvent e) {
                visible = !visible;
                boolean isOdd = false;
                for (Pair<JLabel, JTextField> pair : pairs) {
                    boolean oddVisible = isOdd || visible;
                    pair.first.setVisible(oddVisible);
                    pair.second.setVisible(oddVisible);
                    isOdd = !isOdd;
                }
            }
        });
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.gridy = 10;
        gbc.gridwidth = 2;
        gbc.anchor = GridBagConstraints.CENTER;
        frame.add(button, gbc);
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                new TestVisibility().initUI();
            }
        });
    }
}

おそらくSSCCEで投稿を更新することを検討する必要があります

于 2012-06-21T12:04:12.543 に答える
2

実行時に一部のコンポーネントを非表示/表示するだけの場合は、MigLayoutを使用することをお勧めします。コンポーネントが非表示の場合に何が起こるかを定義できる LayoutManager です。

  • hidemode 0: 非表示のコンポーネントは、表示されている場合とまったく同じ量のスペースを占有します。
  • hidemode 1: 非表示のコンポーネントはスペースを占有しませんが、グリッド セルを消費します。
  • hidemode 2: 非表示コンポーネントはスペースを占有せず、グリッド セルを消費しますが、セル ギャップはサイズ 0 に設定されます。
  • hidemode 3: 非表示のコンポーネントはレイアウトにまったく参加しません (グリッド セルを消費しません)。

標準の LayoutManager とは動作が少し異なりますが、優れたコード サンプルと優れたチート シートがあります。

于 2012-06-21T12:15:47.250 に答える
2

JComponents彼らに電話するのは本当に良い考えではありindexません。また、車輪を再発明する理由もありません。使用してください (XxxExceptionsあまりにも回避するために)

for (Component c : currentComponents.getComponents()) {
    //if (c instanceof JButton) {
       c.setVisible(true);
    //}
}

内部のすべてに対してsetEnabled(true / false)JButtons ActionPerfomedを使用した類似の例JComponentsJPanel

于 2012-06-21T11:45:43.030 に答える