2012-11-29 1 views
2

JScrollPane 안에 20 JLabel가 있습니다. 위에서 언급 한 JscrollPane과 함께 JLayeredPane에 floatingLabel이 추가되었습니다.JLabel을 JScrollPane 내에서 같은 JComponent 위에 띄우는 방법

요구 사항은 내가 JScrollPane 내부를 클릭 할 때 자동으로 스크롤해야 인덱스 11 완전히 볼과 JLabel을 만들 것입니다. 또한 사용자가 JScrollPane을 스크롤 할 때 부동 소수점 숫자가 JLabel 11 위에 떠 있어야합니다 (AdjustmentListener 참조).

문제점 [편집] : 1. JLabel 11이 완전히 또는 부분적으로 보이지 않게되는지 확인하는 방법은 무엇입니까?

SSCCE :

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.GridBagConstraints; 
import java.awt.GridBagLayout; 
import java.awt.Point; 
import java.awt.event.AdjustmentEvent; 
import java.awt.event.AdjustmentListener; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import java.util.ArrayList; 

import javax.swing.BorderFactory; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JLayeredPane; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.SwingUtilities; 

public class JScrollPaneTest { 
    protected ArrayList<JLabel> labels = new ArrayList<JLabel>(); 
    protected JLabel floatingLabel = new JLabel("floating"); 
    protected JFrame frame; 
    protected JScrollPane sPane; 
    protected JLayeredPane lPane; 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       new JScrollPaneTest(); 
      } 
     }); 
    } 

    public JScrollPaneTest() { 
     EventQueue.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       frame = new JFrame(); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setLayout(new BorderLayout()); 

       lPane = new JLayeredPane() { 
        private static final long serialVersionUID = 1L; 

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

       JPanel panel = new JPanel(); 

       panel.setLayout(new GridBagLayout()); 
       GridBagConstraints gbc = new GridBagConstraints(); 

       for (int i = 0; i < 20; i++) { 
        JLabel label = new JLabel(" | Label" + i + " | "); 
        panel.add(label, gbc); 
        labels.add(label); 
       } 

       panel.addMouseListener(new MouseAdapter(){ 
        public void mousePressed (MouseEvent me) { 
         JLabel label = labels.get(11); 
         label.scrollRectToVisible(label.getBounds()); 

         Point loc = label.getLocation(); 
         Point wrPos = SwingUtilities.convertPoint(label, loc, lPane); 
         floatingLabel.setLocation(wrPos); 
         floatingLabel.setVisible(true); 
        } 
       }); 

       sPane = new JScrollPane(panel) { 
        private static final long serialVersionUID = 1L; 

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

       sPane.getHorizontalScrollBar().addAdjustmentListener(new AdjustmentListener() { 
        @Override 
        public void adjustmentValueChanged(AdjustmentEvent ae) { 
         System.out.println("adjustmentValueChanged: " + ae.getValue()); 

         //if label11 is not visible 
         //floatingLabel.setVisible(false); 
         //else floatingLabel.setLocation(); 
        } 
       }); 

       lPane.add(sPane, JLayeredPane.PALETTE_LAYER); 
       sPane.setBounds(100, 100, (int)sPane.getPreferredSize().getWidth(), (int)sPane.getPreferredSize().getHeight()); 

       lPane.add(floatingLabel, JLayeredPane.POPUP_LAYER); 
       floatingLabel.setBounds(100, 100, 50, 30); 
       floatingLabel.setBorder(BorderFactory.createLineBorder(Color.red)); 

       frame.getContentPane().add(lPane); 
       frame.pack(); 
       frame.setVisible(true); 
      } 
     }); 
    } 
} 

해결 문제 :

  1. 의 JLabel (11)가 반
  2. 내가 클릭
  3. 에 floatingPanel에 대한 적절한 위치를 계산하는 데 실패립니다, 클릭 후 완전히 볼 수 없습니다
  4. 스크롤 할 때 새 위치를 계산하는 방법을 모르겠습니다.
대신 클릭으로
+0

당신은 뷰포트 RECT를 사용할 수 없습니다? – StanislavL

+0

@ StanislavL, 문제 # 1에 대해 어떻게? –

+0

SwingUtilities.invokeLater() 내에서 호출을 둘러싸고 올바르게 rect 계산을 완료하고 rect 내에 레이블 범위가 있는지 확인하십시오. – StanislavL

답변

3
label.scrollRectToVisible(new Rectangle(0,0,label.getWidth(), label.getHeight())); 

사용이

public void mousePressed (MouseEvent me) { 
    JLabel label = labels.get(11); 
    label.scrollRectToVisible(new Rectangle(0,0,label.getWidth(), label.getHeight())); 

    //Point loc = label.getLocation(); 
    Point loc = new Point(0,0); 
    Point wrPos = SwingUtilities.convertPoint(label, loc, lPane); 
    floatingLabel.setLocation(wrPos); 
    floatingLabel.setVisible(true); 
} 

public void adjustmentValueChanged(AdjustmentEvent ae) { 
    System.out.println("adjustmentValueChanged: " + ae.getValue()); 

    JLabel label = labels.get(11); 

    Point loc = new Point(0,0); 
    Point wrPos = SwingUtilities.convertPoint(label, loc, lPane); 
    floatingLabel.setLocation(wrPos); 
    floatingLabel.setVisible(true); 
} 
+0

(기침) 어때요 ... 선행 국경에 맞추는 코드? – kleopatra

+1

나는 너무 게으르다 ... IDE에서 복사/붙여 넣기는 :-) – StanislavL

+0

당신은 위대하다! 그것은 작동합니다. @kleopatra, JLabel11이 floatingLabel을 숨기려면 완전히/부분적으로 보이지 않는지 확인하는 방법을 알고 계십니까? –

관련 문제