- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
当用户滚动它时,我需要处理来自 JScrollPane
的事件。在 here建议对 JViewport
或 Vertical/HorizontalScrollBar 使用 addAdjustmentListener
。
有什么区别,我应该选择哪种方法?
我也想对相同的 JScrollPane
使用 scrollRectToVisible
,我应该期待 AdjustmentListener
为这个方法工作吗?
我还想知道 scrollRectToVisible
是否尝试进行最小滚动以使所需的矩形可见,或者它是否试图使其在 JViewport
中间可见?
UPD:要求:
1) 有一个 JScrollPane 和一个 JPanel,它有许多 JLabel(ImageIcon),所以其中一些是不可见的。
2) 当网络事件发生时,我需要向用户显示 JLabel 之一(使其可见)。如果 I 最初不可见,那么 JScrollPane 应该会自动滚动。这就是我提到 scrollRectToVisible
的原因。
3) 在带有 ImageIcon 的 JLabel 上方,我需要显示一条消息来解释该元素发生了什么。由于层次结构更高的 JLayeredPane,该消息当前作为另一个带有 float 的 JLabel 实现。现在的问题是,如果用户滚动 JScrollPane, float 的 JLabel 应该相应地移动到对应的 JLabel(ImageIcon) 之上。
UDP2:SSCCE
我还没有实现 float JLabel,但我已经不喜欢索引为 11 的标签对 scrollRectToVisible
的 react ,因为它被裁剪了一半。
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);
}
});
}
}
最佳答案
部分答案(评论中的代码只是......并注意到我在评论中错了;-)
方法 scrollRectToVisible 在调用它的组件的坐标系中获取一个 Rectangle。要滚动子项使其完全可见,基本上有两种选择(使用其中的一种):
// either call on child with zero offset
child.scrollRectToVisible(new Rectangle(child.getSize());
// or call on child's parent with child bounds
child.getParent().scrollRectToVisible(child.getBounds());
关于java - JScrollPane adjustmentListener 和 scrollRectToVisible,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13604617/
当用户滚动它时,我需要处理来自 JScrollPane 的事件。在 here建议对 JViewport 或 Vertical/HorizontalScrollBar 使用 addAdjustmen
我有不同的 AdjustmentListener,例如: a.addAdjustmentListener(this); b.addAdjustmentListener(this); c.addAdju
我是一名优秀的程序员,十分优秀!