【问题标题】:Having problems with JSplitPane in Java?Java 中的 JSplitPane 有问题吗?
【发布时间】:2015-01-30 15:55:27
【问题描述】:

我刚刚开始学习 Java 中的 swing。我在 swing 库中遇到 JSplitPane 问题。我做了一个有四个类的应用程序Frame(), TablePanel(), TextPanel(), FormPanel()Frame是扩展JFrame的主类。下图更清楚地描述了这些类。

现在我的问题是我希望拆分器位于 TablePanel 类和 TextPanel 类之间。我想知道是否有一种方法可以在TablePanel 中实例化TextPanel 并在表格面板和TextPanel 之间设置拆分器,例如:

以下只是伪代码;

TablePanel() {
TextPanel textPanel = new TextPanel();
setLayout(new BorderLayout());
JSplitPane spliter = new JSplitPane(vertical, textPanel, this);

add(spliter);
}

如果我错了,请。通过提出更好的方法来纠正我的错误。

我们将不胜感激。提前致谢!

【问题讨论】:

  • 看看herepublic JSplitPane(int newOrientation, Component newLeftComponent, Component newRightComponent)newOrientation - JSplitPane.HORIZONTAL_SPLIT or JSplitPane.VERTICAL_SPLIT。但是,我不能 100% 确定您的问题。
  • 实际上我知道,正如我提到的,它是伪代码而不是实际代码。我只是想传达我想要的结果的想法。我想知道我可以在TablePanel 构造函数中将TablePanel 传递给JSplitPane。正如我在问题中所做的那样,添加了this
  • 为了尽快获得更好的帮助,请发布MCVE(最小完整可验证示例)或SSCCE(简短、独立、正确示例)。 (即一个工作示例,不是不可编译的代码 sn-ps 或伪代码。)

标签: java swing jsplitpane


【解决方案1】:

使用JSplitPane.setDividerLocation(double),但请注意Java Docs:

将分隔线位置设置为JSplitPane 大小的百分比。

这个方法是按照setDividerLocation(int)来实现的。此方法会根据当前大小立即更改拆分窗格的大小。 如果拆分窗格没有正确实现并显示在屏幕上,则此方法无效(新的分隔符位置将变为(当前大小 * 比例位置),即 0)。

所以必须在 GUI 可见后调用它

为了在构建 GUI 的过程中实现这一点,我会使用单次 Swing Timer 将设置分隔线位置延迟大约半秒,然后在创建组件结束。

实施

这是一个简单的 MCVE 实现。

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

public class SplitPaneDivider {

    private JComponent ui = null;

    SplitPaneDivider() {
        initUI();
    }

    public void initUI() {
        if (ui != null) {
            return;
        }

        ui = new JPanel(new BorderLayout(4, 4));
        ui.setBorder(new EmptyBorder(4, 4, 4, 4));

        final JSplitPane sp = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,
                new ColoredPanel(Color.GREEN),
                new ColoredPanel(Color.YELLOW));
        ui.add(sp);
        ActionListener dividerListener = new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                sp.setDividerLocation(.7d);
            }
        };
        Timer timer = new Timer(500, dividerListener);
        timer.setRepeats(false);
        timer.start();
    }

    class ColoredPanel extends JPanel {

        ColoredPanel(Color color) {
            setBackground(color);
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(200, 100);
        }
    }

    public JComponent getUI() {
        return ui;
    }

    public static void main(String[] args) {
        Runnable r = new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (Exception useDefault) {
                }
                SplitPaneDivider o = new SplitPaneDivider();

                JFrame f = new JFrame("Split Pane Divider");
                f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
                f.setLocationByPlatform(true);

                f.setContentPane(o.getUI());
                f.pack();
                f.setMinimumSize(f.getSize());

                f.setVisible(true);
            }
        };
        SwingUtilities.invokeLater(r);
    }
}

【讨论】:

  • 除了设置定时器,还可以在JFrame中添加一个WindowListener,在windowOpened调用splitPane.setDividerLocation()
  • @AngerClown 这不适用于小程序,也不适用于在 GUI 可见后创建具有拆分窗格的组件(例如,当作为新卡添加到 CardLayout 按钮操作时) .
  • 另见更新,它显示了该方法的实现。
【解决方案2】:

我建议您学习以下内容以正确理解 JSplitPane 的工作原理,并获得一些演示示例:

Oracle documentation on the use of JSplitPane

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-10
    • 1970-01-01
    相关资源
    最近更新 更多