2011-07-05 8 views
0

JScrollPane内にJPanelがあります。 JPanelにはマウスイベントに反応するようにMouseListenerが添付されています。親JComponentにJPanelを直接追加すると(その間のJScrollPaneを除く)、すべて正常に動作します。 JScrollPaneをミックスに追加すると、JPanelのイベントハンドラに送信されたマウス座標は、すべてx軸とy軸の両方に正のオフセットを持ちます。JScrollPane内のJPanelでのマウス座標のオフセット

例(JPanelの上でマウスリスナー):

public void mousePressed(MouseEvent ev) { 
    System.out.println(ev.getPoint()); 
    System.out.println(this.getMousePosition()); 
} 

私はJPanelの代わりに、(0,0)の左上隅をクリックして、私は(5,60)のようなものを取得する機能の両方からしばらく(JPanelのサイズが600x400の場合)は(605,460)を返します。この線形オフセットがどこから来たのか?

編集:私は単純なテストケースに縮小し、期待どおりに動作します。だから、私の周囲のコードのなかで、この動作を引き起こすものでなければなりません。

public class JScrollPaneTest { 
public static void main(String[] args) { 
    JFrame window = new JFrame(); 
    window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  
    window.getContentPane().setLayout(new BorderLayout()); 
    MyPanel panel = new MyPanel(); 
    window.getContentPane().add(new JScrollPane(panel), BorderLayout.CENTER); 

    window.setSize(new Dimension(600, 400)); 
    window.setVisible(true); 

} 

} 

public class MyPanel extends JPanel implements MouseListener, Scrollable { 
public MyPanel() { 
    setLayout(null); 
    addMouseListener(this); 
    this.setAutoscrolls(true); 
} 

@Override 
public Dimension getPreferredSize() { 
    return new Dimension(2000, 2000); 
} 

@Override 
public void mousePressed(MouseEvent ev) { 
    System.out.println("Event mouse position: " + ev.getPoint()); 
    System.out.println("Panel mouse position: " + this.getMousePosition()); 
} 
} 
+0

*「JPanelにはMouseListenerが添付されています。」*私のベスト・ベットは、「MouseListener」が別のものに添付されていることです。そうでないことを証明するために、** mMorbel **によって投稿されたような[SSCCE](http://pscode.org/sscce.html)を投稿してください。 –

+0

JPanel/JScrollPaneの作成方法を含め、拡張コードのサンプルを使用せずに、これを診断することは困難です。理想的には、記述した2つの状況を示す2つのサンプルを投稿することが理想的です。 –

+0

'JPanel'のデフォルトレイアウトは' FlowLayout'です。 @ mKorbelの答えに対するコメントを見てください。 – trashgod

答えて

3

この例に基づいて問題を再現できますか?

import java.awt.*; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseListener; 
import javax.swing.*; 
import javax.swing.border.LineBorder; 

public class MainViewPort { 

    public static void main(String[] args) { 
     JPanel viewportPanelTop = new JPanel(); 
     JPanel viewportPanelBottom = new JPanel(); 
     JPanel viewportPanel = new JPanel(); 
     viewportPanel.setBackground(Color.BLACK); 
     viewportPanel.setPreferredSize(new Dimension(1000, 1000)); 
     JPanel viewportPanel1 = new JPanel(); 
     viewportPanel1.setBackground(Color.red); 
     JPanel viewportPanel2 = new JPanel(); 
     viewportPanel2.setBackground(Color.blue); 
     JPanel viewportPanel3 = new JPanel(); 
     viewportPanel3.setBackground(Color.cyan); 
     JPanel viewportPanel4 = new JPanel(); 
     viewportPanel4.setBackground(Color.yellow); 
     JPanel viewportPanel5 = new JPanel(); 
     viewportPanel5.setBackground(Color.LIGHT_GRAY); 
     JPanel viewportPanel6 = new JPanel(); 
     viewportPanel6.setBackground(Color.magenta); 
     viewportPanel.setLayout(new GridLayout(3, 2)); 
     viewportPanel.add(viewportPanel1); 
     viewportPanel.add(viewportPanel2); 
     viewportPanel.add(viewportPanel3); 
     viewportPanel.add(viewportPanel4); 
     viewportPanel.add(viewportPanel5); 
     viewportPanel.add(viewportPanel6); 

     viewportPanel.addMouseListener(new MouseListener() { 

      @Override 
      public void mouseClicked(MouseEvent e) { 
       System.out.println(e.getPoint()); 
      } 

      @Override 
      public void mousePressed(MouseEvent e) { 
      } 

      @Override 
      public void mouseReleased(MouseEvent e) { 
      } 

      @Override 
      public void mouseEntered(MouseEvent e) { 
      } 

      @Override 
      public void mouseExited(MouseEvent e) { 
      } 
     }); 

     JScrollPane scrollPane = new JScrollPane(); 
     scrollPane.setPreferredSize(new Dimension(800, 600)); 
     scrollPane.setBackground(Color.BLUE); 
     scrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED); 
     scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED); 
     scrollPane.getViewport().add(viewportPanel); 
     scrollPane.getViewport().setViewPosition(new Point(0, 0)); 
     scrollPane.getViewport().setBackground(Color.red); 
     scrollPane.setBorder(new LineBorder(Color.black, 2)); 

     JFrame frame = new JFrame(); 
     frame.setTitle("Viewport JFrame"); 
     frame.setLocation(150, 150); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setLayout(new BorderLayout()); 
     frame.add(viewportPanelTop, BorderLayout.NORTH); 
     frame.add(scrollPane, BorderLayout.CENTER); 
     frame.add(viewportPanelBottom, BorderLayout.SOUTH); 
     frame.pack(); 
     frame.setVisible(true); 
    } 

    private MainViewPort() { 
    } 
} 
+0

+1良い[sscce](http://sscce.org/)。あなたの明示的なレイアウトが鍵です。 'FlowLayout'がOPの原因です。 'MouseAdapter'はaproposですか? – trashgod

+0

@trashgod goooood :-)はい私はもともとそこにMouseMotionListenerを入れたいと思っていましたが、私の無限のlayzyness :-)とOPは大きく消散しました。 – mKorbel

関連する問題