Как добавить кричащие стрелки перехода? - PullRequest
2 голосов
/ 24 августа 2011

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

Вопросы: 1. Есть ли какие-либо примеры, относящиеся к тому, о чем я говорю, даже во флэш-памяти?2. Знаете библиотеку, которая делает это на Java?Возможно с JavaFX?3. Пример приложения / код?

Sketch of the arrows surrounding a content area/photo to change

1 Ответ

2 голосов
/ 24 августа 2011

Это можно сделать с помощью обычного Swing.

Предложение:

  1. Использовать CardLayout для простого переключения контейнера
  2. Использовать BasicArrowButton для кнопок со стрелками

Я предоставлю SSCCE в ближайшее время.А пока смотрите также:


Вот довольно длинно SSCCE :

public final class SwingTransitionDemo {
    public static void main(String[] args){
        SwingUtilities.invokeLater(new Runnable(){
            @Override
            public void run() {
                createAndShowGUI();             
            }
        });
    }

    private static void createAndShowGUI(){
        final JFrame frame = new JFrame("Swing Transition Demo");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add(JMainPane.newInstance());
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    private static final class JMainPane extends JPanel{
        private static final int PAD = 5;

        private JMainPane(){
            super(new GridBagLayout());
            setBackground(Color.PINK);
            GridBagConstraints c = new GridBagConstraints();

            // Create north button
            c.gridx = 1;
            c.gridy = 0;
            c.insets = new Insets(PAD, 0, PAD, 0);
            c.fill = GridBagConstraints.HORIZONTAL;
            final BasicArrowButton north = new BasicArrowButton(BasicArrowButton.NORTH);
            north.addActionListener(BasicArrowButtonActionListener.getInstance());
            add(north, c);

            // Create west button
            c.gridx = 0;
            c.gridy = 1;
            c.insets = new Insets(0, PAD, 0, PAD);
            c.fill = GridBagConstraints.VERTICAL;
            final BasicArrowButton west = new BasicArrowButton(BasicArrowButton.WEST);
            west.addActionListener(BasicArrowButtonActionListener.getInstance());
            add(west, c);

            c.gridx = 1;
            c.gridy = 1;
            c.fill = GridBagConstraints.VERTICAL;
            add(JCardPane.getInstance(), c);

            // Create east button
            c.gridx = 2;
            c.gridy = 1;
            c.insets = new Insets(0, PAD, 0, PAD);
            c.fill = GridBagConstraints.VERTICAL;
            final BasicArrowButton east = new BasicArrowButton(BasicArrowButton.EAST);
            east.addActionListener(BasicArrowButtonActionListener.getInstance());
            add(east, c);

            // Create south button
            c.gridx = 1;
            c.gridy = 2;
            c.insets = new Insets(PAD, 0, PAD, 0);
            c.fill = GridBagConstraints.HORIZONTAL;
            final BasicArrowButton south = new BasicArrowButton(BasicArrowButton.SOUTH);
            south.addActionListener(BasicArrowButtonActionListener.getInstance());
            add(south, c);
        }

        public static final JMainPane newInstance(){
            return new JMainPane();
        }

        private static final class JCardPane extends JPanel{
            private static JCardPane INSTANCE;

            private JCardPane(){
                super(new CardLayout());
                setBorder(BorderFactory.createLineBorder(Color.BLACK));
                add(Box.createRigidArea(new Dimension(200, 200)), "");
                add(Card.newInstance(Color.RED, "North"), String.valueOf(BasicArrowButton.NORTH));
                add(Card.newInstance(Color.ORANGE, "WEST"), String.valueOf(BasicArrowButton.WEST));
                add(Card.newInstance(Color.CYAN, "SOUTH"), String.valueOf(BasicArrowButton.SOUTH));
                add(Card.newInstance(Color.GREEN, "EAST"), String.valueOf(BasicArrowButton.EAST));
            }

            public static final JCardPane getInstance(){
                if(INSTANCE == null){
                    INSTANCE = new JCardPane();
                }

                return INSTANCE;
            }

            @Override
            public Dimension getPreferredSize(){
                return new Dimension(200, 200); // for demonstration purposes only
            }

            private static final class Card extends JPanel{
                private Card(final Color c, final String s){
                    super();
                    setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
                    setBackground(c);

                    // Create components
                    add(Box.createVerticalGlue());
                    final JLabel label = new JLabel(s);
                    label.setAlignmentX(CENTER_ALIGNMENT);
                    add(label);
                    add(Box.createVerticalGlue());
                }

                public static final Card newInstance(final Color c, final String s){
                    return new Card(c, s);
                }
            }
        }

        private static final class BasicArrowButtonActionListener implements ActionListener{
            private static BasicArrowButtonActionListener INSTANCE;

            private BasicArrowButtonActionListener(){} // prevent external instantiation

            public static final BasicArrowButtonActionListener getInstance(){
                if(INSTANCE == null){
                    INSTANCE = new BasicArrowButtonActionListener();
                }

                return INSTANCE;
            }

            @Override
            public void actionPerformed(ActionEvent e) {                
                CardLayout cl = (CardLayout)JCardPane.getInstance().getLayout();
                cl.show(JCardPane.getInstance(), String.valueOf((((BasicArrowButton)e.getSource()).getDirection())));
            }
        }
    }
}

Начальное отображение

enter image description here

А если щелкнуть, скажем, стрелку направления "юг" ...

enter image description here

Используются различные макеты, включая GridBagLayout, BoxLayout и CardLayout.Имейте в виду, что большая часть этого кода просто заполнитель .Поэкспериментируйте с ним и дайте мне знать, если он находится на площадке!

См. Также:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...