2011-08-06 19 views
6

Supongamos que tiene una interfaz de usuario con cinco o más pestañas, y debe informar al usuario que la pestaña "2" necesita atención.¿Cómo informar al usuario que una pestaña específica en un JTabbedPane necesita atención?

¿Hay alguna manera de hacerlo? Por ejemplo, haga que la pestaña parpadee en naranja o cambie el color de la pestaña? No he tenido éxito con requestFocus.

Editar: También estoy interesado en saber cómo forzar el enfoque en la pestaña 2 si es posible.

Respuesta

6

Puede lograr esto cambiando el fondo y el primer plano del panel en la posición de la pestaña utilizando un temporizador. Simplemente cámbialo en algún intervalo y parecerá que está parpadeando. He aquí una demostración de esto:

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); 

aquí 1 es el índice de tabulación que desea parpadear. Para dejar de parpadear, detén el temporizador y configura el color frontal y de fondo en los valores predeterminados.


También estoy interesado en saber cómo forzar el foco en la pestaña 2 si es posible.

Si desea transferir el enfoque a esa pestaña, puede utilizar el método setSelectedIndex(int index).


Editar: -

Como se dijo en el comentario por @perp (también he probado y tiene razón), esto no va a funcionar para apariencia distinta WindowDefault. Pero el color de primer plano (color del texto) seguirá parpadeando.

+0

Tenga en cuenta que cambiar el color de fondo no sirve de nada si usa un aspecto y apariencia de Windows (es decir, no el tema clásico de Windows). WindowsTabbedPaneUI pinta una máscara personalizada en la parte superior de la pestaña que efectivamente oculta el color de fondo que se establece. Por lo tanto, la solución no es completamente portátil en apariencia, aunque el color del texto aún parpadeará. – perp

+0

@Prep: No lo he probado con un aspecto y una sensación diferente, así que no estoy al tanto de eso. Gracias por mencionarlo. Actualizado la respuesta. –

+0

Gran respuesta. ¡Gracias! – David

Cuestiones relacionadas