Swing/SwappingSplitPane のバックアップの現在との差分(No.4)
- category: swing
folder: SwappingSplitPane
title: JSplitPaneに設定した子コンポーネントの位置を入れ替える
tags: [JSplitPane]
author: aterai
pubdate: 2019-01-21T00:29:34+09:00
description: JSplitPaneに設定した子コンポーネントの位置と余分なスペースの配分率を入れ替えます。
image: https://drive.google.com/uc?export=view&id=1TMNOHO7KVS63zeFEW4xasYw5TX-ZNqTL9w
image: https://drive.google.com/uc?id=1TMNOHO7KVS63zeFEW4xasYw5TX-ZNqTL9w
hreflang:
href: https://java-swing-tips.blogspot.com/2019/01/swap-position-of-child-components-in.html lang: en
概要
JSplitPane
に設定した子コンポーネントの位置と余分なスペースの配分率を入れ替えます。
Screenshot
Advertisement
Screenshot
Advertisement
サンプルコード
#spanadd
JSplitPane split = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, left, right);
#spanend
#spanadd
split.setResizeWeight(.4);
#spanend
#spanadd
#spanend
JButton button = new JButton("swap");
button.setFocusable(false);
button.addActionListener(e -> {
Component left = sp.getLeftComponent();
Component right = sp.getRightComponent();
Component left = split.getLeftComponent();
Component right = split.getRightComponent();
// sp.removeAll(); // Divider is also removed
sp.remove(left);
sp.remove(right);
// split.removeAll(); // Divider is also removed
split.remove(left);
split.remove(right);
// or:
// sp.setLeftComponent(null);
// sp.setRightComponent(null);
// split.setLeftComponent(null);
// split.setRightComponent(null);
sp.setLeftComponent(right);
sp.setRightComponent(left);
split.setLeftComponent(right);
split.setRightComponent(left);
sp.setResizeWeight(1d - sp.getResizeWeight());
split.setResizeWeight(1d - split.getResizeWeight());
if (check.isSelected()) {
sp.setDividerLocation(sp.getDividerLocation());
split.setDividerLocation(split.getDividerLocation());
}
});
View in GitHub: Java, Kotlin解説
上記のサンプルでは、水平分割したJSplitPane
の左右に配置したコンポーネントを入れ替え可能に設定しています。
- すでに
JSplitPane
に配置されているコンポーネントを別の位置に配置すると例外が発生するため、一旦JSplitPane
から削除する必要がある JSplitPane#removeAll()
を使用するとディバイダも削除されてしまうJSplitPane#remove(Component)
、またはJSplitPane#setLeftComponent(null)
などで削除する- ディバイダの位置を入れ替え前と同じ場所に保つ場合、
JSplitPane#setResizeWeight(...)
メソッドで余分なスペースの配分率の入れ替えと、JSplitPane#setDividerLocation(...)
メソッドで位置の再設定が必要になる - ディバイダの位置を入れ替え前と同じ場所に保つ場合、
JSplitPane#setResizeWeight(...)
メソッドで余分なスペースの配分率の入れ替えとJSplitPane#setDividerLocation(...)
メソッドで位置の再設定が必要になる
-
GridLayout
を設定したJPanel
などの場合は、以下のようにContainer#setComponentZOrder(...)
メソッドでコンポーネントの位置の入れ替えが可能 -
GridLayout
を設定したJPanel
などの場合、以下のようにContainer#setComponentZOrder(...)
メソッドでコンポーネントの位置の入れ替えが可能- サンプルコードはJPanelに追加したコンポーネントの順序を変更するに移動
#spanend
#spandel
import java.awt.*;
#spanend
#spandel
import java.awt.event.HierarchyEvent;
#spanend
#spandel
import javax.swing.*;
#spanend
#spandel
#spanend
#spandel
public class GridLayoutSwapTest {
#spanend
public Component makeUI() {
#spandel
#spanend
JTable table = new JTable(6, 3);
// TEST:
table.addHierarchyListener(e -> {
System.out.println(e.getChangeFlags());
if ((e.getChangeFlags() & HierarchyEvent.HIERARCHY_CHANGED) != 0) {
System.out.println("JTable HIERARCHY_CHANGED " + e.getChangeFlags());
}
});
#spandel
#spanend
JPanel p = new JPanel(new GridLayout(1, 0));
p.setBorder(BorderFactory.createTitledBorder("GridLayout(1, 0)"));
p.add(new JScrollPane(table));
p.add(new JScrollPane(new JTree()));
// p.add(new JScrollPane(new JTextArea("JTextArea")));
#spandel
#spanend
JButton button = new JButton("swap");
button.setFocusable(false);
button.addActionListener(e -> {
p.setComponentZOrder(p.getComponent(p.getComponentCount() - 1), 0);
p.revalidate();
});
#spandel
#spanend
JPanel panel = new JPanel(new BorderLayout());
panel.add(p);
panel.add(button, BorderLayout.SOUTH);
return panel;
}
public static void main(String... args) {
EventQueue.invokeLater(() -> {
JFrame f = new JFrame();
f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
f.getContentPane().add(new GridLayoutSwapTest().makeUI());
f.setSize(320, 240);
f.setLocationRelativeTo(null);
f.setVisible(true);
});
}
#spandel
}
#spanend
#spandel