Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

JFrameに配置したJPanelについて

JFrameを親クラスに持つWindowクラスにJPanelを親クラスに持つCanvasクラスを追加しています。
Canvas#drawCanvasでImageに何かしらを描画させてCanvas#paintComponentでそのImageをJPanelに描画させています。
座標(0,0)の位置がJFrame同様タイトルバーの左上になっているようで、(0,0)の方に描画させるとタイトルバーに隠れてしまいます。
どうにかするにはJFrame#getInsetsでタイトルバーなどのサイズを求めて、その分描画位置かJPanelの位置をずらすしかないのでしょうか?

8

回答

81286

閲覧

8件の回答

評価

0

デフォルトでJFrameの最上位にあるコンポーネントはメニューバーの部分と
その下のコンテントペインです。
JFrame#addメソッドでコンポーネントを貼り付けている場合は
コンテントペイン上に配置されるのでメニューバーの部分に重なることはありません。
もしかするとJRootpane glassPane JLayeredPaneなどに貼り付けているのではないでしょうか?

評価

0

前の回答者です。
失礼しましたタイトルバーにかぶるという事でメニューバーは関係ありませんでしたね。
Canvas#paintComponentを
public void paintComponent(Graphics g) {
    super.paintComponent(g);
    g.setColor(Color.GREEN);
    g.drawLine(0, 0, 300, 300);
}
とした場合もやはりタイトルバーに重なりますか?

もし
super.paintComponent(g);
がない場合は最初の行に記述してみたらどうなりますか?

評価

0

以下のようにしてもかぶってしまいました。
@Override
public void paintComponent(Graphics g){
    super.paintComponent(g) //追加
    g.drawImage(canvas,0,0,this);
}
そこで
g.setColor(Color.GREEN);
g.drawLine(0, 0, 300, 300);
の方を試してみると始点はタイトルバーなどの枠の内側でした。
ということはImageを描画させるときに(0,0)が違ってしまっているのかもしれません。

評価

0

drawStringで(0,0)に描かせるとタイトルバーにかぶるのですが、drawRectで描かせるとタイトルバーからの位置などが指定したサイズでした。
drawStringの(0,0)がタイトルバーの左上部分になっているのでしょうか?

以下がImageへの描画部分のコードです。

//Image canvas - JPanelに描画させるImage
//String[] param - 描画命令のパラメータ
Graphics g=canvas.getGraphics()
switch(param[0]){
    case "文字":
        g.drawString(param[3],x,y);
        break;
    case "四角形":
        if(param[5]!=null && param[5].equals("塗りつぶす")){
            g.fillRect(x,y,width,height);
        }
        else{
            g.drawRect(x,y,width,height);
        }
        break;
}

評価

0

あ。
drawStringの座標指定は左上じゃなくて左下なんですね。
問題は解決しました。
ありがとうございました。

評価

0

API のドキュメントをしっかり読んで下さい。
ベースラインを突き抜けて下に出る時もあります。
つまり指定位置よりも下もあります。
アセント(ベースラインの上)とディセント
(ベースラインの下)を考慮して下さい。

評価

0

対策として以下のようにしています。
g.drawString(param[3],x,y+g.getFont().getSize());
これなら上切れませんよね?
ベースラインからの高さがフォントサイズより大きい文字はないですよね?

評価

0

Font#getSizeで取得できるのはポイントであって、ピクセル
ではないのです。
FontMetricsのapidocを読んでください。

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。