Java: проблема с JSplitpane - PullRequest
       12

Java: проблема с JSplitpane

1 голос
/ 02 февраля 2011

Я хотел бы иметь jsplitPane и поменять местами правый компонент на левый компонент во время работы моей программы.Я установил расположение деления около 0,2.когда я поменял местами левый компонент и правый компонент и установил расположение деления около 0,8;есть проблема с jSplitPane.Он заблокирован, и я не могу двигать делителем.также после этого;когда я пытаюсь назначить другой компонент на правую или левую сторону JSplitPane, компоненты выглядят смешно.Я попытался методом setDivisionLocation (), прежде чем поменять местами правый и левый компоненты;но это не эффективно.а также метод repaint () .... пожалуйста, ведите меня

с уважением ... sajad

1 Ответ

3 голосов
/ 02 февраля 2011

Я думаю, что ваша проблема в том, что вы добавляете компонент дважды (это может действительно заставить мысли выглядеть странно).Например, вы делаете что-то вроде: split.setLeftComponent(split.getRightComponent()).

Так что, когда вы делаете своп, вам нужно сначала удалить компоненты:

private static void swap(JSplitPane split) {
    Component r = split.getRightComponent();
    Component l = split.getLeftComponent();

    // remove the components
    split.setLeftComponent(null);
    split.setRightComponent(null);

    // add them swapped
    split.setLeftComponent(r);
    split.setRightComponent(l);
}

И демо здесь (также перемещает расположение делителя):

before after

public static void main(String[] args) {
    JFrame frame = new JFrame("Test");

    final JSplitPane split = new JSplitPane(
            JSplitPane.HORIZONTAL_SPLIT, 
            new JLabel("first"), 
            new JLabel("second"));

    frame.add(split, BorderLayout.CENTER);
    frame.add(new JButton(new AbstractAction("Swap") {
        @Override
        public void actionPerformed(ActionEvent e) {
            // get the state of the devider
            int location = split.getDividerLocation();

            // do the swap
            swap(split);

            // update the devider 
            split.setDividerLocation(split.getWidth() - location 
                    - split.getDividerSize());
        }


    }), BorderLayout.SOUTH);

    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(400, 300);
    frame.setVisible(true);
}
...