사용자가 스크롤 할 때 JScrollPane
에서 이벤트를 처리해야합니다. here에는 을 JViewport
또는 Vertical/HorizontalScrollBar 중 하나에 사용하는 것이 좋습니다.JScrollPane adjustmentListener 및 scrollRectToVisible
어떤 차이가 있습니까? 어떤 방법을 선택해야합니까?
또한이 JScrollPane
에 scrollRectToVisible
을 사용하고 싶습니다.이 방법으로 AdjustmentListener
을 사용해야합니까?
또한 scrollRectToVisible
이 필요한 직사각형으로 표시되도록 최소 스크롤을 시도하는지 또는 JViewport
중간에 표시하려고하는지 궁금합니다.
UPD : 요구 사항 :
1) 많은 JLabel의 (이미지 아이콘을 가지고 하나 인 JPanel)와 JScrollPane의, 그래서 그들 중 일부는 볼 수가 없습니다.
2) 네트워크 이벤트가 발생하면 사용자에게 JLabel (표시 가능) 중 하나를 표시해야합니다. 원래 표시되어 있지 않으면 JScrollPane이 자동으로 스크롤됩니다. 그것이 내가 scrollRectToVisible
을 언급 한 이유입니다.
3) 위의 ImageIcon이있는 JLabel에서이 요소에 어떤 현상이 발생했는지 설명하는 메시지를 표시해야합니다. 이 메시지는 현재 계층 구조가 훨씬 높은 JLayeredPane 덕분에 수레가있는 다른 JLabel로 구현됩니다. 문제는, JLabel가 대응하는 JLabel (ImageIcon)의 최상부에있을 필요가있는 것에 따라, JLabel가 움직여야한다고 JScrollPane를 스크롤했을 경우입니다.
UDP2 : 아직 JLabel의 부동 구현하지 않은,하지만 이미 내가 scrollRectToVisible
에 인덱스 (11 개) 반응하여 레이블이가 반립니다 때문에 얼마나 마음에 들지
SSCCE. 대답의
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
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.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.SwingUtilities;
public class JScrollPaneTest {
protected ArrayList<JLabel> labels = new ArrayList<JLabel>();
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() {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
JPanel panel1 = new JPanel();
panel1.setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
for (int i = 0; i < 20; i++) {
JLabel label = new JLabel(" | Label" + i + " | ");
panel1.add(label, gbc);
labels.add(label);
}
panel1.addMouseListener(new MouseAdapter(){
public void mousePressed (MouseEvent me) {
JLabel label = labels.get(11);
label.scrollRectToVisible(label.getBounds());
}
});
JScrollPane pane = new JScrollPane(panel1) {
private static final long serialVersionUID = 1L;
@Override
public Dimension getPreferredSize() {
return new Dimension(600, 400);
}
};
pane.getHorizontalScrollBar().addAdjustmentListener(new AdjustmentListener() {
@Override
public void adjustmentValueChanged(AdjustmentEvent e) {
System.out.println("adjustmentValueChanged: " + e);
}
});
frame.getContentPane().add(pane);
frame.pack();
frame.setVisible(true);
}
});
}
}
JComponent의이 JScrollPane의에 배치하면 스크롤 구현했습니다 달려 될 수 – mKorbel
당신이 정말로 요구 사항에 생각하기 시작한다 (예상 솔루션 대비) : 무엇을 달성하고 싶습니까? – kleopatra
@kleopatra 요구 사항을 추가했습니다. –