gpt4 book ai didi

java - 允许嵌套的 JSplitPanes 控制父 JSplitPanes

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:24:18 26 4
gpt4 key购买 nike

下面是使用多个嵌套的 JSplitPanes 创建的简单布局的代码。

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

public class CDBurner extends JFrame {
private static final long serialVersionUID = -6027473114929970648L;
JSplitPane main, folder, rest;
JPanel centeral, folders, favourites, tasks;
JLabel label;

private CDBurner() {
super("Dan's CD Burner");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLayout(new GridLayout(1, 1));
getContentPane().setBackground(Color.black);

createLayout();

pack();
setMinimumSize(getSize());
setExtendedState(getExtendedState() | JFrame.MAXIMIZED_BOTH);
setVisible(true);
requestFocus();
}

private void createLayout() {
createPanels();
rest = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, centeral, tasks);
rest.setResizeWeight(1);
rest.setContinuousLayout(true);
rest.setOneTouchExpandable(true);
folder = new JSplitPane(JSplitPane.VERTICAL_SPLIT, favourites, folders);
folder.setResizeWeight(0.35);
folder.setContinuousLayout(true);
folder.setOneTouchExpandable(true);
main = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, folder, rest);
main.setResizeWeight(0);
main.setContinuousLayout(true);
main.setOneTouchExpandable(true);
getContentPane().add(main);
}

private void createPanels() {
createFolders();
createCenter();
createTaskSpool();
createFavourites();
}

private void createFolders() {
folders = new JPanel(new GridLayout(1, 1));
label = new JLabel("Folder");
folders.setMinimumSize(new Dimension(300, 100));
folders.add(label);
}

private void createCenter() {
centeral = new JPanel(new GridLayout(1, 1));
label = new JLabel("Central");
centeral.add(label);
centeral.setMinimumSize(new Dimension(300, 100));
}

private void createTaskSpool() {
tasks = new JPanel(new GridLayout(1, 1));
label = new JLabel("Task");
tasks.setMinimumSize(new Dimension(300, 100));
tasks.add(label);
}

private void createFavourites() {
favourites = new JPanel(new GridLayout(1, 1));
label = new JLabel("Fav");
favourites.setMinimumSize(new Dimension(300, 100));
favourites.add(label);
}

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

由于 rest.setResizeWeight(1); 行,您可以将 main (JSplitPane) 分隔线拖动到右侧,它会缩小 tasks JPanel 直到 rest 中的 JPanels 都是最小尺寸。但是,如果您尝试执行相反的操作,则什么也不会发生。请参阅下图以了解问题。

如果 gui 看起来像这样,您可以拖动 main 分隔线。

enter image description here

你会得到这样的结果。

enter image description here

但是,如果它看起来像这样,并且您尝试拖动 rest 分隔线,则什么也不会发生。

enter image description here

这是因为 rest JSplitPane 的两边都已达到最小尺寸。

问题
我怎样才能做到,当我拖动 rest 分隔符时,它会影响 main JSplitPane,以便上图中显示的两种操作都是可能的?

最佳答案

据我所知,您描述的行为是 split View 的正常行为。看看分频器是如何像 Eclipse 这样的专业应用程序。

无论如何,我通过以编程方式控制其余 JSplitPane 分隔线的移动,为您想要的行为创建了一个解决方法。在 createLayout() 方法中创建剩余的 JSplitPane 后,您只需添加这些代码行即可。

SplitPaneUI spui = rest.getUI();
if (spui instanceof BasicSplitPaneUI) {
((BasicSplitPaneUI) spui).getDivider().addMouseMotionListener(new MouseAdapter(){
@Override
public void mouseDragged(MouseEvent E){
int newPos = E.getPoint().x;
if(newPos < 0 && folder.getSize().width > 300 && centeral.getSize().width <= 300){
main.setDividerLocation(main.getDividerLocation() + newPos);
validate();
}
if(centeral.getSize().width > 300 && tasks.getSize().width > 300){
rest.setDividerLocation(rest.getDividerLocation() + newPos);
validate();
}
}
});
}

解释:
在第一行中,我们获取 JSplitPane 分隔线的 UI 对象,并向其添加自定义 MouseMotionListener。我们需要UI 对象,因为真正的 JSplitPane 不直接获取任何鼠标事件。
在监听器中,我们覆盖了 mouseDragged 方法并在鼠标拖动时接收鼠标的实际 X 位置分隔线。
如果它是负值,我们将分隔线向左拖动。在这种情况下,如果中心面板已经缩小到其最小尺寸 300,而左侧文件夹面板仍然大于其最小尺寸。
如果中央和右侧的任务面板仍然大于其最小尺寸 300,则其余分隔线应该是可移动的。

关于java - 允许嵌套的 JSplitPanes 控制父 JSplitPanes,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40440640/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com