gpt4 book ai didi

java - 移动 JScrollBar 时显示行号

转载 作者:行者123 更新时间:2023-11-30 06:18:47 24 4
gpt4 key购买 nike

在 Linux 文本编辑器 Kate 中,有一个很好的功能,当我单击并拖动滚动条时,它会显示文本组件中当前可见的当前行号。 enter image description here我的问题是如何在 Java 中将此函数添加到包含 JTextArea 的滚动 Pane 中。我可以使用哪个组件来显示此通知?

最佳答案

显然你可以用 JPopupMenu 来做到这一点:

enter image description here

我试过这个类,因为我知道它有方法 show(Component, x, y) .但它可能与其他类一起使用,或者尝试自己实现该方法所做的任何事情。

我在 scrollBar 上放置了几个鼠标监听器,并在 show() 调用中对值 x、y 进行了一些调整,直到我对绘制它的位置感到满意为止。

完整代码:

import java.awt.Dimension;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPopupMenu;
import javax.swing.JScrollBar;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.SwingUtilities;

public class ScrollbarTest
{
private JScrollPane scrollPane;
private JScrollBar scrollBar;
private JPopupMenu popupMenu;
private JLabel popupLabel;

public static void main(String[] args)
{
SwingUtilities.invokeLater(new Runnable() {
public void run()
{
new ScrollbarTest();
}
});
}

public ScrollbarTest()
{
JFrame frame = new JFrame("Test");

popupMenu = new JPopupMenu();
popupLabel = new JLabel();
popupMenu.add(popupLabel);

scrollPane = new JScrollPane(buildTestTextArea());
scrollBar = scrollPane.getVerticalScrollBar();
scrollBar.addMouseMotionListener(new PopUpMouseMotionListener());
scrollBar.addMouseListener(new PopUpMouseListener());

frame.add(scrollPane);

frame.setSize(new Dimension(400, 400));
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}

public JTextArea buildTestTextArea()
{
JTextArea textArea = new JTextArea();
StringBuilder builder = new StringBuilder();
for (int i = 0; i < 10000; ++i)
{
builder.append("X");
}
textArea.setText(builder.toString());
textArea.setLineWrap(true);
return textArea;
}

private class PopUpMouseMotionListener extends MouseMotionAdapter
{
@Override
public void mouseDragged(MouseEvent e)
{
double value = scrollBar.getValue();
double max = scrollBar.getMaximum() - scrollBar.getVisibleAmount();
double h = scrollBar.getHeight();
popupLabel.setText("" + (int) (100*value/max) + "%");
popupMenu.show(scrollPane, scrollBar.getX() - popupMenu.getWidth() - 2, (int) ((h - popupMenu.getHeight())*value/max));
}
}

private class PopUpMouseListener extends MouseAdapter
{
@Override
public void mouseReleased(MouseEvent e)
{
popupMenu.setVisible(false);
}
}
}

关于java - 移动 JScrollBar 时显示行号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23963150/

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