web-dev-qa-db-ja.com

Swingコンポーネントのサイズ変更で「何かをする」方法は?

JPanelを拡張するクラスがあります。 protected void paintComponent(Graphics g)を上書きしました。

パネルの寸法が変更されたときに再計算する必要がある変数があります。どうすれば適切な方法でそれを行うことができますか?

22
c0d3x

質問を正しく理解している場合は、Swingチュートリアルの コンポーネントリスナーの作成方法 のセクションを読んでください。このセクションでは、コンポーネントサイズの変更をリッスンする方法を示しています。

13
camickr

Adam Paynterが提案したように、次のようにコードに内部クラスを追加することもできます。

_class ResizeListener extends ComponentAdapter {
        public void componentResized(ComponentEvent e) {
            // Recalculate the variable you mentioned
        }
}
_

最も内側の括弧の間に入力したコードは、コンポーネントのサイズが変更されるたびに実行されます。

次に、このリスナーをコンポーネントに追加します。

_myJPanel.addComponentListener(new ResizeListener());
_

e.getComponent()を使用してコンポーネントを取得できます。このようにして、次のような内部クラス内からコンポーネントの任意のメソッドを呼び出すことができます。

_e.getComponent().getWeight();
_
31
Charnia

さまざまなsetSizeメソッドとresizeメソッドをオーバーライドして、そこで計算を実行できると思います。ただし、サイズを変更できる場所がすべて見つかるとは限りません。クラスに ComponentListener を実装させ、サイズ変更イベントを自分自身でリッスンすることもできます。

警告:私はSwingの専門家ではありません。

警告:私はこのコードをコンパイルしていません。

public class MyJPanel extends JPanel implements ComponentListener {

    public MyJPanel() {
        this.addComponentListener(this);
    }

    public void paintComponent(Graphics g) {
        // Paint, Paint, Paint...
    }

    public void componentResized(ComponentEvent e) {
        // Perform calculation here
    }

    public void componentHidden(ComponentEvent e) {}

    public void componentMoved(ComponentEvent e) {}

    public void componentShown(ComponentEvent e) {}

}
17
Adam Paynter

計算に時間がかからない場合は、paintComponent()で毎回値を再計算します。

それ以外の場合は、コンポーネントのサイズである値を保存して、paintComponentの新しいサイズと照合できます。サイズが変更された場合は再計算し、そうでない場合は再計算しません。

private Dimension size;

protected void paintComponent(Graphics g){
    if (!size.equals(getSize())){
        size = getSize();
        // recalculate value
    }
}

または、サイズ変更イベントで計算を行うことができます。

private CompoentListener resizeListener = new ComponentAdapter(){
    public void componentResized(ActionEvent e){
        // recalculate value
    }
};

//in the constructor add the line
addComponentListener(resizeListener);
4
jjnguy

最も簡単な方法は、 ComponentListener を実装することです。

_myjpanel.addComponentListener(new ComponentAdapter() {
    @Override
    public void componentResized(ComponentEvent e) {
        //recalculate variable
    }
});
_

ここでは、componentResized()をオーバーライドすることだけを目的としているため、 ComponentAdapter を使用しました。

2
Alexander

これが私が使用するものです(CoordinatePlaneはJPanelです):

私は専門家ではありません

public CoordinatePlane() {
    setBackground(Color.WHITE);
    this.addComponentListener(new ComponentAdapter(){
        public void componentResized(ComponentEvent e) {
            //YOUR CODE HERE         
        }
    });
}
1
Jeremiah

の場合は自動的にサイズ変更されます

  1. borderLayoutパネル内と
  2. borderLayout.CENTERコンポーネントとしてそこに配置します。

それが機能しない場合は、おそらくこれら2つのうちの1つを忘れているでしょう。

0
guest