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

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

0

Swingについて

はじめまして。
Swingについて質問があります。

JFrameに壁紙を表示しようと考えています。
JPanelのpaintComponentで描画し、それをJFrameにaddしています。

しかし、なぜか右と下に若干空白(2pxくらい)ができてしまいます。
*フレーム作成直後と表示後の領域の大きさを比べると、フレーム自体は変化がなく、ContentPane, JPanel, 各Insetsに変化があります。

皆様、忙しいとは思いますが、よろしくお願いします。

4

回答

8340

閲覧

4件の回答

評価

0

いろんな、サイズ関係のパラメータの設定等を見ないと、なんとも言えませんね。問題を再現できる小さなサンプルプログラムのソースを、投稿してみてください。ちなみに、下記の簡単なプログラムでは、類似の問題は生じません。
---------------------------------
import javax.swing.*;
import java.awt.*;

public class KabeGami{

  public static void main(String[] args){
    JFrame frame = new JFrame();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    JPanel jp = (JPanel)frame.getContentPane();

    Kabe kb = new Kabe("images/test.gif", jp);

    jp.add(kb, BorderLayout.CENTER);
    frame.setSize(400, 400);
    frame.setVisible(true);
  }

  static class Kabe extends JPanel{
    JPanel container;
    Image img;

    public Kabe(String filePath, JPanel p){
      ImageIcon ii = new ImageIcon(filePath);
      img = ii.getImage();
      container = p;
    }

    public Kabe(Image i, JPanel p){
      img = i;
      container = p;
    }

    public void paintComponent(Graphics g){
      super.paintComponent(g);
      g.drawImage(img, 0, 0, container.getWidth(), container.getHeight(), this);
    }
  }
}
-------------------------------

評価

0

回答ありがとうございます。
以下にソースを掲載します。
-----------------------------------
import javax.swing.*;
import java.awt.image.*;
import java.awt.*;
import java.io.*;
import javax.imageio.*;

public class Sample {
 public static void main(String[] args) {
  new Sample();
 }
 public Sample(){
  try{
   BufferedImage img = ImageIO.read(new File("./sample.png"));
   Base base = new Base(img);
   JFrame frame = new JFrame("sample");
   frame.setVisible(true);
   frame.setVisible(false);
   frame.add(base);
   frame.setSize(frame.getInsets().left + frame.getInsets().right + 400, frame.getInsets().top + frame.getInsets().bottom + 400);
   frame.setLocationRelativeTo(null);
   frame.setResizable(false);   // *1
   frame.setVisible(true);
  }catch(IOException e) {}
 }
 class Base extends JPanel {
  BufferedImage img;
  Base(BufferedImage img){
   this.img = img;
  }
  public void paintComponent(Graphics g){
   Graphics2D g2d    = (Graphics2D)g;
   g.drawImage(img, 0, 0, this);
  }
 }
}
--------------------------------------------
*1の部分をコメントアウトするときちんと表示されるのですが、この部分の前後でインセットが変化してしまいます。
※画像のサイズは400*400としました。

評価

0

私んとこでは、ご指摘の現象は再現できませんでしたが、プログラミングでは一般的に、400(数値)、"xyzAction"(テキスト)、のようなリテラル(固定的な具体値)を使わないのがコツです。たとえば下の例の、pack(), setPreferredSize()などを参考にしてください。
--------------------------------
import javax.swing.*;
import java.awt.image.*;
import java.awt.*;
import java.io.*;
import javax.imageio.*;

public class Sample2{
  public static void main(String[] args) {
    new Sample2();
  }

  public Sample2(){
    try{
      BufferedImage img = ImageIO.read(new File("images/test.gif"));
      Base2 base = new Base2(img);

      JFrame frame = new JFrame("sample2");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.add(base); 
      frame.pack();
      frame.setLocationRelativeTo(null);
      frame.setResizable(false);
      frame.setVisible(true);
    }
    catch(IOException e) {
      e.printStackTrace();
    }
  }

  class Base2 extends JPanel {
    BufferedImage img;
    int w, h;

    public Base2(BufferedImage im){
      img = im;
      w = img.getWidth();
      h = img.getHeight();
      setPreferredSize(new Dimension(w, h));
    }

    public void paintComponent(Graphics g){
      super.paintComponent(g);
      g.drawImage(img, 0, 0, this);
    }
  }
}
-------------------------------

評価

0

返答ありがとうございます。

pack(), setPreferredSize()を知り、再度チャレンジした結果、見事きっちり表示することができました。
*上記コードのpack()を問題だった(?)setResizable()の後ろに移動させました。

リテラルの使用法の解説も技として身につけたいです。
貴重なお時間を割いていただきありがとうございます。

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