0

私のプログラムでやりたいことは、画像をクリックすると、JOptionPane と一緒に四角形が出てくることです。ただし、ポップアップするのは JOptionPane だけです。

メソッドを変更してクラスを追加しようとしましたが、何も機能しませんでした >.< 誰でも私の問題に光を当てることができますか? これが私のコードのスニペットです。

以下は、写真を選択できるようにするファイルチューザーを呼び出す場所です。また、ラベルのようなものは他にもたくさんあります。

public Help(){

        fc.setDialogTitle("Choose an image file to begin:");
        int returnval = fc.showOpenDialog(null);
        if (returnval == JFileChooser.APPROVE_OPTION){ //when user selects a file, value returned will be JFileChooser.APPROVE_OPTION
            File file = fc.getSelectedFile(); //the File value of the selection is returned from a call on getSelectedFile
            try{
                image = ImageIO.read(file); //reads and loads File as image
            }
            catch (IOException e){}
                System.out.println("You chose to open this file: " + file.getName());
        }else
            System.out.println("No file selected.");

        icon = new ImageIcon(image);
        label = new JLabel(icon);
        tagName = new JLabel(input);

        label.addMouseListener(new ImagePanel());
        label.addMouseMotionListener(new ImagePanel());
        panel.add(tagName);
    }

最後に、厄介な paintComponent を含む ImagePanel クラスです。また、いくつかの mouseListeners。

class ImagePanel extends JPanel implements MouseListener, MouseMotionListener{

        @Override
        public void mouseClicked(MouseEvent event) {
            // TODO Auto-generated method stub

                x = event.getX();
                y = event.getY();

                input = JOptionPane.showInputDialog("Enter tag name");
                tagName.setText("You have tagged: " + input);
                System.out.println(input);
        }

        @Override
        public void mouseEntered(MouseEvent arg0) {
            // TODO Auto-generated method stub

        }

        @Override
        public void mouseExited(MouseEvent arg0) {
            // TODO Auto-generated method stub

        }

        @Override
        public void mousePressed(MouseEvent arg0) {
            // TODO Auto-generated method stub

        }

        @Override
        public void mouseReleased(MouseEvent arg0) {
            // TODO Auto-generated method stub

        }

        public void paintComponent(Graphics g){
            super.paintComponent(g);

                if(image != null && isRectPresent){
                    g.setColor(Color.DARK_GRAY);
                    g.drawRect(x-50, y-50, 100, 100);
                }
        }   

        @Override
        public void mouseDragged(MouseEvent e) {
            // TODO Auto-generated method stub
        }

        @Override
        public void mouseMoved(MouseEvent e) {
            // TODO Auto-generated method stub
        }
    }

コードをコンパイルして、自分の目で確かめることができます。何をすればよいかご存じでしたら、お知らせください :) どうもありがとうございました。

4

3 に答える 3

2

あらゆる種類の奇妙なもの:

label.addMouseListener(new ImagePanel());
label.addMouseMotionListener(new ImagePanel()); 

コンポーネントにリスナーを追加するためだけに新しい JPanel を作成するべきではありません。すでにパネルのインスタンスがあります。

addMouseMotionListener(this);  

描画メソッドのコンポーネントにリスナーを追加しないでください。描画メソッドがいつ呼び出されるかを制御することはできず、同じリスナーが複数回追加されることになります。

于 2011-11-23T16:31:49.740 に答える
1

注:小さな例は以前に回答されていたでしょう。

マウスイベントxおよびyを、ImagePanelの自己定義フィールドに、次のような他の名前で割り当てます。

int mx;
int my;

実験する他のことは、super.paintComponentを除外することです。さらに、gでより多くのメソッドを使用したい場合があります。

Graphics2D g2 = (Graphics2D)g;

(基本クラスxおよびyに割り当てることは、決して良い考えではありません。座標の変更などには、setBoundsを使用することをお勧めします。)

于 2011-11-23T13:52:18.787 に答える
0
  try{
       image = ImageIO.read(file); //reads and loads File as image
   }
   catch (IOException e){}

ここで、コードは次のように述べています。問題を無視することは常に悪いことです。少なくとも問題を印刷して続行できます。

  try{
      image = ImageIO.read(file); //reads and loads File as image
  }
  catch (IOException e){
     e.printStackTrace();//print the exception
  }

または、問題を印刷して停止します。

  try{
      image = ImageIO.read(file); //reads and loads File as image
  }
  catch (IOException e){
     e.printStackTrace();//print the exception
     System.exit(0);//stop executing
  }

実際の問題はおそらくここにあります:

if(image != null && isRectPresent){
   g.setColor(Color.DARK_GRAY);
   g.drawRect(x-50, y-50, 100, 100);
}

問題は、if条件がfalse(画像がない(おそらくそれを読み取る例外があった...?)および/または isRectPresent is false)であるため、何もしないことだと思います!にブレーク ポイントを含め、ifデバッグ モードでプログラムを起動し、変数を検査しimageisRectPresentプログラムがこのポイントに到達したときを調べます。(そこに到達しない場合は、別の問題が発生したことがわかります。)頑張ってください!

于 2011-11-23T14:13:48.713 に答える