javax.swing.JPanel - 在事件执行期间重新验证

时间:2013-04-30 23:25:12

标签: java swing

我希望我不会因为这个似乎很愚蠢的问题而烦扰所有围绕stackoverflow的java专家,但是对于我这个相当新手的java编码器会造成很多麻烦。

在我的辩护中,我必须提到我正在谷歌搜索这个并且在我的关卡上找不到任何可以解释我是否能达到我想达到的目标(并且最终如何)的任何内容。

我正在解析xml并以友好的用户友好图形形式显示它。我正在尝试显示加载此xml的进度,以便用户确实知道会发生什么。

所以我用两个面板创建了简单的表单 - 一个在顶部填充整个工作空间,另一个在底部扮演状态栏的角色。顶部还有简单的菜单栏,因此用户可以单击file -> load来播放文件。我正在加载file -> load菜单按钮的点击事件中的文件。

因此,当用户点击file -> load时会发生这种情况:

JLabel progress_label = new JLabel("0%");
this.status_bar.add(progress_label);
this.status_bar.revalidate();
//some code that loads my xml
//inside loading loop I try to do this:
progress_label.setText(some_formula_to_calculate_percentage);
this.status_bar.revalidate();
//finish loading xml file
this.status_bar.remove(progress_label);
this.status_bar.revalidate();

上面的代码运行正常 - 除了一个小细节。我认为在事件被触发后正在执行revalidate(),因为正在添加标签然后在执行事件期间删​​除了我无法实际看到任何效果。

这是我的问题 - 有没有办法从事件内部重新验证我的面板?

非常感谢任何建议。


编辑 - 以下建议我准备了一些示例代码,解释了我正在尝试做的事情。

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package javaapplication6;

import javax.swing.JLabel;
/**
 *
 * @author
 */
public class NewJFrame extends javax.swing.JFrame {

/**
 * Creates new form NewJFrame
 */
public NewJFrame() {
    initComponents();
}

/**
 * This method is called from within the constructor to initialize the form.
 * WARNING: Do NOT modify this code. The content of this method is always
 * regenerated by the Form Editor.
 */
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">                          
private void initComponents() {

    jPanel1 = new javax.swing.JPanel();

    setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

    jPanel1.addMouseListener(new java.awt.event.MouseAdapter() {
        public void mouseClicked(java.awt.event.MouseEvent evt) {
            jPanel1MouseClicked(evt);
        }
    });

    javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
    jPanel1.setLayout(jPanel1Layout);
    jPanel1Layout.setHorizontalGroup(
        jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGap(0, 476, Short.MAX_VALUE)
    );
    jPanel1Layout.setVerticalGroup(
        jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGap(0, 358, Short.MAX_VALUE)
    );

    javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
    getContentPane().setLayout(layout);
    layout.setHorizontalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGroup(layout.createSequentialGroup()
            .addContainerGap()
            .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
            .addContainerGap())
    );
    layout.setVerticalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGroup(layout.createSequentialGroup()
            .addContainerGap()
            .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
            .addContainerGap())
    );

    pack();
}// </editor-fold>                        

private void jPanel1MouseClicked(java.awt.event.MouseEvent evt) {                                     
    JLabel test_label = new JLabel("test");
    test_label.setBounds(1, 1, 100, 100);
    this.jPanel1.add(test_label);
    this.jPanel1.revalidate();
    this.jPanel1.repaint();
    try
    {
        System.in.read();
    }
    catch ( Exception e )
    {
    }
    this.jPanel1.remove(test_label);
    this.jPanel1.revalidate();
}                                    

/**
 * @param args the command line arguments
 */
public static void main(String args[]) {
    /* Set the Nimbus look and feel */
    //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
    /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
     * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
     */
    try {
        for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
            if ("Nimbus".equals(info.getName())) {
                javax.swing.UIManager.setLookAndFeel(info.getClassName());
                break;
            }
        }
    } catch (ClassNotFoundException ex) {
        java.util.logging.Logger.getLogger(NewJFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    } catch (InstantiationException ex) {
        java.util.logging.Logger.getLogger(NewJFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    } catch (IllegalAccessException ex) {
        java.util.logging.Logger.getLogger(NewJFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    } catch (javax.swing.UnsupportedLookAndFeelException ex) {
        java.util.logging.Logger.getLogger(NewJFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    }
    //</editor-fold>

    /* Create and display the form */
    java.awt.EventQueue.invokeLater(new Runnable() {
        public void run() {
            new NewJFrame().setVisible(true);
        }
    });
}
// Variables declaration - do not modify                     
private javax.swing.JPanel jPanel1;
// End of variables declaration                   
}

1 个答案:

答案 0 :(得分:2)

  

我认为在事件被触发后正在执行revalidate(),因为正在添加标签然后在执行事件期间删​​除了我无法实际看到任何效果

听起来你的代码正在EDT上执行。所以你最终只能看到最终的结果。

阅读Concurrency上的Swing教程。您可能希望使用SwingWorker,以便在单独的线程上执行长时间运行的代码,然后发布可在EDT上绘制的结果。