JButtonは選択されたコンポーネントではありませんが、最近追加されたボタンの値に変更されます

Reiion

私は学校のプロジェクト用の小さなUIビルダーに取り組んでおり、ボタンのテキスト値をtextFieldusingから変更することができますDocumentListener

しかし、別のボタンを追加しようとすると、新しいボタンを選択すると、最近選択したコンポーネントの値に戻ることがわかりました。

//DragListener: for isolating changes on a particular component
DragListener drag = new DragListener(UIBuilder.this);

//Add new button on mouseclick
addButton.addMouseListener(new MouseAdapter() {
    @Override
    public void mouseClicked(MouseEvent arg0) {
        JButton button = new JButton("JButton");
        button.setBounds(50,20, 90,20);
        internalFrame.getContentPane().add(button);
        button.addMouseListener(drag);
        button.addMouseMotionListener(drag);
        repaint();
        System.out.println("Button added.");
    }
});

次に、コンポーネントはに渡されます DragListener

public class DragListener extends MouseInputAdapter
{
    Point location;
    MouseEvent pressed;
    private UIBuilder uiBuilder;

   public DragListener(UIBuilder ui){
    this.uiBuilder = ui;
   }

   public void mousePressed(MouseEvent me)
   {
       pressed = me;
       Component component = me.getComponent();

       if (component instanceof JButton){
           JButton button = (JButton) component;
           uiBuilder.getTxtFieldsetText().setText(button.getText());
           uiBuilder.getTextFieldName().setText(button.getName());

        uiBuilder.getTxtFieldsetText().getDocument().addDocumentListener(new DocumentListener() {

        @Override
        public void removeUpdate(DocumentEvent e) {
            ((JButton) component).setText(uiBuilder.getTxtFieldsetText().getText());
        }

        @Override
        public void insertUpdate(DocumentEvent e) {
            ((JButton) component).setText(uiBuilder.getTxtFieldsetText().getText());
        }

        @Override
        public void changedUpdate(DocumentEvent e) {
            ((JButton) component).setText(uiBuilder.getTxtFieldsetText().getText());
        }
    });
       }
   }

   public void mouseDragged(MouseEvent me)
   {
       Component component = me.getComponent();
       location = component.getLocation(location);
       int x = location.x - pressed.getX() + me.getX();
       int y = location.y - pressed.getY() + me.getY();
       component.setLocation(x, y);

    }

この問題にタイトルを付けて説明する方法に問題があるので...問題をさらに説明する方法がよくわからないので、gif読んでいる人がもっとよく理解できるようにこれ載せるだけだと思います

MadProgrammer

さて、あなたはDocumentListenerいつmousePressedが再び呼び出されたのかを削除していないようです

あなたのコードを見てください...

public void mousePressed(MouseEvent me)
{
   pressed = me;
   Component component = me.getComponent();

   if (component instanceof JButton){
       JButton button = (JButton) component;
       uiBuilder.getTxtFieldsetText().setText(button.getText());
       uiBuilder.getTextFieldName().setText(button.getName());

       uiBuilder.getTxtFieldsetText().getDocument().addDocumentListener(new DocumentListener() {
           //...

mousePressedが呼び出されたときUIBuilderに、ボタンのプロパティを使用しsプロパティを設定しますが、はDocumentListenerまだ最後のボタンから削除されていないため、以前に選択したボタンのテキストが自動的に更新されます。

コンセプトを少し変える必要があります。DragListenerオブザーバーとして自身を登録する必要がありUIBuilder、その後これにイベントを生成する必要がありますDragListener缶応答。このようにして、コードを切り離すだけでなく、このようなミスの可能性を減らします。

次に、選択したコンポーネントへの参照を維持し、によって通知されUIBuilderたら、それに応じてその状態を更新します。

これはおそらく、あなたがあなた自身のリスナインタフェース(S)とイベントモデルを生成する必要があるとしている意味しようとしているが、に対処するあなたのしている使用しているためMouseListenerDocumentListener、あなたはすでにどのようにこれらの作業の基本的な理解を持っています

例...

ビルダーが生成できるイベントを説明する基本的なインターフェースから始めます

public interface UIBuilderListener extends EventListener {
    public void componentTextDidChange(ComponentTextEvent evt);
    public void componentNameDidChange(ComponentTextEvent evt);
}

それぞれが特定の一連のイベントに専念するリスナーが複数存在する可能性がありますが、私はそれを単純にしています。

オブジェクトイベントハンドラーには、イベントに関する情報が渡されます。たとえば、...

public class ComponentTextEvent extends EventObject {

    private String text;

    public ComponentTextEvent(UIBuilder source, String text) {
        super(source);
        this.text = text;
    }

    public UIBuilder getBuilder() {
        return (UIBuilder) getSource();
    }

    public String getText() {
        return text;
    }

}

次に、DragListenerこれらの変更について通知されることに関心を登録します...

public class DragListener extends MouseInputAdapter implements UIBuilderListener {

    Point location;
    private UIBuilder uiBuilder;
    private Component selectedComponent;

    public DragListener(UIBuilder ui) {
        this.uiBuilder = ui;
        ui.addBuilderListener(this);
    }

    public void mousePressed(MouseEvent me) {
        selectedComponent = me.getComponent();
    }

    @Override
    public void componentTextDidChange(ComponentTextEvent evt) {
        if (selectedComponent instanceof JButton) {
            JButton btn = (JButton) selectedComponent;
            btn.setText(evt.getText());
        }
    }

    @Override
    public void componentNameDidChange(ComponentTextEvent evt) {
        if (selectedComponent instanceof JButton) {
            JButton btn = (JButton) selectedComponent;
            btn.setName(evt.getText());
        }
    }

}

これはかなりバニラです(これは良いことです)、私たちはできるだけDragListener知らないようにしたいですUIBuilder、これはコードを切り離し、ビルダー(またはDragListener)がお互いに悪影響を与えることなく動作する方法を変更できるようにしますAPIの実装方法ではなく、APIの説明に依存します(私も個人的にUIBuilderインターフェイスを作成しますが、それは私です)

次に、で自分自身に対してUIBuilder登録します...DocumentListenerJTextField

JTextField componentTextField;
componentTextField.getDocument().addDocumentListener(new DocumentListener() {

    protected void generateTextEvent(DocumentEvent e) {
        try {
            Document doc = e.getDocument();
            generateTextEvent(doc.getText(0, doc.getLength()));
        } catch (BadLocationException ex) {
            // Handle possible exception
        }
    }

    @Override
    public void removeUpdate(DocumentEvent e) {
        generateTextEvent(e);
    }

    @Override
    public void insertUpdate(DocumentEvent e) {
        generateTextEvent(e);
    }

    @Override
    public void changedUpdate(DocumentEvent e) {
        generateTextEvent(e);
    }
});

最終的には電話をかけることになります...

protected void generateTextEvent(String text) {
    ComponentTextEvent evt = new ComponentTextEvent(this, text);
    // Loop through listener register and call componentTextDidChange
}

イベントの実際のディスパッチを実行します

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

動的に作成されたvueコンポーネントには、作成時に手動で追加する方法の$ storeパラメーターがありません

分類Dev

コンポーネントは更新されましたが、視覚的な変更はありません

分類Dev

ルートコンポーネントの値が変更された場合、子コンポーネントのVue.jsprops値は更新されません

分類Dev

変更されたURLにリンクしますが、レンダリングされたコンポーネントにはリンクしません

分類Dev

Reactフォームの選択したコンポーネントから送信されたデータを取り戻すことができません

分類Dev

ラジオボタンの「選択された」値はモデルでは変更されましたが、Angular5のビューでは変更されていません

分類Dev

更新されたコンポーネントフィールドはUIで変更されません

分類Dev

ルーターはURLを変更しますが、レンダリングされたコンポーネントは変更しません

分類Dev

Holoviews:コードには明示的に定義されたUIコンポーネントがありません

分類Dev

光沢のあるアプリは、コードがコンソールに送信されたときに実行されますが、[アプリの実行]ボタンが選択されているときは実行されません

分類Dev

選択されたJquery:複数の選択された値の区切り文字をコンマではなくパイプラインに変更します

分類Dev

動的に追加されたコントロールの値はポストバックで保持されません

分類Dev

Inno Setupは、特定のコンポーネントが選択されたときにコンポーネントの選択を無効にします

分類Dev

wpfgridviewには行が選択されたイベントがありません

分類Dev

Ionic2テキストが選択したコンポーネントで折り返されません

分類Dev

スタイル設定されたコンポーネントは動的に作成されています。別のコンポーネント内でstyledを呼び出したため、この警告が表示される場合があります

分類Dev

キャッチされないエラー:コンポーネントAppComponentに指定されたテンプレートが文字列ではありません

分類Dev

setState:マウントされたコンポーネントまたはマウントされたコンポーネントのみを更新できます。ネイティブ/ undefinedはオブジェクトではありません。

分類Dev

選択値は変更されますが、選択された表示オプションは変更されません

分類Dev

コンポーネントは、Interface Builderのビューに追加されたときに機能しますが、コードでは機能しません

分類Dev

ラジオボタンの選択値は変更されません

分類Dev

インポートされた値は変更されません

分類Dev

小道具が変更されたときにVueの子コンポーネントが再レンダリングされませんでしたか?

分類Dev

WPF Textblockテキストは、コンボボックスで選択されたアイテムで動的に変更されません

分類Dev

カスタムの子コンポーネントが追加されましたが、表示されません

分類Dev

Android Studio:コンポーネントは選択されていますが、属性エディターに「コンポーネントが選択されていません」と表示されます

分類Dev

別の接続されたコンポーネントからストアが変更された後、接続されたコンポーネントは再レンダリングされません

分類Dev

コンポーネントが更新された状態でレンダリングされない理由がわかりません。とはいえ、状態は更新され、データベースに反映されます

分類Dev

インポートされたスタイルはコンポーネントに適用されません

Related 関連記事

  1. 1

    動的に作成されたvueコンポーネントには、作成時に手動で追加する方法の$ storeパラメーターがありません

  2. 2

    コンポーネントは更新されましたが、視覚的な変更はありません

  3. 3

    ルートコンポーネントの値が変更された場合、子コンポーネントのVue.jsprops値は更新されません

  4. 4

    変更されたURLにリンクしますが、レンダリングされたコンポーネントにはリンクしません

  5. 5

    Reactフォームの選択したコンポーネントから送信されたデータを取り戻すことができません

  6. 6

    ラジオボタンの「選択された」値はモデルでは変更されましたが、Angular5のビューでは変更されていません

  7. 7

    更新されたコンポーネントフィールドはUIで変更されません

  8. 8

    ルーターはURLを変更しますが、レンダリングされたコンポーネントは変更しません

  9. 9

    Holoviews:コードには明示的に定義されたUIコンポーネントがありません

  10. 10

    光沢のあるアプリは、コードがコンソールに送信されたときに実行されますが、[アプリの実行]ボタンが選択されているときは実行されません

  11. 11

    選択されたJquery:複数の選択された値の区切り文字をコンマではなくパイプラインに変更します

  12. 12

    動的に追加されたコントロールの値はポストバックで保持されません

  13. 13

    Inno Setupは、特定のコンポーネントが選択されたときにコンポーネントの選択を無効にします

  14. 14

    wpfgridviewには行が選択されたイベントがありません

  15. 15

    Ionic2テキストが選択したコンポーネントで折り返されません

  16. 16

    スタイル設定されたコンポーネントは動的に作成されています。別のコンポーネント内でstyledを呼び出したため、この警告が表示される場合があります

  17. 17

    キャッチされないエラー:コンポーネントAppComponentに指定されたテンプレートが文字列ではありません

  18. 18

    setState:マウントされたコンポーネントまたはマウントされたコンポーネントのみを更新できます。ネイティブ/ undefinedはオブジェクトではありません。

  19. 19

    選択値は変更されますが、選択された表示オプションは変更されません

  20. 20

    コンポーネントは、Interface Builderのビューに追加されたときに機能しますが、コードでは機能しません

  21. 21

    ラジオボタンの選択値は変更されません

  22. 22

    インポートされた値は変更されません

  23. 23

    小道具が変更されたときにVueの子コンポーネントが再レンダリングされませんでしたか?

  24. 24

    WPF Textblockテキストは、コンボボックスで選択されたアイテムで動的に変更されません

  25. 25

    カスタムの子コンポーネントが追加されましたが、表示されません

  26. 26

    Android Studio:コンポーネントは選択されていますが、属性エディターに「コンポーネントが選択されていません」と表示されます

  27. 27

    別の接続されたコンポーネントからストアが変更された後、接続されたコンポーネントは再レンダリングされません

  28. 28

    コンポーネントが更新された状態でレンダリングされない理由がわかりません。とはいえ、状態は更新され、データベースに反映されます

  29. 29

    インポートされたスタイルはコンポーネントに適用されません

ホットタグ

アーカイブ