Слайд JPanel Содержимое в JForm на Java - PullRequest
1 голос
/ 21 февраля 2011

У меня есть вопрос.Я хочу создать форму свинга, которая при нажатии на кнопку сдвигает панель (со своим содержимым) влево, чтобы панель справа заменяла ее плавным эффектом.

Я пытался сделатьКакое-то время проверяет размер панели, а затем минимизирует ее и показывает следующее:

    while (jpanelprincipal1.getWidth() < 439 || jpanelprincipal1.getHeight() > 250)
    {
        int panel1width = jpanelprincipal1.getWidth();
        int panel2height = jpanelprincipal1.getHeight();
        jpanelprincipal1.setSize(panel1width -- , panel2height --);
        jpanelprincipal2.setSize(440,250);
    }

Я использовал этот трюк в C #, но с Application.DoEvent ();(как, очевидно, это не доступно на Java).

Есть ли в любом случае, я могу сделать эффект слайда из 2 или более панелей?

Кстати: простите за мой очень плохой английский!1011 * Заранее спасибо, Луис Да Коста

Ответы [ 3 ]

6 голосов
/ 21 февраля 2011

Как подсказывает @HFOE, javax.swing.Timer - хороший выбор для анимации.Метод setDividerLocation() для JSplitPane может быть вызван из ActionListener.См. Как использовать разделенные панели для дополнительных опций.

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;

/** @see http://stackoverflow.com/questions/5069152 */
public class SplitPaneTest {

    double ratio = 0.5;
    double delta = ratio / 10;
    private void create() {
        JFrame f = new JFrame("JSplitPane");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        MyPanel p1 = new MyPanel(Color.red);
        MyPanel p2 = new MyPanel(Color.blue);
        final JSplitPane jsp = new JSplitPane(
            JSplitPane.HORIZONTAL_SPLIT, true, p1, p2);
        Timer timer = new Timer(200, new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                ratio += delta;
                if (ratio >= 1.0) {
                    ratio = 1.0;
                    delta = -delta;
                } else if (ratio <= 0) {
                    delta = -delta;
                    ratio = 0;
                }
                jsp.setDividerLocation(ratio);
            }
        });

        f.add(jsp);
        f.pack();
        f.setLocationRelativeTo(null);
        f.setVisible(true);
        timer.start();
    }


    private static class MyPanel extends JPanel {

        Color color;

        public MyPanel(Color color) {
            this.color = color;
            this.setPreferredSize(new Dimension(300, 300));
        }

        @Override
        public void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.setColor(color);
            g.drawLine(0, 0, getWidth(), getHeight());
            g.drawLine(getWidth(), 0, 0, getHeight());
        }
    }

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

            @Override
            public void run() {
                new SplitPaneTest().create();
            }
        });
    }
}
6 голосов
/ 22 февраля 2011

он перемещает панель (со своим содержимым) влево, поэтому панель справа заменяет ее плавным эффектом

Вы спрашиваете, что хотите, чтобы панель «скользила», но код выглядит так, как будто вы пытаетесь заставить панель «сжаться», поэтому она заменяется другой панелью.

Предполагая, что у вас есть две панели одинакового размера, вы можете "сдвинуть" одну из них, а другую - в поле зрения.

Для этого вы используете панель с GridLayout. Таким образом, каждый компонент будет иметь одинаковый размер. Затем вы добавляете панель в область прокрутки без полос прокрутки. Размер полосы прокрутки должен быть установлен равным размеру первого компонента. Затем вы можете «сдвинуть» две панели, изменив положение области просмотра. Таким образом, в вашем таймере вы должны иметь что-то вроде:

JViewport viewport = scrollPane.getViewport();
Point position = viewport.getViewPosition();
position.x += 5;
viewport.setViewPosition( position );

Затем вы остановите таймер, когда позиция будет больше, чем размер компонента.

4 голосов
/ 21 февраля 2011

Я бы, наверное, сделал это с таймером свинга. Измените поле класса, представляющее позицию x, y скользящей JPanel в ActionListener таймера, а затем вызовите repaint для контейнера, содержащего JPanels. JLayeredPane может хорошо работать как контейнер для скользящих JPanels.

Редактировать 1: в отношении вашего запроса на код, я думаю, вам лучше всего создать очень маленькую скомпилируемую исполняемую программу, которая пытается это сделать, а затем опубликовать свой код с объяснением поведения вашей программы как отредактируйте к своему оригинальному сообщению. Также отправьте нам комментарий, чтобы уведомить нас о ваших изменениях. Затем мы можем проверить ваш код, протестировать его, изменить и помочь вам превратить его в работающую программу. Это называется созданием " Short, Self Contained, Correct (Compilable), Example " или SSCCE (пожалуйста, проверьте ссылку).

...