removeAll不会在下次验证时删除?

pst*_*ton 5 java swing

有人可以解释为什么以下不能像我期望的那样工作吗?

按下"应该"按钮会导致显示只包含(空)JScrollPane,即输入字段和按钮应该消失.然而,它们一直存在,直到组件调整大小...

public static void main(String[] args)
{
    JFrame frame = new JFrame("test");
    frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    final JPanel panel = new JPanel();

    Container cp = frame.getContentPane();
    cp.setLayout(new FlowLayout());
    cp.add(new JScrollPane(panel));

    Component textField = new JTextField("i am input");
    JButton button = new JButton(new AbstractAction("i am pressy")
    {
        @Override
        public void actionPerformed(ActionEvent e)
        {
            // this is already on the EDT
            panel.removeAll();
            panel.revalidate();
        }
    });

    panel.setLayout(new FlowLayout());
    panel.add(textField);
    panel.add(button);

    frame.pack();
    frame.setVisible(true);
}
Run Code Online (Sandbox Code Playgroud)

谢谢你的帮助.页.

cam*_*ckr 19

更新可见GUI时,代码应为:

panel.revalidate();
panel.repaint(); // sometimes needed, this appears to be one of them
Run Code Online (Sandbox Code Playgroud)


tra*_*god 9

revalidate()方法将组件标记为需要布局,但在触发某些操作之前,repaint()您将看不到任何更改.调整父窗口的大小就是这样一个触发器; 切换应用是另一回事.在此之前的版本中,请注意setSize()面板上的内容是如何避免需要的repaint().同样,此示例更改了布局resetGame().

在AWT和Swing中绘画的文章更详细.

import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.WindowConstants;

/** @see https://stackoverflow.com/questions/5812002 */
public class RevalidateTest {

    private static JPanel panel = new JPanel(); // default FlowLayout
    private static JTextField text = new JTextField("Text field");
    private static JButton clear = new JButton(new AbstractAction("Clear") {

        @Override
        public void actionPerformed(ActionEvent e) {
            panel.removeAll();
            panel.add(reset);
            panel.revalidate();
            panel.repaint();
        }
    });
    private static JButton reset = new JButton(new AbstractAction("Reset") {

        @Override
        public void actionPerformed(ActionEvent e) {
            panel.removeAll();
            panel.add(text);
            panel.add(clear);
            panel.revalidate();
            panel.repaint();
        }
    });

    static void createAndShowGUI() {
        JFrame frame = new JFrame("Test");
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        panel.add(text);
        panel.add(clear);
        frame.add(panel); // default BorderLayout center
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                createAndShowGUI();
            }
        });
    }
}
Run Code Online (Sandbox Code Playgroud)