java - Swing - 确保文本组件中的可见行

标签 java swing jscrollpane viewport jeditorpane

我有一些文本组件(特别是 JEditorPane),并且需要作为对特定事件的响应以使文本组件中的某些行可见 - 即,如果需要,滚动到它。如何使用 Swing 做到这一点?

我找到了 setCaretPosition 但它并不总是很好。如果插入符号已经位于为其新设置的位置,则不会使其再次可见。

最佳答案

来自教程 How to Use Editor Panes and Text PanesHow to Use Scroll Panes你可以获得JViewPort那就是确定可见的矩形

例子:

import java.awt.*;
import javax.swing.*;
import javax.swing.event.*;

public class IsRectVisible {

    private static void createAndShowUI() {
        JFrame frame = new JFrame("IsRectVisible");
        frame.getContentPane().add(new IsRectVisibleGui());
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        java.awt.EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                createAndShowUI();
            }
        });
    }

    private IsRectVisible() {
    }
}

class IsRectVisibleGui extends JPanel {

    public static final Rectangle RECT = new Rectangle(450, 400, 100, 100);
    public static final Dimension INNER_PANEL_SIZE = new Dimension(600, 800);
    private static final Dimension SCROLLPANE_SIZE = new Dimension(250, 300);
    private static final String NOT_VISIBLE = "Not Visible";
    private static final String VISIBLE = "Visible";
    private static final long serialVersionUID = 1L;
    private InnerPanel innerPanel = new InnerPanel();
    private JViewport viewport = new JViewport();
    private JLabel statusLabel = new JLabel(NOT_VISIBLE);

    IsRectVisibleGui() {
        JScrollPane scrollpane = new JScrollPane();
        scrollpane.setViewport(viewport);
        viewport.add(innerPanel);
        scrollpane.setPreferredSize(SCROLLPANE_SIZE);
        viewport.addChangeListener(new ChangeListener() {

            @Override
            public void stateChanged(ChangeEvent e) {
                Rectangle viewRect = viewport.getViewRect();
                if (viewRect.intersects(RECT)) {
                    statusLabel.setText(VISIBLE);
                } else {
                    statusLabel.setText(NOT_VISIBLE);
                }
            }
        });

        setLayout(new BorderLayout());
        add(scrollpane, BorderLayout.CENTER);
        add(statusLabel, BorderLayout.SOUTH);
    }

    class InnerPanel extends JPanel {

        private static final long serialVersionUID = 1L;

        InnerPanel() {
            setPreferredSize(INNER_PANEL_SIZE);
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2 = (Graphics2D) g;
            g2.setColor(Color.red);
            g2.setStroke(new BasicStroke(4));
            g2.draw(RECT);
        }
    }
}

您可以使用 JScrollPane#scrollRectToVisible(Rectangle aRect) 移动它

关于java - Swing - 确保文本组件中的可见行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6261778/

相关文章:

java - 如何在动态sql搜索中使用LIKE?

java - 为什么在 SortedSet 中查找 headSet 时附加空字符 "\0"?

java 如何将字符串发送到服务器(jave.net/sockets)

java - JScrollPane 设置滚动位置

java - JScrollPane,添加到JPanel 还是JTable?

java - 可滚动 JTable : dispalying vertical scrollbar from the header level

java - Sonar 自定义规则检查java集合类型是unknownSymbol

关于构建聊天框的 Java GUI 指南

java - 如何将整数与 JLabel 进行比较?

java - BMI计算器图形用户界面