2

JSplitpaneJavaのswingで二次元っぽいデザインを作りたいです。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();

}

}
4

3 に答える 3

3

プロパティ変更リスナーを使用して、分割ペインの仕切りが移動されたことを検出し、別の分割ペインの位置を設定できます。

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();
    }
}
于 2016-06-06T10:22:53.717 に答える
1

Split Pane Synchronizerも確認できます。

これは、2 つ (またはそれ以上) の分割ペインを同期できる再利用可能なクラスです。クラスは単一のを使用PropertyChangeListenerして仕切りの位置の変更を管理するため、アプリケーション コードは分割された各ペインを個別に追跡する必要はありません。

于 2016-06-06T14:35:06.477 に答える
1

スプリットチェンジを聞く必要があります:

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

(詳細については、 JSplitPane Divider の動きの検出を参照してください)

一方の JSplitPane のサイズを変更するたびに、もう一方も変更する必要があります。

split.setDividerLocation(proportionalLocation);
于 2016-06-06T10:19:22.563 に答える