【问题标题】:Delayed TitledBorder title update/refresh, why?延迟 TitledBorder 标题更新/刷新,为什么?
【发布时间】:2011-09-27 20:08:49
【问题描述】:

我有一个 JPanel A,在 JPanel B 和 JTabbedPanel C 内有一个标题边框。我有一个方法来刷新 A 和 B 的内容,它会不时调用。

不幸的是,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");
    }

【问题讨论】:

    标签: java swing refresh titled-border


    【解决方案1】:

    更新标题后,确认您在具有标题边框的组件或其祖先之一上调用了repaint()

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

    【讨论】:

    • 作为参考,切换选项卡通过JTabbedPane UI 委托调用repaint()
    • 有些人认为设置标题应该自动调用重绘。然而,由于实现细节,这显然很难做到;在此处查看错误 4117141 的 SUN 错误报告:bugs.sun.com/bugdatabase/view_bug.do?bug_id=4117141
    • 5 年后,这正是我的问题。谢谢!
    猜你喜欢
    • 2018-12-02
    • 2018-07-31
    • 2015-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多