2016-08-15 9 views
0

取り消しボタンが押されたときにjPanelの前の位置にラベルを戻すスイング元戻し機能を実装しようとしています。私はラベルにコンポーネントリスターを追加しましたが、私は現在の場所だけを取得することができ、ラベルの前の場所を取得する方法はわかりません。移動したときにラベルの前の場所を取得する方法

class ComponentEventAdapter implements ComponentListener { 

    @Override 
    public void componentHidden(ComponentEvent e) { 
     //do nothing. 
    } 

    @Override 
    public void componentMoved(ComponentEvent e) { 

      Point oldP; 
      Point newP = e.getComponent().getLocation(); 

     undoManager.undoableEditHappened(new UndoableEditEvent(modelPanel, new ComponentAdditionEdit(e.getComponent(),oldP , newP))); 

    } 

    @Override 
    public void componentResized(ComponentEvent e) { 
     // Do nothing. 

    } 

    @Override 
    public void componentShown(ComponentEvent e) {   
     undoManager.undoableEditHappened(new UndoableEditEvent(modelPanel, new ComponentAdditionEdit(e.getComponent(),e.getComponent().getLocation()))); 
    } 

} 

ラベル/コンポーネントの古い場所をoldPに渡すにはどうすればよいですか。

+0

移動が最初にトリガーされる仕組み(MouseListener?ActionListener?) – copeg

答えて

0

最も簡単な方法は、JLabelを拡張する新しいクラスを作成することです。これは、oldP変数を除いて、あらゆる点で同じです。 Like:

class superNeatJLabel extends JLabel { 

    public Point oldP; 

    public superNeatJLabel() { 
     super(); 
     oldP = this.getLocation() 
    } 
} 

次に、必要に応じてoldPを更新またはチェックしてください。また、oldPを非公開にしてゲッターとセッターを追加することもできますが、それはあなた次第です。スイングコンポーネントがインスタンス化される前にインスタンス化されていることを考慮すると、これがコンストラクタではない可能性もありますが、これがアイデアを得るには十分です。あなたがポリモーフィズムでプロなら

Futher、あなたの代わりにComponentを拡張し、あなたがComponentをインスタンス化することはできませんが、それは確かに可能だと見て、しかしトリッキー取得する可能性があることを、すべてのComponentsのためのこのタイプを使用することができます。

+1

ありがとう、私はすでにJLabelのサブクラスを使っていました。私は2つのフィールドoldPとnewPを追加し、newPをalgueをoldPに渡してnewPをラベルの現在の位置に更新するメソッドを作成しました。 –

関連する問題