2011-07-04 14 views
5

Mam JPanel A z krawędzią tytułową wewnątrz JPanel B z JTabbedPanel C. Mam metodę odświeżania zawartości A i B, która jest wywoływana od czasu do czasu.Opóźniona aktualizacja tytułów/odświeżania tytułów w tytule "Bilet", dlaczego?

Niestety, wszystkie pozycje A i B są odświeżane w czasie, ale nie tytuł A. Zdecydowanie muszę przełączyć się na inny panel z zakładkami i wrócić do C, aby tytuł A wyświetlał się poprawnie. Czemu?

Kod używam jest następujący:

TitledBorder tmp 
      = (TitledBorder) this.GroupingProfilePanel.getBorder(); 

    // Resetting header 
    if (this.c != null) { 
     tmp.setTitle("Set - " + this.c.getName()); 
    } else { 
     tmp.setTitle("Set"); 
    } 

Odpowiedz

9

Po aktualizacji tytuł, sprawdź, czy powołać repaint() w składniku mającym tytułowy granicę lub jeden z jego przodków.

enter image description here

import java.awt.BorderLayout; 
import java.awt.EventQueue; 
import java.awt.event.ActionEvent; 
import java.util.Date; 
import javax.swing.AbstractAction; 
import javax.swing.BorderFactory; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.border.TitledBorder; 

/** @see http://stackoverflow.com/questions/6566612 */ 
public class TitledBorderTest { 

    public static void main(String[] args) { 
      EventQueue.invokeLater(new Runnable() { 
       public void run() { 
        new TitledBorderTest().create(); 
       } 
      }); 
    } 

    private void create() { 

     String s = "This is a TitledBorder update test."; 
     final JLabel label = new JLabel(s); 
     final TitledBorder tb = 
      BorderFactory.createTitledBorder(new Date().toString()); 
     label.setBorder(tb); 
     JFrame f = new JFrame("Titled Border Test"); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.add(label); 
     f.add(new JButton(new AbstractAction("Update") { 

      public void actionPerformed(ActionEvent e) { 
       tb.setTitle(new Date().toString()); 
       label.repaint(); 
      } 
     }), BorderLayout.SOUTH); 
     f.pack(); 
     f.setLocationRelativeTo(null); 
     f.setVisible(true); 
     System.out.println(tb.getMinimumSize(f)); 
    } 
} 
+2

Dla porównania, przełączanie zakładek wywołuje 'repaint()' 'JTabbedPane' za pośrednictwem interfejsu delegata. – trashgod

+0

dobry i miły +1 – mKorbel

+1

Niektórzy twierdzą, że ustawienie tytułu powinno automatycznie wywoływać odświeżanie. Jest to jednak najwyraźniej trudne ze względu na szczegóły dotyczące realizacji; zobacz raport o błędzie SUN dla błędu 4117141 tutaj: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4117141 – Ryan