2
core.EditArea[,119,96,556x931,invalid,layout=javax.swing.BoxLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=9,maximumSize=,minimumSize=,preferredSize=]

JPanelを印刷しましたが、上記は出力です。その「無効な」部分の意味を誰かに教えてもらえますか?

さらに良いことに、できるだけ多くのthingysの説明されたSystem.out.print(thingy)出力のリストがどこにあるかを誰かが知っている場合はどうでしょうか。

4

3 に答える 3

8

System.out.print(thingy)ただの印刷方法ですthingy.toString()

toString()のためにクラスJPanelから来java.awt.Componentます:

public String toString() {
    return getClass().getName() + "[" + paramString() + "]";
}



このメソッドがオーバーライドされる場所にprotected String paramString()戻るため の呼び出しがあります。JPanel

/**
 * Returns a string representation of this JPanel. This method 
 * is intended to be used only for debugging purposes, and the 
 * content and format of the returned string may vary between      
 * implementations. The returned string may be empty but may not 
 * be <code>null</code>.
 * 
 * @return  a string representation of this JPanel.
 */
protected String paramString() {
    return super.paramString();
}

これにより、これJCompomnentがの第1レベルの親クラスになりますJPanel(ただし、まだ明示的に宣言されていないtoString()ため、このクラスはjava.awt.ComponentJPanelを含むすべてのJComponentに対して呼び出されます)。
だから、paramString()それは呼び出されます:

protected String paramString() {
    String preferredSizeString = (isPreferredSizeSet() ?
                  getPreferredSize().toString() : "");
    String minimumSizeString = (isMinimumSizeSet() ?
                getMinimumSize().toString() : "");
    String maximumSizeString = (isMaximumSizeSet() ?
                getMaximumSize().toString() : "");
    String borderString = (border != null ?
               border.toString() : "");

    return super.paramString() +
    ",alignmentX=" + alignmentX +
    ",alignmentY=" + alignmentY +
    ",border=" + borderString +
",flags=" + flags +             // should beef this up a bit
    ",maximumSize=" + maximumSizeString +
    ",minimumSize=" + minimumSizeString +
    ",preferredSize=" + preferredSizeString;
}

...そしてまた---super.paramString()からjava.awt.Container

protected String paramString() {
String str = super.paramString();
LayoutManager layoutMgr = this.layoutMgr;
if (layoutMgr != null) {
    str += ",layout=" + layoutMgr.getClass().getName();
}
return str;
}

...そして再び---super.paramString()それは最終的に私たちをに戻しますjava.awt.Component

protected String paramString() {
    String thisName = getName();
    String str = (thisName != null? thisName : "") + "," + x + "," + y + "," + width + "x" + height;
    if (!isValid()) {
        str += ",invalid";
    }
    if (!visible) {
        str += ",hidden";
    }
    if (!enabled) {
        str += ",disabled";
    }
    return str;
}

そして、invalidこれがJPanelを説明する文字列内に印刷された根本的な原因です

/**
 * Determines whether this component is valid. A component is valid
 * when it is correctly sized and positioned within its parent
 * container and all its children are also valid. 
 * In order to account for peers' size requirements, components are invalidated
 * before they are first shown on the screen. By the time the parent container 
 * is fully realized, all its components will be valid.
 * @return <code>true</code> if the component is valid, <code>false</code>
 * otherwise
 * @see #validate
 * @see #invalidate
 * @since JDK1.0
 */
public boolean isValid() {
    return (peer != null) && valid;
}

状態を達成する方法validは@Reimeusによってうまく説明されました

于 2012-08-19T00:08:40.873 に答える
7

これは、の結果でisValid()あり、次のjava.awt.Componentように拡張されJPanelます。

public boolean isValid()

このコンポーネントが有効かどうかを判断します。コンポーネントは、その親コン​​テナ内で適切なサイズと位置に配置され、そのすべての子も有効である場合に有効です。ピアのサイズ要件を考慮して、コンポーネントは最初に画面に表示される前に無効化されます。親コンテナが完全に実現されるまでに、そのすべてのコンポーネントが有効になります。

于 2012-08-19T00:11:42.500 に答える
5

'invalid'フィールドは、単にコンポーネントをレイアウトする必要があることを意味します。'valid'を作成するには、親コンテナを'packing'することで実現できます。例:

JPanel p = new JPanel();
JFrame frame = new JFrame();
frame.add(p);
frame.pack();
于 2012-08-19T00:18:52.093 に答える