首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 程式設計入門

Swing 分割面板實戰:JSplitPane 左右聯動圖片瀏覽器

     編輯:Java 程式設計入門

功能描述

水平分割面板:左側 JList 顯示圖片文件名(單選),右側 JLabel 顯示對應圖片。拖動分割條調整左右比例,支持一鍵展開/摺疊(setOneTouchExpandable)。

完整實現:SplitPaneDemo

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

public class SplitPaneDemo implements ListSelectionListener {
    private final String[] images = {"Bird.gif", "Cat.gif", "Dog.gif", "Pig.gif"};
    private JLabel pictureLabel;
    private JList list;
    private JSplitPane splitPane;

    public SplitPaneDemo() {
        // 1. 左側列表
        list = new JList<>(images);
        list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        list.setSelectedIndex(0);
        list.addListSelectionListener(this);
        JScrollPane listScroll = new JScrollPane(list);

        // 2. 右側圖片標簽(初始加載第一張)
        ImageIcon firstIcon = createIcon("images/" + images[0]);
        pictureLabel = new JLabel(firstIcon);
        if (firstIcon != null) {
            pictureLabel.setPreferredSize(new Dimension(firstIcon.getIconWidth(), firstIcon.getIconHeight()));
        }
        JScrollPane picScroll = new JScrollPane(pictureLabel);

        // 3. 水平分割面板
        splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, true, listScroll, picScroll);
        splitPane.setOneTouchExpandable(true); // 顯示展開/摺疊箭頭
        splitPane.setDividerLocation(150); // 初始分割位置

        // 4. 設置最小尺寸,防止面板被壓縮消失
        Dimension minSize = new Dimension(100, 50);
        listScroll.setMinimumSize(minSize);
        picScroll.setMinimumSize(minSize);

        splitPane.setPreferredSize(new Dimension(400, 200));
    }

    public JSplitPane getSplitPane() { return splitPane; }

    @Override
    public void valueChanged(ListSelectionEvent e) {
        if (e.getValueIsAdjusting()) return; // 忽略調整中事件

        JList src = (JList) e.getSource();
        if (src.isSelectionEmpty()) {
            pictureLabel.setIcon(null);
            pictureLabel.setText(null);
            return;
        }

        int idx = src.getSelectedIndex();
        ImageIcon icon = createIcon("images/" + images[idx]);
        pictureLabel.setIcon(icon);
        if (icon != null) {
            pictureLabel.setText(null);
            pictureLabel.setPreferredSize(new Dimension(icon.getIconWidth(), icon.getIconHeight()));
        } else {
            pictureLabel.setText("圖片未找到: " + images[idx]);
        }
        pictureLabel.revalidate(); // 觸發佈局更新
    }

    protected static ImageIcon createIcon(String path) {
        java.net.URL url = SplitPaneDemo.class.getResource(path);
        return (url != null) ? new ImageIcon(url) : null;
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            JFrame f = new JFrame("SplitPaneDemo");
            f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            f.add(new SplitPaneDemo().getSplitPane());
            f.pack();
            f.setVisible(true);
        });
    }
}

關鍵配置參數

參數示例值說明
方向HORIZONTAL_SPLIT / VERTICAL_SPLIT左右分割 / 上下分割
連續重繪true (構造器第2參數)拖動時實時重繪;false 僅拖動輪廓
一鍵展開setOneTouchExpandable(true)分割條顯示三角箭頭,點擊瞬間展開/摺疊
分割位置setDividerLocation(150)以像素或比例 (0.0-1.0) 固定初始分割線
最小尺寸setMinimumSize(new Dimension(100,50))防止子組件被壓縮至不可見

進階用法

  • 嵌套分割:將 JSplitPane 作為另一個 JSplitPane 的子組件,實現三欄/四欄佈局
  • 保存用戶偏好:關閉時持久化 getDividerLocation(),啟動時恢復
  • 觸屏適配:增加分割條寬度(setDividerSize(12)),便於手指拖動

遷移提示

JavaFX SplitPane 以 DividerPosition 屬性(0.0-1.0)聲明式綁定,支持嵌套與動畫過渡,API 更現代化。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved