JPanel
を拡張するクラスがあります。 protected void paintComponent(Graphics g)
を上書きしました。
パネルの寸法が変更されたときに再計算する必要がある変数があります。どうすれば適切な方法でそれを行うことができますか?
質問を正しく理解している場合は、Swingチュートリアルの コンポーネントリスナーの作成方法 のセクションを読んでください。このセクションでは、コンポーネントサイズの変更をリッスンする方法を示しています。
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();
_
さまざまな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) {}
}
計算に時間がかからない場合は、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);
最も簡単な方法は、 ComponentListener
を実装することです。
_myjpanel.addComponentListener(new ComponentAdapter() {
@Override
public void componentResized(ComponentEvent e) {
//recalculate variable
}
});
_
ここでは、componentResized()
をオーバーライドすることだけを目的としているため、 ComponentAdapter
を使用しました。
これが私が使用するものです(CoordinatePlaneはJPanelです):
私は専門家ではありません
public CoordinatePlane() {
setBackground(Color.WHITE);
this.addComponentListener(new ComponentAdapter(){
public void componentResized(ComponentEvent e) {
//YOUR CODE HERE
}
});
}
の場合は自動的にサイズ変更されます
それが機能しない場合は、おそらくこれら2つのうちの1つを忘れているでしょう。