【问题标题】:How can I create two dimensional SplitPane in Java Swing如何在 Java Swing 中创建二维 SplitPane
【发布时间】:2016-06-06 09:54:32
【问题描述】:

我想在 Java swing 中创建类似 JSplitpane 的二维设计。 这样JFrame就会被分割成4个部分,上下部分被另一条分割线分开,左右部分被另一条分割线分开。此外,如果我单击并拖动垂直分割线的任何部分,整条线应沿拖动方向移动。

我正在尝试通过在拆分窗格中使用拆分窗格来实现这一点。但是在拖动垂直分割线时,它只会将组件拖动到水平线下方或水平分割线上方。

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

public class Demo extends JFrame {

int screenwidth=760,screenheigth=550;

JSplitPane top_sp,bottom_sp,main_sp;

JButton b1,b2,b3,b4,b5,b6;
JButton b7,b8,b9,b10;

MailClient(){
    setSize(screenwidth,screenheigth);
    setLayout(new BorderLayout());
    setTitle("Demo");
    setDefaultCloseOperation(EXIT_ON_CLOSE);    
    setLocationRelativeTo(null);

    b1=new JButton("B1");
    b2=new JButton("B2");
    b3=new JButton("B3");
    b4=new JButton("B4");
    b5=new JButton("B5");
    b6=new JButton("B6");
    b7=new JButton("B7");
    b8=new JButton("B8");
    b9=new JButton("B9");
    b10=new JButton("B10");     

    JPanel topleft=new JPanel(new FlowLayout());
    topleft.add(b1);
    topleft.add(b2);

    JPanel topright=new JPanel(new FlowLayout(FlowLayout.CENTER));
    topright.add(b3);
    topright.add(b4);
    topright.add(b5);
    topright.add(b6);

    JPanel bottomleft=new JPanel(new FlowLayout(FlowLayout.CENTER));

    bottomleft.add(b7);
    bottomleft.add(b8);
    bottomleft.add(b9);
    bottomleft.add(b10);

    JPanel bottomright=new JPanel(new FlowLayout(FlowLayout.CENTER));
    bottomright.add(new JLabel("TABLE"));

    top_sp=new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,true,topleft,topright);
    bottom_sp=new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,true,bottomleft,bottomright);

    main_sp=new JSplitPane(JSplitPane.VERTICAL_SPLIT,true,top_sp,bottom_sp);

    add(main_sp,"Center");

    setVisible(true);
}

public static void main(String args[]){
    Demo demo=new Demo();

}

}

【问题讨论】:

    标签: java swing split jframe splitpane


    【解决方案1】:

    您可以使用属性更改侦听器来检测拆分窗格分隔线何时被移动,然后设置另一个拆分窗格的位置:

    import javax.swing.*;
    import java.awt.*;
    
    public class Example extends JFrame {
    
        public Example() {
    
            JPanel topLeftPanel = new JPanel();
            JPanel topRightPanel = new JPanel();
            JPanel bottomLeftPanel = new JPanel();
            JPanel bottomRightPanel = new JPanel();
    
            JSplitPane topPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, topLeftPanel, topRightPanel);
    
            JSplitPane bottomPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, bottomLeftPanel, bottomRightPanel);
    
            topPane.addPropertyChangeListener(JSplitPane.DIVIDER_LOCATION_PROPERTY, pce -> {
                bottomPane.setDividerLocation((int) pce.getNewValue());
            });
    
            bottomPane.addPropertyChangeListener(JSplitPane.DIVIDER_LOCATION_PROPERTY, pce -> {
                topPane.setDividerLocation((int) pce.getNewValue());
            });
    
            JSplitPane mainPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT, topPane, bottomPane);
    
            setContentPane(mainPane);
            setLocationRelativeTo(null);
            setMinimumSize(new Dimension(400, 400));
            setVisible(true);
        }
    
        public static void main(String[] args) {
            new Example();
        }
    }
    

    【讨论】:

      【解决方案2】:

      你必须听分裂变化:

      split.addPropertyChangeListener(JSplitPane.DIVIDER_LOCATION_PROPERTY, 
          new PropertyChangeListener() {
             @Override
             public void propertyChange(PropertyChangeEvent pce) {}
      });
      

      (更多信息请参见Detecting JSplitPane Divider Movement)

      每当您更改一个 JSplitPane 的大小时,您也必须更改另一个。

      split.setDividerLocation(proportionalLocation);
      

      【讨论】:

      • 确保在每个拆分窗格的 PropertyChangeListener 中,只有在您自己的位置实际发生变化时才更改另一个拆分窗格的位置(新位置!= 旧位置),否则您可能会陷入无限循环两个拆分窗格!
      【解决方案3】:

      您也可以查看Split Pane Synchronizer。

      这是一个可重用的类,允许您同步 2 个(或更多)拆分窗格。这些类使用单个 PropertyChangeListener 来管理分隔符位置的更改,因此您的应用程序代码不需要单独跟踪每个拆分窗格。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-11-22
        • 2011-02-12
        • 2012-03-25
        • 1970-01-01
        • 1970-01-01
        • 2012-05-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多