Mar*_*ruz 1 java user-interface swing jlabel jframe
我将运行该程序,但是当我激活该事件时,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();
}
}
Run Code Online (Sandbox Code Playgroud)
无论何时添加或删除组件,都必须告诉其容器重新布局它所拥有的当前组件.你可以通过调用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();
}
Run Code Online (Sandbox Code Playgroud)
注意:您的问题的措辞方式与您假设我们知道您要做的事情一样.请在下次给我们更多信息.问题越好,信息越丰富,答案就越好,信息越丰富.
编辑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);
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
10161 次 |
| 最近记录: |