当前位置: 首页 > 知识库问答 >
问题:

单击JButton后JPanel不会出现

葛修筠
2023-03-14

当我的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);
            }
        }
    }    
}

共有1个答案

弘承业
2023-03-14

每次执行一个或多个ParentComponent.Add(CildComponent)(或以其他方式更改其子级,如重新排序或删除)时,都必须调用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
        }
    }
}
 类似资料:
  • 问题内容: 我在NetBeans中设计了两个JFrame。 当我单击“规则”按钮(即放在JFrame1上)时,它将打开第二个JFrame(但JFrame2在JFrame1的窗口上打开,这是我不想要的)。在第二个JFrame中,有一个“关闭”按钮。但是,当我单击此按钮时,我希望打开JFrame1并且它也能正常工作,但是JFrame2实际上没有关闭,并且JFrame1出现在JFrame2上方。 简而言

  • 我的JButton ActionListener有问题。我在另一个类中定义了一个doTheCleaning()方法,当调用该方法时,会对GUI进行一系列更改。 然后,在另一个类中,我实例化了包含doTheCleaning()方法的类,并用jbutton的actionperformed()方法编写了ActionListener,如下所示: 我知道如何执行其他操作,比如addActionListene

  • 问题内容: 我的JButton ActionListener出现问题。我在另一个类中定义了doTheCleaning()方法,该类在调用时对我的GUI进行了一系列更改。 然后在另一个类中,我实例化了包含doTheCleaning()方法的类,并用我的actionperformed()方法为我的jbutton编写了ActionListener,如下所示: 我知道如何做剩下的事情,例如addActio

  • 当用户单击时,我想将不同的添加到我的。 面板必须根据用户单击的按钮进行更改。这是我的代码的一部分: 我该怎么解决这个问题?

  • 我试图创建一个小的GUI,它有2个JButtons和2个JPanels,每个JPanels上都有一些绘图动画。默认情况下,它必须显示第一个JPanel,通过单击第二个JButton我想看到第二个JPanel。所以:我创建了JFrame、Panel1和Panel2,在这里我绘制了我的动画,创建了Button1和Button2,并向它们添加了ActionListeners。我还有一个MainPanel

  • 问题内容: 如何在Java中创建JButton,使其不可见但可单击? 使按钮不可见但不可单击,是否有任何方法使按钮不可见但可单击? 我试着做: 但这也不起作用。我要这样做是因为我想有一个带有图像的按钮,如果将不可见的JButton放在图像上,则单击图像时该按钮将响应,即不可见按钮。 问题答案: 我认为您的意思是透明的,而不是看不见的。 这将使单击的按钮不可见,即透明: 这可以回答您的问题,但是如果