1

我将运行程序,但是当我激活事件时, JFrame 不会更新(它只会删除 JLabel ),除非我手动拖动窗口来调整它的大小,即使在事件发生后调用 repaint() 也是如此。怎么了?

public Driver() {
    setLayout( new FlowLayout() );

    pass = new JPasswordField( 4 );
        add( pass );

    image = new ImageIcon( "closedD.png" );
    label = new JLabel( "Enter the password to enter the journal of dreams" , image , JLabel.LEFT );
        add( label );

    button = new JButton( "Enter" );
        add( button );

    event e = new event();
        button.addActionListener( e );

    setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
    setVisible( true );
    setSize( 1600/2 , 900/2 );
    setTitle( "Diary" );
}

//main method
//
//
public static void main( String[] args ) {
    win = new Driver();
}

public class event implements ActionListener {
    private boolean clickAgain = false;

    public void actionPerformed( ActionEvent e ) {
        if ( passEquals( password ) && clickAgain == false ) {
            image2 = new ImageIcon( "openD.png" );
            remove( label );

            label = new JLabel( "Good Job! Here is the journal of dreams." , image2 , JLabel.LEFT );
                add( label );

                clickAgain = true;
        }

        repaint();
    }
}
4

1 回答 1

8

每次添加或删除组件时,都必须告诉其容器重新布局它所包含的当前组件。你通过调用revalidate()它来做到这一点。然后,您将repaint()在 revalidate 调用之后调用以使容器重新绘制自身。

public void actionPerformed( ActionEvent e ) {
    if ( passEquals( password ) && clickAgain == false ) {
        image2 = new ImageIcon( "openD.png" );
        remove( label );

        label = new JLabel( "Good Job! Here is the journal of dreams.", 
             image2 , JLabel.LEFT );
            add( label );

            clickAgain = true;
    }
    revalidate(); // **** added ****
    repaint();
}

注意:您的问题的措辞好像您假设我们知道您要做什么。下次请给我们更多信息。问题越好,信息越丰富,答案就越好,信息越丰富。

编辑 2:
我想知道您是否可以稍微简化您的代码。与其删除和添加 JLabel,不如简单地设置当前 JLabel 的文本和图标:

public void actionPerformed( ActionEvent e ) {
    if ( passEquals( password ) && clickAgain == false ) {
        image2 = new ImageIcon( "openD.png" );
        // remove( label );  // removed

        label.setText( "Good Job! Here is the journal of dreams.");
        label.setIcon(image2);
    }
}
于 2013-02-01T02:28:58.247 回答