0

以下は、私が特定のカスタムテクニックを実験していた単純なスイングアプリです。コードは次のとおりです:-

import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;


public class ThemeComponents extends JFrame{
  public static void main(String args[])
  {
    SwingUtilities.invokeLater(new Runnable(){public void run(){new    ThemeComponents();}});
  }

  public ThemeComponents()
  {
    super("HACK 1:Creating Image Themed Components ");
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setLayout(new FlowLayout());
    CustomPanel p1=new CustomPanel();
    p1.add(new CustomLabel());
    add(p1);
    pack();
    setVisible(true);
  }
}

class CustomPanel extends JPanel
{
  BufferedImage img;
  CustomPanel()
  {
    try
    {
      img=ImageIO.read(new File("src/background.jpg"));
    } catch(IOException e){
      System.out.println("Error in loading background image "+e);
    }
  }
  public void paintComponent(Graphics g)
  {
    g.drawImage(img,0,0,getWidth(),getHeight(),null);
  }
  public Dimension getPreferredSize()
  {
    return new Dimension(img.getWidth(),img.getHeight());
  }
}

class CustomLabel extends JLabel
{
  ImageIcon img;
  CustomLabel ()
  {
    img=new ImageIcon("src/tornado.gif");


    setSize(img.getIconWidth(),getHeight());
    setIcon((Icon) img);
    //setOpaque(false);
    //setIconTextGap(0);
    setLocation(10,10);
  }
}

今、私は次の質問があります:-

setLayout(null)1)メインクラスでレイアウトをnullに設定するThemeComponentsと、タイトルバーだけでフレームサイズがnullに縮小するのはなぜですか?フレームCustomPanelに使用pack()したのと同じサイズになると予想しました(flowlayout、borderlayoutなどのレイアウトを使用)ただし、正しい出力が生成されます)

2)getPreferredSize()代わりにコンポーネントのサイズを設定する方が良いです。実際、setPreferredSize()私はそれらの間に違いはありません。

4

2 に答える 2

2
  1. null-layoutを使用すると、優先サイズは (0,0) を返すため、タイトル バーのみが表示されます。pack()を検証JFrameし、サイズJFrameをコンテンツ ペインの推奨サイズ (0,0) に設定し、タイトル バー、メニューなどに必要なスペースを追加します。

  2. ほとんどの場合、呼び出しを避けsetPreferredSize()、オーバーライドする必要がありますgetPreferredSize()。呼び出しsetPreferredSize()は、他の人がその値を変更する可能性を残します。このような状況では、優先サイズがコンポーネントの本質的な部分ではないことを意味する可能性があるため、 を呼び出す必要はありませんsetPreferredSize()。オーバーライドgetPreferredSize()すると、完全な制御が可能になり、優先サイズがコンポーネントの本質的な部分になります。

  3. super.paintComponent(g);CustomPanelも呼び出す必要があります。

  4. あなたのCustomLabelでは、呼び出すのは意味がありませんsetLocation(とにかく親レイアウトはそれを変更します)

  5. あなたのCustomLabelでは、これも意味がありません。setSize(img.getIconWidth(),getHeight());親レイアウトはとにかくこれらの値を変更するためです(ところで、getHeight()この場合は 0 を返します)

于 2013-01-02T13:58:34.117 に答える
0

setLayout()は、ウィンドウのレイアウトを設定するために使用されます。レイアウトについては、ここをクリックしてください。 コンテンツペインはデフォルトでBorderLayoutを使用します。レイアウトをヌルに設定すると、レイアウトはなく、表示されるのはタイトルバーだけです。

getPreferred()は、コンポーネントに指定した優先サイズを取得するために使用され、セットは、優先サイズを設定するために使用されます:p

于 2013-01-02T13:35:42.000 に答える