Java tutorial
import java.awt.BasicStroke; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Rectangle; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JViewport; public class Main { public static void main(String[] args) { JFrame frame = new JFrame(); frame.getContentPane().add(new MyPanel()); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.pack(); frame.setVisible(true); } } class MyPanel extends JPanel { Rectangle RECT = new Rectangle(450, 400, 100, 100); Dimension INNER_PANEL_SIZE = new Dimension(600, 800); Dimension SCROLLPANE_SIZE = new Dimension(250, 300); String NOT_VISIBLE = "Not Visible"; String VISIBLE = "Visible"; InnerPanel innerPanel = new InnerPanel(); JViewport viewport = new JViewport(); JLabel statusLabel = new JLabel(NOT_VISIBLE); MyPanel() { JScrollPane scrollpane = new JScrollPane(); scrollpane.setViewport(viewport); viewport.add(innerPanel); scrollpane.setPreferredSize(SCROLLPANE_SIZE); viewport.addChangeListener(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 { 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); } } }