diff --git a/lazy_player/__init__.py b/lazy_player/__init__.py
index 52f2699..4816c10 100644
--- a/lazy_player/__init__.py
+++ b/lazy_player/__init__.py
@@ -234,6 +234,10 @@ class MainWindow(Gtk.ApplicationWindow):
         elif keyval == Gdk.keyval_from_name("Down"):
             self._seek_relative(-60)
             return True
+            
+        elif keyval == Gdk.keyval_from_name("j"):
+            self._cycle_subtitles()
+            return True
 
         return False
 
@@ -272,6 +276,27 @@ class MainWindow(Gtk.ApplicationWindow):
             Gst.Format.TIME, Gst.SeekFlags.FLUSH | Gst.SeekFlags.KEY_UNIT, new_pos
         )
 
+    def _cycle_subtitles(self) -> None:
+        """Cycle through available subtitle tracks"""
+        playbin = self.pipeline.get_by_name("playbin")
+        if not playbin:
+            return
+
+        # Get current subtitle track
+        current = playbin.get_property("current-text")
+        n_text = playbin.get_property("n-text")
+
+        if n_text == 0:
+            self.show_overlay_text("No subtitles available")
+            return
+
+        # Cycle to next track, wrapping around
+        next_track = (current + 1) % n_text
+        playbin.set_property("current-text", next_track)
+        
+        # Show the new track number
+        self.show_overlay_text(f"Subtitle track: {next_track}")
+
     def show_overlay_text(self, text: str, timeout_seconds: float = 1.0) -> None:
         """Show text in a centered overlay that disappears after timeout"""
         self.overlay_label.set_text(text)