1

ImageIcon 機能を使用して JLabel 内に画像を表示しています。

JLabel は JPanel 内に含まれています。

画像がクリックされたときに、画像に対するマウスの位置を取得したい。

画像を含む JLabel にマウスリスナーを追加することで、この問題を解決しようとしています。

どうやら画像の幅と高さでJLabelのサイズを設定しても、自動的にJLabelがJPanelのサイズに引き伸ばされるようです。

したがって、以下のコードを実行すると、画像のサイズが JPanel よりも小さい場合、X および Y 位置を取得すると、不要な値が返されます。

マウスの X 位置と Y 位置を取得できるように、JLabel のサイズを具体的に制限する方法はありますか?

または、画像に対するマウスの位置を取得するより良い方法はありますか? (どちらが良いでしょう)

    ImageIcon icon = new ImageIcon(image);

    JLabel imageLabel = new JLabel(icon);
    imageLabel.setSize(image.getWidth(null), image.getHeight(null));

    imageLabel.addMouseListener(new MouseListener() {
        @Override
        public void mouseClicked(MouseEvent e) {
            JOptionPane.showMessageDialog(imageLabel, e.getX()+" "+e.getY());
        }
    });

    imageLabel.validate();
    panel.add(imageLabel);
    panel.validate();
4

4 に答える 4

2

レイアウトがすべてです。

上の画像については、この例を参照してください。


このユースケースにはGridBagLayoutまたはが必要なようですBoxLayout

于 2011-09-22T07:12:21.497 に答える
1

setSize() 呼び出しではなく、レイアウト マネージャーがラベルのサイズを制御しているため、問題が発生する可能性があります。

おそらく、画像を描画して paintComponent を実装する JPanel 派生クラス (JLabel ではなく) を作成します。次に、JPanel の getPreferredSize() と getMaximumSize() をオーバーライドして、画像のサイズを返します。

ラベルを使用すると、パディングやオフセットなどが発生するため、問題が発生します。

于 2011-09-22T05:51:29.077 に答える
1

it seems that JLabel automatically stretches out to the size of JPanel.

問題はここにあります

imageLabel.setSize(image.getWidth(null), image.getHeight(null));

1つしかない場合JLabel

myPanel.setLayout(new BorderLayout());//JPanel has by default FlowLayout
myPanel.add(myLabel, BorderLayout.CENTER)

Image/IconImage を持つ複数の JLabel があり、GridLayout をよりよく探す必要がある場合

編集

すべての場合(実際の写真について)何よりも前に

1) 画像比率 3:2、4:3 16:10 を決定する必要があります ...、CropRatio を決定してから、次のことを行う必要があります。

  • setPreferredSize(new Dimension(x/cropRatio, y/cropRatio)) for JLabel

  • paintComponent g2d.fillRect (0, 0, x/cropRatio, y/cropRatio);を使用して

2) JLabel をJScrollPaneに配置しますが、元のピクセル量が保持されます

于 2011-09-22T05:53:42.610 に答える
0

レイアウトマネージャーがsetSize()呼び出しではなく、ラベルのサイズを制御しているため、おそらく問題が発生します。

画像を描画してpaintComponentを実装するJPanel派生クラス(JLabelではなく)を作成する可能性があります。次に、JPanelのgetPreferredSize()とgetMaximumSize()をオーバーライドして、画像のサイズを返します。

ラベルを使用すると、パディングなどが発生するため、問題が発生します。

しかし、結局、私たちのラベルを拡大させているのはレイアウトマネージャーです。必要なことを行う最も簡単な方法は、コンポーネントを適切なサイズに保つレイアウトマネージャーを選択して、レイアウトマネージャーがラベルを展開していないことを確認することです。

于 2011-09-22T06:02:34.060 に答える