私は学校のプロジェクト用の小さなUIビルダーに取り組んでおり、ボタンのテキスト値をtextField
usingから変更することができます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);
}
この問題にタイトルを付けて説明する方法に問題があるので...問題をさらに説明する方法がよくわからないので、読んでいる人がもっとよく理解できるようにこれを載せるだけだと思います。
さて、あなたは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)とイベントモデルを生成する必要があるとしている意味しようとしているが、に対処するあなたのしている使用しているためMouseListener
とDocumentListener
、あなたはすでにどのようにこれらの作業の基本的な理解を持っています
ビルダーが生成できるイベントを説明する基本的なインターフェースから始めます
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
登録します...DocumentListener
JTextField
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]
コメントを追加