1

プログラムを実行しますが、イベントをアクティブにすると、イベントの後に repaint() が呼び出されても、ウィンドウを手動でドラッグしてサイズを変更しない限り、JFrame は更新されません ( JLabel のみが削除されます)。どうしたの?

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()、再検証呼び出しの後に呼び出して、コンテナー自体を再描画します。

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 に答える