【问题标题】:JPanel does not appear after click JButton点击 JButton 后 JPanel 不出现
【发布时间】:2013-11-16 12:30:15
【问题描述】:

单击我的 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?

【问题讨论】:

  • panel.setVisibile(true)?
  • @DHT,我相信frame.setVisible(true); 可以做到。不过不确定。

标签: java swing jpanel awt jbutton


【解决方案1】:

每次执行一个或多个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
        }
    }
}

【讨论】:

  • 它有效。但是,它复制了我不想要的 JButton。有没有办法防止 JButton 的重复?
  • 既然 DrawPanel 是您想要显示的唯一内容,为什么不在添加之前调用 frame.removeAll(); 呢?这将确保按钮被移除。或者,您可以直接删除 JButton。
【解决方案2】:

少量改动,检查一下

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

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

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

private class DrawListener implements ActionListener {

    public void actionPerformed(ActionEvent event) {

            frame.getContentPane().remove(1);
            panel = new DrawPanel();
            frame.getContentPane().add(panel, BorderLayout.CENTER);
            frame.repaint();
            frame.validate();

    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-17
    • 2023-03-12
    • 2013-12-09
    • 1970-01-01
    • 2012-12-10
    • 2014-10-10
    • 1970-01-01
    相关资源
    最近更新 更多