我刚刚开始学习Java的挥杆技巧。我在Swing库中的JSplitPane遇到问题。我制作了一个具有四个类的应用程序Frame(), TablePanel(), TextPanel(), FormPanel() Frame是扩展JFrame的主要类。下图更清晰地描述了这些类。



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

以下只是一个伪代码;

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

add(spliter);
}


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

一个有用的答案将不胜感激。预先感谢!

最佳答案

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


  将分隔线位置设置为JSplitPane大小的百分比。
  
  此方法根据setDividerLocation(int)实现。此方法根据其当前大小立即更改拆分窗格的大小。如果未正确实现拆分窗格并在屏幕上显示,则此方法将无效(新的分隔符位置将变为(当前大小*比例位置)为0)。


因此必须在可见GUI后调用它。

为了在构建GUI的过程中实现这一点,我将使用一次Swing 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);
    }
}

08-03 12:14