當用戶滾動它時,我需要處理來自JScrollPane
的事件。在here建議使用addAdjustmentListener
到JViewport
或Vertical/HorizontalScrollBar。JScrollPane adjustmentListener和scrollRectToVisible
有什麼區別,我應該選擇哪種方法?
我也想使用scrollRectToVisible
爲相同的JScrollPane
,我應該預計AdjustmentListener
工作這種方法?
另外我想知道是否scrollRectToVisible
試圖做最低限度的滾動,使所需的矩形可見或試圖使其在JViewport
的中間可見?
UPD:要求:
1)有一個的JPanel其中有許多的JLabel(ImageIcon的)一個JScrollPane,因此他們中的一些是不可見的。
2)當網絡事件發生時,我需要向用戶顯示JLabel中的一個(使其可見)。如果我最初不可見,那麼JScrollPane應該自動滾動。這就是我提到scrollRectToVisible
的原因。
3)以上帶有ImageIcon的JLabel裏面我需要顯示一個消息來解釋這個元素髮生了什麼。該消息當前被實現爲帶有浮點數的另一個JLabel,這要歸功於層次結構中JLayeredPane的高得多。現在的問題是,如果用戶滾動JScrollPane,那麼浮動JLabel應該相應地移動到對應的JLabel(ImageIcon)之上。
UDP2:SSCCE
我還沒有實現浮動的JLabel還,但我已經不喜歡如何與指數11起反應對scrollRectToVisible
標籤,因爲它是成功的一半裁剪。答案
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
你真的應該開始要求思考(與假設的解決方案):你想實現什麼_exactly_? – kleopatra
@kleopatra我已添加要求。 –