Nik*_*sov 1 java swing jscrollpane jscrollbar jviewport
JScrollPane当用户滚动它时,我需要处理事件。在这里建议使用addAdjustmentListenertoJViewport或 Vertical/HorizontalScrollBar。
有什么区别,我应该选择哪种方法?
我也想用scrollRectToVisible同样的方法JScrollPane,我应该期待AdjustmentListener使用这种方法吗?
另外我想知道是否scrollRectToVisible尝试进行最小滚动以使所需的矩形可见,还是尝试使其在JViewport?
UPD:要求:
1) 有一个 JScrollPane,其中一个 JPanel 有许多 JLabel(ImageIcon),因此其中一些不可见。
2)当网络事件发生时,我需要向用户显示 JLabel 之一(使其可见)。如果 I 最初不可见,则 JScrollPane 应自动滚动。这就是为什么我提到scrollRectToVisible.
3) 在里面有 ImageIcon 的 JLabel 上方,我需要显示一条消息来解释这个元素发生了什么。由于 JLayeredPane 层次结构更高,该消息当前被实现为另一个带有浮点数的 JLabel。现在的问题是,如果用户滚动 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);
}
});
}
}
Run Code Online (Sandbox Code Playgroud)
部分答案(评论中的代码只是......并注意到我在评论中错了;-)
方法 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());
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6285 次 |
| 最近记录: |