如何修改JPanel

时间:2017-09-24 10:37:46

标签: java swing

我尝试更改JPanel。 我的主要课程

<div class="wrapper">
  <div class="item1"></div>
  <div class="item2"></div>
  <div class="item3"></div>
</div>

MyFrame类。在这里,我添加了JPanel并实现了ActionListener

public class Main {
        public static void main(String[] args) {
            MyFrame frame = new MyFrame();
        }
    }

和MyPanel课程

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;

public class MyFrame extends JFrame implements ActionListener{
    MyPanel myPanel;
    JButton myButton = new JButton("reset");
    public MyFrame(){
        this.setSize(300, 500);
        this.setLayout(new BorderLayout());

        myButton.addActionListener(this);
        this.add(myButton, BorderLayout.SOUTH);

        myPanel = new MyPanel();
        myPanel.setButtons(3);

        this.add(myPanel, BorderLayout.CENTER);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setVisible(true);
    }

    @Override
    public void actionPerformed(ActionEvent event) {
        if (event.getSource().equals(myButton)){
            System.out.println("click");
            this.remove(myPanel);
            myPanel.setButtons(5);
            this.add(myPanel, BorderLayout.CENTER);
            //I want to change number of buttons on MyPanel to 5
        }
    }
}

点击&#34;重置&#34;我的期望是什么?按钮我想要更改JPanel(remowe三个现有按钮并添加五个)。 它会改变,但只有在我调整窗口大小之后。为什么呢?

2 个答案:

答案 0 :(得分:1)

更改组件后,您需要告诉框架它应该重新进行布局。因此,在我们的动作侦听器方法中添加一行:

    public void actionPerformed( ActionEvent event ) {
        if ( event.getSource().equals( myButton ) ) {
            System.out.println( "click" );
            this.remove( myPanel );
            myPanel.setButtons( 5 );
            this.add( myPanel, BorderLayout.CENTER );
            revalidate(); // <-- tell frame to update!
        }
    }

答案 1 :(得分:0)

使用@dosenfant的代码,您也可以在重新验证之前重新绘制。

public void actionPerformed( ActionEvent event ) {
    if ( event.getSource().equals( myButton ) ) {
        System.out.println( "click" );
        this.remove( myPanel );
        myPanel.setButtons( 5 );
        this.add( myPanel, BorderLayout.CENTER );
        repaint();
        revalidate(); 
    }
}