0

この質問は、前の質問に関連しています。GridBaglayout から直交座標 (x,y) を生成する方法は?

各画像の座標は取得できたのですが、(System.out.println)で座標と画面上の画像の配置を確認したところ、間違っているようです。たとえば、画面上で最初の画像の x ポイントが座標 20 のセル 2 にあることが明らかな場合、プログラムは x=1 を示します。

コードの一部を次に示します。

public Grid (){

  setPreferredSize(new Dimension(600,600)); 
  ....
  setLayout(new GridBagLayout());
  GridBagConstraints gc = new GridBagConstraints();
  gc.weightx = 1d; 
  gc.weighty = 1d;
  gc.insets = new Insets(0, 0, 0, 0);//top, left, bottom, and right 
  gc.fill = GridBagConstraints.BOTH; 

  JLabel[][] label = new JLabel[ROWS][COLS];         
  Random rand = new Random();

  // fill the panel with labels
  for (int i=0;i<IMAGES;i++){
    ImageIcon icon = createImageIcon("myPics.jpg");
    int r, c;
    do{   
  //pick random cell which is empty
     r = (int)Math.floor(Math.random() * ROWS);
        c = (int)Math.floor(Math.random() * COLS); 
    } while (label[r][c]!=null);

    //randomly scale the images                
    int x = rand.nextInt(50)+30;
    int y = rand.nextInt(50)+30;                  
    Image image = icon.getImage().getScaledInstance(x,y, Image.SCALE_SMOOTH);
    icon.setImage(image);

    JLabel lbl = new JLabel(icon); // Instantiate GUI components 
    gc.gridx = r;
    gc.gridy = c;         
    add(lbl, gc); //add(component, constraintObj);         
    label[r][c] = lbl; 
}

このコードで座標を確認しました:

Component[] components = getComponents();     
for (Component component : components) {
   System.out.println(component.getBounds());
}
4

2 に答える 2

1

とを使用して、画面座標とコンポーネント座標を変換できます。SwingUtilities convertPointToScreen()convertPointFromScreen()

補遺: これは、レイアウト マネージャーの影響下でコンポーネントがどのように移動し、サイズ変更されるかを理解しようとするときに使用した簡単な例です。

public class MyPanel extends JPanel {

    public MyPanel() {
        super(new GridLayout(4, 4));
        for (int i = 0; i < 16; i++) {
            JPanel panel = new JPanel(new GridLayout());
            panel.add(new CenterLabel());
            this.add(panel);
        }
    }

    private static void create() {
        JFrame f = new JFrame();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.add(new MyPanel());
        f.pack();
        f.setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                create();
            }
        });
    }

    private static class CenterLabel extends JLabel {

        public CenterLabel() {
            this.setHorizontalAlignment(JLabel.CENTER);
            this.setVerticalAlignment(JLabel.CENTER);
            this.setOpaque(true);
            this.setBackground(Color.lightGray);
            this.setBorder(BorderFactory.createLineBorder(Color.blue));
            this.setPreferredSize(new Dimension(160, 100));
            this.addComponentListener(new ComponentAdapter() {

                @Override
                public void componentResized(ComponentEvent e) {
                    int w = e.getComponent().getWidth();
                    int h = e.getComponent().getHeight();
                    CenterLabel.this.setText("[" + w/2 + "\u253C" + h/2 + "]");
                }
            });
        }
    }
}
于 2010-03-07T17:05:43.210 に答える
1

画面上で、最初の画像の x ポイントが座標 20 のセル 2 にあることが明らかな場合、プログラムは x=1 を示します。

最初の画像の x/y 座標は 0/0 です。2 番目の画像の座標は 1/0 になります。0 からのオフセットの X/Y 値。それはあなたが話していることですか?

または、リスナーがパネルではなく画像に追加されている場合、画像座標をパネル座標に変換する必要があります。これを行うメソッドについては、SwingUtilities クラスを確認してください。

さらにヘルプが必要な場合は、SSCCEを投稿してください。

于 2010-03-07T17:12:55.670 に答える