在Java中遇到JSplitPane问题?

时间:2015-01-30 15:55:28

标签: java swing jsplitpane

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

enter image description here

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

以下只是一个伪代码;

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

add(spliter);
}

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

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

2 个答案:

答案 0 :(得分:2)

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

  

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

     

此方法以setDividerLocation(int)执行。此方法会立即根据其当前大小更改拆分窗格的大小。 如果拆分窗格未正确实现并且在屏幕上,此方法将无效(新的分隔符位置将变为(当前大小* proportionalLocation)为0)。

因此,在GUI可见后,必须将其称为

为了在构建 GUI的过程中实现这一点,我将使用单个镜头Swing Timer延迟设置分频器位置大约半秒,然后启动计时器在创建组件的最后。

实施

这是一个简单的MCVE实现。

enter image description here

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);
    }
}

答案 1 :(得分:0)

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

Oracle documentation on the use of JSplitPane