2 JSplitPane中的同步JScrollPanes无法正常工作

时间:2016-03-01 08:34:56

标签: java swing jscrollpane jsplitpane

我有Swing的问题。我已经在JSplitPane中水平放置了两个JScrollPane,并且已经同步了JScrollPanes。在每个JScrollPane里面我放置了一个JPanel。两个JScrollPane之间的同步即(滚动JScrollPane也会滚动其他JScrollPane)正常工作。但是当我向左/右拖动JSplitPane分隔符直到JPanel的某些部分变为隐藏时,水平滚动条显示但是处于禁用状态。我无法滚动查看JPanel的隐藏部分。

以下是代码:

import java.awt.BorderLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;

public class SplitPaneTest extends JFrame {

    public SplitPaneTest() {

        setTitle( "Splits" );
        setDefaultCloseOperation( EXIT_ON_CLOSE );
        setSize( 400, 400 );

        JPanel panel1 = new JPanel();
        panel1.setLayout(new BorderLayout());

        panel1.add( new JLabel( "Left panel!" ) );
        JScrollPane scrollPane1 = new JScrollPane(panel1);

        JPanel panel2 = new JPanel();
        panel2.setLayout(new BorderLayout());

        panel2.add( new JLabel( "Right Panel" ) );
        JScrollPane scrollPane2 = new JScrollPane(panel2);

        scrollPane2.getVerticalScrollBar().setModel(scrollPane1.getVerticalScrollBar().getModel());
        scrollPane2.getHorizontalScrollBar().setModel(scrollPane1.getHorizontalScrollBar().getModel());

        JSplitPane splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, scrollPane1,
                scrollPane2);
        splitPane.setResizeWeight(0.5);
        add(splitPane);

        setVisible( true );

    }

    public static void main( String[] args ) {
        new SplitPaneTest();
    }

}

2 个答案:

答案 0 :(得分:0)

当组件的首选大小大于滚动窗格的大小时,会自动显示滚动条。

您无法共享模型,因为每个滚动条的状态将根据每个滚动窗格分配的空间而有所不同。它们同步的唯一时间是分割窗格的分隔符位于中间位置。

因此,您需要侦听每个滚动窗格滚动条中的更改,而不是尝试从其他滚动窗格调整滚动条。

类似的东西:

ItemID            ItemName           ItemCatg         Priority
------            --------           --------         --------
  1                Name 1               1                 1
  3                Name 3               2                 1
  2                Name 2               1                 2
  5                Name 5               4                 2
  6                Name 6               3                 1
  4                Name 4               3                 3

您还可以为垂直滚动条创建单独的同步器。

答案 1 :(得分:-1)

也许重点是移动JSplitPane的分隔符不会调整JScrollPane 。然而,JScrollPane上的VIEW已更改,因此滚动条由JScrollPane显示(当组件的首选大小大于JScrollPane 中JPanel上视口的大小时,滚动条会自动出现) 但滚动条是灰色的,因为从JScrollPane的角度来看,不需要滚动(它包含的JPanel没有调整大小,因此不会超过JScrollPane的大小......)

UPDATE 这对我有用,解决方法是在滚动条出现的JPanel中放入尽可能多的内容(快速滚动时字体有点碎片)

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Color;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;

public class SplitPaneTest extends JFrame {

    public SplitPaneTest() {

        setTitle( "Splits" );
        setDefaultCloseOperation( EXIT_ON_CLOSE );
        setSize( 200, 200 );

        JPanel panel1 = new JPanel();
        panel1.setLayout(new BorderLayout());
        panel1.setBackground(Color.YELLOW);
        panel1.setLayout(new BorderLayout());
        //panel1.setMinimumSize(new Dimension(100,200));
        //panel1.setPreferredSize(new Dimension(100,200));
        //panel1.revalidate();            
        panel1.add( new JLabel( "Left panel! fhajsdfasbkfbbsdkjafbkajhbshabshjdfbajsbskjaSK" ) );



        JScrollPane scrollPane1 = new JScrollPane(panel1,  JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
        //scrollPane1.setMinimumSize(new Dimension(100,200));
        //scrollPane1.setPreferredSize(new Dimension(100,200));
        //scrollPane1.revalidate();

        JPanel panel2 = new JPanel();
        panel2.setLayout(new BorderLayout());
        //panel2.setMinimumSize(new Dimension(100,200));
        //panel2.setPreferredSize(new Dimension(100,200));
        //panel2.revalidate();

        panel2.add( new JLabel( "Right Panel dfgasdgsdghsgs<dg<sdgs<dgdsgdfsafasfasfasfsafa" ) );
        JScrollPane scrollPane2 = new JScrollPane(panel2, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
        //scrollPane2.setMinimumSize(new Dimension(100,200));
        //scrollPane2.setPreferredSize(new Dimension(100,200));
        //scrollPane2.revalidate();

        scrollPane2.getVerticalScrollBar().setModel(scrollPane1.getVerticalScrollBar().getModel());
        scrollPane2.getHorizontalScrollBar().setModel(scrollPane1.getHorizontalScrollBar().getModel());

        JSplitPane splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, scrollPane1,
                scrollPane2);
        splitPane.setResizeWeight(0.5);
        //splitPane.setContinuousLayout(true);
        this.add(splitPane);

        this.setVisible( true );

    }

    public static void main( String[] args ) {
        new SplitPaneTest();
    }
}