gpt4 book ai didi

java - JScrollPane adjustmentListener 和 scrollRectToVisible

转载 作者:行者123 更新时间:2023-11-29 03:40:01 24 4
gpt4 key购买 nike

当用户滚动它时,我需要处理来自 JScrollPane 的事件。在 here建议对 JViewport 或 Vertical/Horizo​​ntalScrollBar 使用 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com