java - 单击 JButton 后不出现 JPanel

标签 java swing jpanel awt jbutton

单击 JButton 时,我的 JPanel 不显示。当我在 go() 方法中添加 JPanel 时,它确实会出现。但是,当我尝试通过单击 JButton 来执行它时,它不起作用。不过,程序确实进入了监听器的 actionPeformed() 方法的循环。

public class MyShape 
{
    JFrame frame;
    JPanel panel;
    JButton drawButton;

    public static void main (String[] args)
    {
        MyShape test = new MyRandomShape();
        test.go();
    }

    public void go()
    {
        drawButton = new JButton("Draw Shape!");
        drawButton.addActionListener(new DrawListener());

        frame = new JFrame();
        frame.add(drawButton, BorderLayout.NORTH);
        frame.setSize(500,500);
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }    

    private class DrawListener implements ActionListener
    {
        public void actionPerformed(ActionEvent event)
        {
            if(empty)
            {
                System.out.print("IN");
                panel = new DrawPanel();
                frame.add(panel, BorderLayout.CENTER);
            }
        }
    }     

    private class DrawPanel extends JPanel
    {
        public void paintComponent(Graphics g)
        {
            super.paintComponents(g);

            int randNo = (int)(Math.random() * 3);

            int width = (int)(Math.random() * getWidth());
            int height = (int)(Math.random() * getHeight());
            int xpos = getWidth()/2-width/2;
            int ypos = getHeight()/2-height/2;

            int v1 = (int)(Math.random() * 256);
            int v2 = (int)(Math.random() * 256);
            int v3 = (int)(Math.random() * 256);

            g.setColor(new Color(v1, v2, v3));

            if(randNo == 0)
            {   
                g.fillOval(xpos, ypos, width, height);
            }
            else if(randNo == 1)
            {
                g.fillRect(xpos, ypos, width, height);
            }
            else
            {
                int startAngle = (int)(Math.random() * 360);
                int arcAngle = (int)(Math.random() * 360);
                g.fillArc(xpos, ypos, width, height, startAngle, arcAngle);
            }
        }
    }    
}

单击按钮后如何显示 JPanel?

最佳答案

每次执行一个或多个 parentComponent.add(childComponent) 时,您都必须调用 parentComponent.revalidate() (或者以其他方式更改其子组件,例如重新排序或删除它们)。

就您而言,您的代码应该是

private class DrawListener implements ActionListener {
    public void actionPerformed(ActionEvent event)
    {
        if(empty)
        {
            System.out.print("IN");
            panel = new DrawPanel();
            frame.add(panel, BorderLayout.CENTER);
            frame.revalidate(); // <---------- important
        }
    }
}

关于java - 单击 JButton 后不出现 JPanel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19792276/

相关文章:

java - 我们什么时候应该在 Java 中使用 Singleton 类?

java - 添加滚动到文本区域

Java 网格布局

Java 嵌套 JPanel 不保持指定的大小

java - 通过@Resource注入(inject)TimerService时为"Injection data not found in JNDI context"

java - 即使没有值设置为 null,我也收到 "Exception in thread "main"java.lang.NullPointerException

java - 为什么我的表在 JScrollPane 中时不可见?

java - 如何在 java 中使用 .readLine() 跟踪文件的读取?

java - 在 RTE 文本中用 <ul> 标签包裹 <li> 标签

java - 我试图让球逐渐移动