2011-07-04 24 views
5

我有一个JPanel A在JPanel B的JTabbedPanel C中有一个标题边框。我有一个方法刷新A和B的内容,不时调用。延迟TitledBorder标题更新/刷新,为什么?

不幸的是,A和B的所有项目都会及时更新,但不是A的标题。我明确地必须切换到另一个选项卡面板并返回到C以使A的标题正确显示。为什么?

我使用的代码如下:

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

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

回答

9

更新标题后,请确认您具有标题边框或它的一个祖先对组件调用repaint()

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

作为参考,切换标签调用'重绘()'通过'JTabbedPane' UI委托。 – trashgod

+0

好又好+1 – mKorbel

+1

有人认为设置标题应该会自动调用重绘。然而,由于实施细节,这显然很难做到;请参阅SUN错误报告,查看错误4117141:http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4117141 – Ryan