首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JXMultiSplitPane隐藏节点导致绘制问题

JXMultiSplitPane隐藏节点导致绘制问题
EN

Stack Overflow用户
提问于 2012-07-05 22:11:59
回答 2查看 602关注 0票数 2

当我隐藏JXMultiSplitPane的一个节点时,我遇到了绘制问题。下面的SSCCE说明了这种行为:

代码语言:javascript
复制
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;

import org.jdesktop.swingx.JXMultiSplitPane;
import org.jdesktop.swingx.MultiSplitLayout;
import org.jdesktop.swingx.MultiSplitLayout.Divider;
import org.jdesktop.swingx.MultiSplitLayout.Leaf;
import org.jdesktop.swingx.MultiSplitLayout.Node;
import org.jdesktop.swingx.MultiSplitLayout.Split;

public class TestMultiSplitPane {

    public static final String LEFT = "left";
    public static final String CENTER = "center";
    public static final String RIGHT = "right";

    public static final String TOP = "top";
    public static final String MIDDLE = "middle";
    public static final String BOTTOM = "bottom";

    protected void initUI() {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        Split horizontal = new Split();
        Split left = getVerticalSplit(LEFT, 0.5, 0.5);
        left.setWeight(0.2);
        Split center = getVerticalSplit(CENTER, 0.8, 0.2);
        center.setWeight(0.6);
        Split right = getVerticalSplit(RIGHT, 0.5, 0.5);
        right.setWeight(0.2);
        horizontal.setChildren(left, new Divider(), center, new Divider(), right);
        MultiSplitLayout layout = new MultiSplitLayout(horizontal);
        JXMultiSplitPane splitPane = new JXMultiSplitPane(layout);
        addButton(LEFT + TOP, splitPane);
        addButton(CENTER + TOP, splitPane);
        addButton(RIGHT + TOP, splitPane);
        addButton(LEFT + BOTTOM, splitPane);
        addButton(CENTER + BOTTOM, splitPane);
        addButton(RIGHT + BOTTOM, splitPane);
        frame.add(splitPane);
        frame.setBounds(50, 50, 1024, 768);
        frame.setVisible(true);
    }

    protected void addButton(final String buttonName, final JXMultiSplitPane splitPane) {
        final JButton button = new JButton(buttonName);
        splitPane.add(buttonName, button);
        button.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                MultiSplitLayout layout = splitPane.getMultiSplitLayout();
                Node node = layout.getNodeForName(buttonName);
                Split parent = node.getParent();
                parent.hide(node);
                splitPane.invalidate();
                splitPane.revalidate();
                splitPane.repaint();
            }
        });
    }

    public Split getVerticalSplit(String name, double topWeight, double bottomWeight) {
        Split split = new Split();
        split.setRowLayout(false);
        Leaf top = new Leaf(name + TOP);
        top.setWeight(topWeight);
        Leaf bottom = new Leaf(name + BOTTOM);
        bottom.setWeight(bottomWeight);
        split.setChildren(top, new Divider(), bottom);
        return split;
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                new TestMultiSplitPane().initUI();

            }
        });
    }

}

你可以点击任何显示的按钮,它应该会被隐藏,但当我将鼠标移到不同的按钮上时,重新绘制分割窗格是有问题的。

对于那些使用Maven的用户,以下是必需的依赖项:

代码语言:javascript
复制
    <dependency>
        <groupId>org.swinglabs.swingx</groupId>
        <artifactId>swingx-core</artifactId>
        <version>1.6.3</version>
    </dependency>
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-03-14 21:55:49

我最终找到了解决方案。要在布局中隐藏节点,我们可以简单地使用displayNode(String, boolean)方法。

因此,在actionPerformed中,我需要调用的只是:

代码语言:javascript
复制
layout.displayNode(buttonName, false);

完全正常工作的代码:

代码语言:javascript
复制
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;

import org.jdesktop.swingx.JXMultiSplitPane;
import org.jdesktop.swingx.MultiSplitLayout;
import org.jdesktop.swingx.MultiSplitLayout.Divider;
import org.jdesktop.swingx.MultiSplitLayout.Leaf;
import org.jdesktop.swingx.MultiSplitLayout.Split;

public class TestMultiSplitPane {

    public static final String LEFT = "left";
    public static final String CENTER = "center";
    public static final String RIGHT = "right";

    public static final String TOP = "top";
    public static final String MIDDLE = "middle";
    public static final String BOTTOM = "bottom";

    protected void initUI() {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        Split horizontal = new Split();
        Split left = getVerticalSplit(LEFT, 0.5, 0.5);
        left.setWeight(0.2);
        Split center = getVerticalSplit(CENTER, 0.8, 0.2);
        center.setWeight(0.6);
        Split right = getVerticalSplit(RIGHT, 0.5, 0.5);
        right.setWeight(0.2);
        horizontal.setChildren(left, new Divider(), center, new Divider(), right);
        MultiSplitLayout layout = new MultiSplitLayout(horizontal);
        JXMultiSplitPane splitPane = new JXMultiSplitPane(layout);
        addButton(LEFT + TOP, splitPane);
        addButton(CENTER + TOP, splitPane);
        addButton(RIGHT + TOP, splitPane);
        addButton(LEFT + BOTTOM, splitPane);
        addButton(CENTER + BOTTOM, splitPane);
        addButton(RIGHT + BOTTOM, splitPane);
        frame.add(splitPane);
        frame.setBounds(50, 50, 1024, 768);
        frame.setVisible(true);
    }

    protected void addButton(final String buttonName, final JXMultiSplitPane splitPane) {
        final JButton button = new JButton(buttonName);
        splitPane.add(buttonName, button);
        button.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                MultiSplitLayout layout = splitPane.getMultiSplitLayout();
                layout.displayNode(buttonName, false);
            }
        });
    }

    public Split getVerticalSplit(String name, double topWeight, double bottomWeight) {
        Split split = new Split();
        split.setRowLayout(false);
        Leaf top = new Leaf(name + TOP);
        top.setWeight(topWeight);
        Leaf bottom = new Leaf(name + BOTTOM);
        bottom.setWeight(bottomWeight);
        split.setChildren(top, new Divider(), bottom);
        return split;
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                new TestMultiSplitPane().initUI();

            }
        });
    }
}
票数 1
EN

Stack Overflow用户

发布于 2013-03-14 21:48:39

我知道你问这个问题已经有一段时间了,但是我找了很多,直到我找到了一个解决方案(虽然不是一个很好的解决方案),也许这会对某人有所帮助。

我在添加到splitPane中的面板中添加/删除了很多组件,如果我在添加组件之前调整了拆分器的大小,它就会卡在那里,要么剪掉面板的一部分,要么变大。

正如文档中所说的:

只要重新定位任何分割器,

MultiSplitLayout的"floatingDividers“属性就会被MultiSplitPane设置为false。当floatingDividers为false时,每个叶(组件)的右/底边由它后面的分隔线的位置定义。换句话说,一旦用户移动了Divider,布局就不再依赖于任何组件的首选大小,而是由分隔线的当前位置和权重定义。

我所做的是在每次调整大小时调用setFloatingDividers(true)方法(与添加/删除组件相关的大小调整)。由此产生的问题是拆分器的位置丢失。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11346120

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档