2017-01-28 12 views
0

初めてのポスターです!MouseListenerにJLabelを追加

私はJavaフォトビューアギャラリーに取り組んでいます。 私はにArrayListからMouseListenerにすべてのラベルを追加したい。だから私は新しい大きなウィンドウでユーザーがクリックした画像を開いて開くことができます。

私は、ユーザーがiピクチャの数を選択できるファイルチューザを持っています。私はそれらをスケーリングし、それらを入れて:

ArrayListスケーリング=新しいArrayList();

エラー:型部品における方法addMouseListener(のMouseListener)は引数に適用されない(新規のActionListener(){})

Iは

for (int i=0; i< scaled.size(); i++){ 
         panel.add(new JLabel(new ImageIcon (scaled.get(i)))); 
         JLabel l = new JLabel(new ImageIcon(scaled.get(i))); 
         l.addMouseListener(this); //<- Compiler Error 

         } 

に完全なコードを使用しようとします。

import java.awt.GridLayout; 
import java.awt.Image; 
import java.awt.Label; 
import java.awt.List; 
import java.awt.event.*; 
import java.io.*; 
import java.util.ArrayList; 
import java.util.Arrays; 

import javax.swing.*; 




public class ImageViewer { 

    public static void main(String[] args) { 

     JFrame frame = new ImageViewerFrame(); 
     frame.setTitle("PhotoViewer"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setVisible(true); 
    } 

} 



@SuppressWarnings("serial") 
class ImageViewerFrame extends JFrame implements MouseListener{ 
    JLabel label; 
    JFileChooser chooser; 
    JMenuBar menubar; 
    JMenu menu; 
    JMenuItem menuitem; 

    JPanel panel = new JPanel(); 
// JLabel l1= new JLabel("First"); 
// JLabel l2= new JLabel("Second"); 
// JLabel l3= new JLabel("Third"); 
// JLabel l4= new JLabel("Fourth"); 




    public ArrayList<File> images = new ArrayList <File>(); 

    public ImageViewerFrame() { 
     setSize(500,500); 

     panel.setLayout(new GridLayout(0,5)); 

     label = new JLabel(); 
     add(label); 
     add(panel); 
     JButton test = new JButton ("TEST"); 
     test.addMouseListener(this); 
     panel.add(test); 
     panel.setVisible(true); 
     chooser = new JFileChooser(); 
     chooser.setCurrentDirectory(new File(".")); 
     chooser.setMultiSelectionEnabled(true); 
     menubar = new JMenuBar(); 
     setJMenuBar(menubar); 

     menu = new JMenu("File"); 
     menubar.add(menu); 

     menuitem = new JMenuItem("Open"); 
     menu.add(menuitem); 
     ArrayList<ImageIcon> AL = new ArrayList<ImageIcon>(); 

     ArrayList<Image> scaled = new ArrayList<Image>(); 




     menuitem.addActionListener(new ActionListener() { 
       public void actionPerformed(ActionEvent event){ 

         int result = chooser.showOpenDialog(null); 

         if(result == JFileChooser.APPROVE_OPTION) { 

          //label.setIcon(new ImageIcon(name)); 

          File[] f = chooser.getSelectedFiles(); 

          for(int i=0; i< f.length; i++) 
          { 
           images.add(f[i]); 
           ImageIcon imageicon = new ImageIcon(f[i].toString()); 
           AL.add(imageicon); 

          }  

          for (ImageIcon x : AL){ 
           System.out.println(x); 
           Image image = x.getImage(); 
           Image newimg = image.getScaledInstance(120,120, java.awt.Image.SCALE_SMOOTH); 
           scaled.add(newimg); 
          } 


          for (int i=0; i< scaled.size(); i++){ 
           panel.add(new JLabel(new ImageIcon (scaled.get(i)))); 
           JLabel l = new JLabel(new ImageIcon(scaled.get(i))); 
           l.addMouseListener(this); 


          } 




                   } 
            } 
          }); 




    } 






    @Override 
    public void mouseClicked(MouseEvent arg0) { 


    } 







    @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 

    } 

} 
+0

どうしますか? – user7185318

+0

明確にしないと申し訳ありません。 JLabel lをMouseListenerに追加することはできません – StackOverFlowUser1997

+0

MyListenerのようなMouseListenerの内部クラスを作成してから、そのabtractメソッドを実装してみてください。あなたのforループでは、l.addMouseListener(new MyMouseListener()); また、オラクルのドキュメント[MouseListener](http://docs.oracle.com/javase/tutorial/uiswing/events/mouselistener)も参照してください。htmlの)Imが間違っている場合 –

答えて

1

It wont let me add the JLabel l to the MouseListener

あなたがのMouseListenerにラベルを追加していないまず第一に。ラベルにMouseListenerを追加します。 MouseListenerインターフェイスを実装していないので、コンパイルエラーが発生します。すべてのメソッドを実装する必要があります(mousePressed、mouseReleased ...)。

動作例については、「MouseListenerを書き込む方法」のSwingチュートリアルのセクションを参照してください。

また、MouseListenerが機能すると、2つのラベルを作成する必要はありません。基本コードは次のようになります。

JLabel l = new JLabel(new ImageIcon(scaled.get(i))); 
label.addMouseListener(this); //<- Compiler Error 
panel.add(label); 

最後に、JListを使用してアイコンを表示することを検討してください。イメージをレンダリングするだけで効率的です。次に、画像が選択されたときにListSelectionListenerを使用して処理を実行できます。詳細は、How to Use ListsのSwingチュートリアルのセクションを参照してください。

+0

は私を修正して、それは言う: クラスImageViewerFrameはJFrameのはのMouseListener はので、私は「これは」あなたのコード内のActionListenerクラスではなく、 'ImageViewerFrame'クラスを指し、StackOverFlowUser1997 @のMouseListener – StackOverFlowUser1997

+0

を実施して実装して拡張します。 "ImageViewerFrame.this"をパラメータとして使用してみてください。 – camickr

+0

( "ImageViewerFrame.this"をパラメータとしています)これまでのところよく見えます。私はまだテスト中です。問題が解決したら、お返事ありがとうございます。 – StackOverFlowUser1997

0

すべてのマウス情報を格納するために配列を使用します。 例:

public class MyApp extends JFrame implements MouseListener, MouseWheelListener { 

    public int[] mouse=new int[5]; 

    public void mousePressed(MouseEvent m) { 
     if (m.getButton() == m.BUTTON1) { 
      mouse[2]=1; 
     } 
     if (m.getButton() == m.BUTTON2) { 
      mouse[3]=1; 
     } 
     if (m.getButton() == m.BUTTON3) { 
      mouse[4]=1; 
     } 
    } 
    public void mouseClicked(MouseEvent m) { 
     if (m.getButton() == m.BUTTON1) { 
      mouse[2]=3; 
     } 
     if (m.getButton() == m.BUTTON2) { 
      mouse[3]=3; 
     } 
     if (m.getButton() == m.BUTTON3) { 
      mouse[4]=3; 
     } 
    } 
    public void mouseReleased(MouseEvent m) { 
     if (m.getButton() == m.BUTTON1) { 
      mouse[2]=2; 
     } 
     if (m.getButton() == m.BUTTON2) { 
      mouse[3]=2; 
     } 
     if (m.getButton() == m.BUTTON3) { 
      mouse[4]=2; 
     } 
    } 
    public void mouseEntered(MouseEvent m) { 
    } 
    public void mouseExited(MouseEvent m) { 
    } 
    public void mouseWheelMoved(MouseWheelEvent w) { 
     mouse[3]=w.getWheelRotation(); 
    } 
    public MyApp() { 
     super("MyApp"); 
     //Do your stuff here... 
     //... 
     //... 
     setTitle("Image Picker"); 
     requestFocus(); 
     addMouseListener(this); 
     addMouseWheelListener(this); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setSize(1400,1000); 
     setResizable(true); 
     setVisible(true); 
     int gc=0; 
     Rectangle r; 
     while (true){ 
      try { 
      Thread.sleep(33); 
      } catch(InterruptedException bug) { 
      Thread.currentThread().interrupt(); 
      System.out.println(bug); 
      } 
      r=getComponents()[0].getBounds(); 
      gc=gc+1; 
      if (gc==500) { 
       System.gc(); 
       gc=0; 
      } 
      mouse[0]=MouseInfo.getPointerInfo().getLocation().x-getComponents()[0].getLocationOnScreen().x; 
      mouse[1]=MouseInfo.getPointerInfo().getLocation().y-getComponents()[0].getLocationOnScreen().y; 
      //Display labels 
     } 
    } 

    public static void main(String args[]){ 
     new MyApp(); 
    } 
} 

mouse配列は次のようになります。

mouse[0] - mouse x pos 
mouse[1] - mouse y pos 
mouse[2] - left mouse button 
mouse[3] - middle mouse button 
mouse[4] - right mouse button 
mouse[5] - mouse wheel rotation, 0 if none, else -n to n 

そして、ポイント(マウス)長方形(ラベル)を超えているかどうかを確認することは容易でなければなりません。ラベルの位置を知る方法がわからない場合は、次のコードを使用してください。

Rectangle r=getComponents()[1+n].getBounds(); 
//r.x, r.y, r.width, r.height 

希望します!

関連する問題