【问题标题】:Java's Swing seems to be changing the layout from Card LayoutJava Swing 似乎正在从 Card Layout 更改布局
【发布时间】:2010-05-10 06:46:07
【问题描述】:

我在使用 JPanels 和 CardLayout 时出现了一些非常奇怪的症状。本质上,我有充当“页面”的卡片,因为我只能在网格上保存 12 个单元格,并且我将每个页面显示为一张卡片,然后单击 -> 和

本质上,我在程序启动时构建初始页面:

public OrderSimPanel() {
    super( new CardLayout() );

    // Create the map
    frames = new TreeMap<Integer, String>();

    // Update and draw
    refreshRelevantOrders();
    drawPanel();

    // Set a timer for future updating
    java.util.Timer timer = new java.util.Timer();
    timer.schedule(new UpdateTask(), 5000);

    System.out.println("Constructor DOES get called");
    System.out.println("Panel type is " + this.getLayout().getClass().getName() );
}

其中 referhReleventOrders() 只是更新一个 List,而 drawPanel() 是这样的:

private void drawPanel() {
    System.out.println("Panel type is " + this.getLayout().getClass().getName() );

    // Set all old frames to deprecated
    for( Integer k : frames.keySet() ) {
         String o = frames.get( k );
         frames.remove(k);
         k = -k;
         frames.put(k, o);
    }

    // Frame to add to
    JPanel frame = new JPanel( new GridLayout(3,4) );
    int f = 0;

    // Create new cells in groups of 12
    for( int i = 0; i < orders.size(); i++ ) {
        // Pagination powers activate!
        int c = i % 12;
        f = i / 12;

        // Create a new panel if we've run out of room on this one
        if ( c == 0 && i > 0 ) {
            // Add old frame
            String id = new Double( Math.random() ).toString();
            frames.put(f, id);
            add( frame, id );

            // Create new one
            frame = new JPanel( new GridLayout(3,4) );
        }

        // Add the order cell to the panel
        frame.add(new OrderCellPanel( orders.get(i) ));

        i++;
    }

    // Add last frame
    String id = new Double( Math.random() ).toString();
    frames.put(f, id);
    add( frame, id );

    // Set active frame to 0'th frame
    ((CardLayout)(this.getLayout())).show(this, frames.get(0));

    // Erase other frames and from map
    for( Integer k : frames.keySet() ) {
        if( k < 0 ) {
            this.remove(0);
            frames.remove(k);
        }
    }
}

在构造函数中创建的计时器任务调用 refreshRelevantOrders() 和 drawPanel()。初始打印输出如下所示:

Panel type is java.awt.CardLayout
Constructor DOES get called
Panel type is java.awt.CardLayout

但是当定时器执行时,会显示这个:

Panel type is javax.swing.GroupLayout

当然,drawPanel() 中的转换代码会失败。感谢您的任何想法!

【问题讨论】:

    标签: java swing timer jpanel grouplayout


    【解决方案1】:

    重写 setLayout() 方法,并在那里打印旧/新的布局类名称(在调用超级实现之前或之后)。这样你就可以看到你的代码的哪一部分在面板上设置了 GroupLayout。

    【讨论】:

    • 好主意,我发现这个面板的一些布局代码正在改变布局(由另一个开发人员编写)。谢谢!
    猜你喜欢
    • 2012-03-14
    • 1970-01-01
    • 2019-03-01
    • 1970-01-01
    • 2012-01-29
    • 2019-04-04
    • 2018-05-03
    • 2014-12-20
    • 1970-01-01
    相关资源
    最近更新 更多