2012-07-28 18 views
5

IveはJFrameを取得し、LayoutManagerをBorderLayoutに設定してから、JLabelにイメージを追加します。しかし、フレームのサイズを変更すると、JLabelのサイズが変更されません。私は北、S、Eなどにコンポーネントを追加していません。ラベルの中のイメージをフレーム全体に塗りつぶして、私のメニューをそのままタクトに残すことを望んでいました。イメージの塗りつぶしでJLabelを作成する方法BorderLayout.CENTER

+0

私は、問題のイメージがスペースを占有するのに十分な大きさであることを願っています。してください、これを見てください[例](http://stackoverflow.com/a/11372350/1057230) –

+0

はいイメージは合理的に十分に小さい、小さなアイコンや何かではありません。 –

+0

サンプルコードがありますか? – MadProgrammer

答えて

8

これは傲慢だと私に許してもらえますが、私は何も進んでいません。

私は、迅速なサンプル

BorderLayout wide BorderLayout narrow

はそれがJLabelの国境だ、画像の周りに赤い線を参照してくださいでした。ご覧のように、ラベルは領域全体を埋めるようにサイズ変更されています。 );

この

は私が明らかにサンプル

public class LayoutFrame extends JFrame { 

    public LayoutFrame() throws HeadlessException { 

     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     Image image = null; 
     URL url = getClass().getResource("/layout/issue78.jpg"); 
     try { 
      image = ImageIO.read(url); 
     } catch (IOException ex) { 

      ex.printStackTrace(); 

     } 

     JLabel label = new JLabel(new ImageIcon(image)); 
     label.setHorizontalAlignment(JLabel.CENTER); 
     label.setVerticalAlignment(JLabel.CENTER); 
     label.setBorder(new LineBorder(Color.RED, 4)); 

     setLayout(new BorderLayout()); 

     add(label); 

    } 

    public static void main(String[] args) { 

     EventQueue.invokeLater(new Runnable() { 

      @Override 
      public void run() { 

       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException ex) { 
       } catch (InstantiationException ex) { 
       } catch (IllegalAccessException ex) { 
       } catch (UnsupportedLookAndFeelException ex) { 
       } 

       LayoutFrame frame = new LayoutFrame(); 
       frame.setSize(200, 200); 
       frame.setLocationByPlatform(true); 
       frame.setVisible(true); 

      } 
     }); 

    } 

} 

を生成するために使用されるコードであり、あなたがあなた自身のイメージを供給する必要があります。

あなたの目標であれば、ラベルはコンテンツの縮尺を調整しませんので、これを達成するには独自のコンポーネントを実装する必要があります。

まだ問題が解決しない場合は、あなたのラベルがコンテナ内にないか、コンテナレイアウトマネージャーがあなたの考えではないことを示唆しています。

UPDATE

あなたがメニューで行方不明に行くのコンポーネントの問題や問題を抱えている理由を私は知りません。重量と軽量の成分を混合していますか?もう少し近くにあなたの質問を読んだ後、メニューバー

With menu bar

サンプル、私は簡単なサイズ変更画像ペインのサンプルを考案しました。スピードに関しては、

public class ImagePane extends JPanel { 

    protected static final Object RESIZE_LOCK = new Object(); 

    private BufferedImage image; 
    private BufferedImage scaledImage; 
    private Timer resizeTimer; 

    public ImagePane() { 

     URL url = getClass().getResource("/layout/issue78.jpg"); 
     try { 
      image = ImageIO.read(url); 
     } catch (IOException ex) { 

      ex.printStackTrace(); 

     } 

     resizeTimer = new Timer(250, new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent e) { 

       // Simple thread factory to start a slightly lower 
       // priority thread. 
       CoreThreadFactory.getUIInstance().execute(new ResizeTask()); 

      } 

     }); 

     resizeTimer.setCoalesce(true); 
     resizeTimer.setRepeats(false); 

    } 

    @Override 
    public void setBounds(int x, int y, int width, int height) { 

     super.setBounds(x, y, width, height); 

     resizeTimer.restart(); 

    } 

    @Override 
    protected void paintComponent(Graphics g) { 

     super.paintComponent(g); 

     Graphics2D g2d = (Graphics2D) g; 
     if (scaledImage != null) { 

      // This simply returns a rectangle that takes into consideration 
      //the containers insets 
      Rectangle safeBounds = UIUtilities.getSafeBounds(this); 

      System.out.println("scaledImage = " + scaledImage.getWidth() + "x" + scaledImage.getWidth()); 

      int x = ((safeBounds.width - scaledImage.getWidth())/2) + safeBounds.x; 
      int y = ((safeBounds.height - scaledImage.getHeight())/2) + safeBounds.y; 

      g2d.drawImage(scaledImage, x, y, this); 

     } 

    } 

    protected class ResizeTask implements Runnable { 

     @Override 
     public void run() { 

      synchronized (RESIZE_LOCK) { 

       if (image != null) { 

        int width = getWidth(); 
        int height = getHeight(); 

        System.out.println("width = " + width); 
        System.out.println("height = " + height); 

        // A simple divide and conquer resize implementation 
        // this will scale the image so that it will fit within 
        // the supplied bounds 
        scaledImage = ImageUtilities.getScaledInstanceToFit(image, new Dimension(width, height), ImageUtilities.RenderQuality.High); 

        System.out.println("scaledImage = " + scaledImage.getWidth() + "x" + scaledImage.getWidth()); 

        repaint(); // this is one of the few thread safe calls 

       } 

      } 

     } 

    } 

} 
+0

サンプルのthanx。問題は、メニューのようにすべてのものを取り込み、他のコンポーネントが失われてしまうことです。あなたは正しいです、私の問題は、ラベルが痛みのどの部分の中にiconimageのサイズを変更していないということです。 –

+0

それはあなたのメニューに影響してはいけません:P – MadProgrammer

+0

@trashgod OPの知識のレベルを知らずに、私は謙虚に聞こえたくはありませんでしたが、何が試されたのか分かりませんでした。基本:P – MadProgrammer

1

ベストオプションは、サブクラスのイメージアイコンにあると単純にペイントするそのpaintIconメソッドをオーバーライドし、私の呼び出しの代わりに、私は自分のライブラリに頼ってきましたが、それはあなた自身のコードの実装に合理的に簡単にする必要がありますGraphics.paint(x、y、width、height ...)を使用してイメージを作成します。

+1

おそらく不正なアイコンの実装です。getIconWidth/Heightは、iconの**固定幅**を指定する_an intを返すようにdoc'edされています - その場でサイズ変更することはできません。 – kleopatra

+0

IMHO私はあなたと思いますベースライン 'Icon'をとり、あなたのために必要なサイズの新しい' Icon'を生成するか、またはあなたのためにペイントすることができる何らかの 'Factory'でもっとうまくいきます。ただし、スケーリング操作が相当な場合(元の画像のサイズに応じて、0.1%または数百%に縮小するなど)、「EDT」を「停止」する危険性があります。私の例が示すように、リサイズ要求には「合体」アプローチを使用し、すべてのリクエストでリサイズするのではなく、通常は「アイドル」状態になると、できるだけ少ないリクエストでリサイズを試みます。しかしMHO – MadProgrammer

+0

@madProgrammer元のqをひどく言い訳して申し訳ありませんが、アイコン内の画像のサイズを変更したくありません。私は親コンポーネントを塗りつぶすためにイメージを伸ばすだけです。私はこの悪い言い回しがおそらくあなたの応答をねじ込んだことを知っていますが、私はなぜ私がやったことを試みたのかを願っています。 –

関連する問題