1

JFrame で画像の場所を設定しようとしています。label.setLocation(100, 100);と思いました。画像の位置を 100, 100 (左上隅) に設定しますが、配置しても何もしないようです。私もpanal.setLocation(100、100)を試しました。どちらも何もしません。エラーは発生せず、画像は表示されますが、0, 0 に表示されます。何が間違っていますか? これが私のコードです:

import javax.swing.*;  

public class DisplayImage {  
    public DisplayImage() {  
        JFrame frame = new JFrame("Display Image");  
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  

        JPanel panel = (JPanel)frame.getContentPane();  

        JLabel label = new JLabel();  
        label.setIcon(new ImageIcon("src/img/school.png"));
        label.setLocation(100, 100);
        panel.add(label);  

        frame.setLocationRelativeTo(null);  
        frame.pack();  
        frame.setVisible(true);  
    }  

    public static void main (String args[]) {  
        SwingUtilities.invokeLater(new Runnable() {  
            public void run() {  
                new DisplayImage();  
            }  
        });  
    }  
}  
4

3 に答える 3

4

デフォルトでは、JFrame は BorderLayout を使用します。ラベルをフレームに追加すると、ラベルは BorderLayout の CENTER に追加されます。レイアウト マネージャーは場所をオーバーライドします。

簡単な解決策の 1 つは、EmptyBorder をラベルに追加して、上部/左側のインセットを 100 にすることです。次に、ラベルを中央に追加する代わりに、北にラベルを追加します。コードは次のようになります。

label.setBorder( new EmptyBorder(...) );
panel.add(label, BorderLayout.SOUTH);

原則として、コンポーネントの正確な位置を指定しようとするべきではありません。レイアウトマネージャーに仕事をさせてください。

于 2013-05-21T00:06:40.680 に答える
3

JFrame、デフォルトでBorderLayoutレイアウト マネージャとして を使用します。これにより、メソッドに指定した設定が上書きされますsetLocation

いくつかのオプションがあります...

  • のようなものを使用JLayeredPaneします。これは、デフォルトでは独自のレイアウトマネージャーが設定されていませんが、デフォルトで設定されています。詳細については、レイヤード ペインの使用方法を参照してください。
  • 必要な場所に画像をレンダリングできるカスタム コンポーネントを作成します。詳細については、カスタム ペインティングの実行を参照してください。
  • 必要な操作を実行する独自のレイアウト マネージャーを作成します...
于 2013-05-21T00:10:42.790 に答える
0

これは私のために働く:

import java.awt.Dimension;
import javax.swing.*;  

public class DisplayImage {  
    public DisplayImage() {  
        JFrame frame = new JFrame("Display Image");  
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  

        JPanel panel = (JPanel)frame.getContentPane();  
        panel.setLayout(null);

        JLabel label = new JLabel();  
        label.setIcon(new ImageIcon("rails.png"));
        panel.add(label);
        Dimension size = label.getPreferredSize();
        label.setBounds(100, 100, size.width, size.height);

        frame.setSize(300, 200);
        frame.setVisible(true);  
    }  

    public static void main (String args[]) {  
        SwingUtilities.invokeLater(new Runnable() {  
            public void run() {  
                new DisplayImage();  
            }  
        });  
    }  
}  

しかし、あなたはこれを読むべきです:

http://docs.oracle.com/javase/tutorial/uiswing/layout/none.html

于 2013-05-21T00:27:12.820 に答える