Как проинформировать пользователя о том, что конкретная вкладка в JTabbedPane требует внимания? - PullRequest
6 голосов
/ 06 августа 2011

Скажем, у вас есть пользовательский интерфейс с пятью или более вкладками, и вам нужно сообщить пользователю, что вкладка "2" требует внимания.

Есть ли способ сделать это?Например, сделать вкладку мигающей оранжевой или изменить цвет вкладки?У меня не было успеха с requestFocus.

Редактировать: Мне также интересно узнать, как заставить фокус на вкладке 2, если это возможно.

Ответы [ 2 ]

6 голосов
/ 06 августа 2011

Этого можно добиться, изменив фон и передний план панели в положении табуляции с помощью некоторого таймера.Просто измените его на некоторый интервал, и он будет выглядеть как мигание.Вот демонстрация для этого:

    JFrame frame = new JFrame();
    frame.setSize(400, 400);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    final JTabbedPane pane = new JTabbedPane();

    JPanel jPanel = new JPanel();
    JButton button = new JButton("Blink tab");
    jPanel.add(button);
    pane.addTab("adsad", jPanel);

    JPanel jPanel1 = new JPanel();
    jPanel1.add(new JLabel("hi"));
    pane.addTab("werqr", jPanel1);

    final Color defaultBackColor = pane.getBackgroundAt(1); // default background color of tab
    final Color defaultForeColor = pane.getForegroundAt(1); // default foreground color of tab

    button.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            Timer timer = new Timer(500, new ActionListener() {
                boolean blinkFlag = false;
                @Override
                public void actionPerformed(ActionEvent e) {
                    blink(blinkFlag);
                    blinkFlag = !blinkFlag;
                }
            });
            timer.start();
        }
        private void blink(boolean blinkFlag) {
            if (blinkFlag) {
                pane.setForegroundAt(1, Color.green);
                pane.setBackgroundAt(1, Color.orange);
            } else {
                pane.setForegroundAt(1, defaultForeColor);
                pane.setBackgroundAt(1, defaultBackColor);
            }
            pane.repaint();
        }
    });

    frame.add(pane);
    frame.setVisible(true);

Здесь 1 - это индекс табуляции, который вы хотите мигать.Чтобы прекратить мигать, остановите таймер и установите для цвета переднего и заднего фона значения по умолчанию.


Мне также интересно узнать, как заставить фокусировку на вкладке 2, если это возможно.

Если вы хотите перенести фокус на эту вкладку, вы можете использовать метод setSelectedIndex(int index).


Редактировать: -

Как сказал @perpв комментарии (также я проверил это, и он прав) это не будет работать для внешнего вида, кроме WindowDefault.Но цвет переднего плана (цвет текста) все еще будет мигать.

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

Глядя на http://download.oracle.com/javase/tutorial/uiswing/components/tabbedpane.html, вы можете использовать icon для обозначения вкладки, требующей внимания.

...