Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java swing按钮没有';t添加新的容器组件_Java_Swing - Fatal编程技术网

Java swing按钮没有';t添加新的容器组件

Java swing按钮没有';t添加新的容器组件,java,swing,Java,Swing,我有以下swing应用程序。问题是,我希望单击按钮操作将新组件添加到容器c中。每当在构造函数中单独调用方法AddGraph()时,就会添加图表。但是,如果我在actionPerformed()中调用它,则不会添加图表。 我已尝试使AddGraph()返回图表对象,然后将其添加到actionPerformed()中,但仍然不起作用。这应该是一些非常基本的东西,但我找不到正确的方法来做 public class MainFrame extends JFrame { ChartPan

我有以下swing应用程序。问题是,我希望单击按钮操作将新组件添加到容器c中。每当在构造函数中单独调用方法
AddGraph()
时,就会添加图表。但是,如果我在
actionPerformed()
中调用它,则不会添加图表。 我已尝试使
AddGraph()
返回图表对象,然后将其添加到
actionPerformed()
中,但仍然不起作用。这应该是一些非常基本的东西,但我找不到正确的方法来做

public class MainFrame extends JFrame {

        ChartPanel chartPanel;

        public MainFrame(String title)
        {
            super(title);

    //      Set layout manager
            setLayout(new BorderLayout());

    //      Create Swing components
            JButton button = new JButton("Click me");

    //      Add swing components to content pane
            final Container c = getContentPane();

            c.add(button, BorderLayout.SOUTH);

            AddGraph(c);

    //      button behaviour here
            button.addActionListener(new ActionListener() {

                @Override
                public void actionPerformed(ActionEvent arg0) {


                    //AddGraph(c);

                }

            });
        }

        public void AddGraph(Container c)
        {

    .
    .
    .
            chartPanel = new ChartPanel(chart);
            chartPanel.setPreferredSize(new java.awt.Dimension(500, 270));



            c.add(chartPanel, BorderLayout.CENTER);


        }

    }

容器
的对象,即构造函数中的
c
公开
,并在
c
中添加图表面板

public void AddGraph(){
    .
    .
    .
    chartPanel = new ChartPanel(chart);
    chartPanel.setPreferredSize(new java.awt.Dimension(500, 270));

    //    Container c = getContentPane();

    c.add(chartPanel, BorderLayout.CENTER);
}

AddGraph应该是这样的:

public void AddGraph(Container c)
{
   .
   .
   chartPanel = new ChartPanel(chart);
   chartPanel.setPreferredSize(new java.awt.Dimension(500, 270));

   c.add(chartPanel, BorderLayout.CENTER);

}
然后在构造函数中,您可以像这样调用它:

AddGraph(c);

您不应该将组件添加到容器中吗?我没有看到你在任何地方这样做。您的
AddGraph
方法应该将容器作为参数,但我看到您创建了一个新的容器,它与
MainFrame
构造函数中的容器不同。我已将此添加c作为参数更改为AddGraph,结果仍然相同-在按钮事件外调用时工作,在调用时不工作内部…@user3259222:在
actionPerformed
方法中添加
charPanel
后,是否尝试调用
frame.validate()和frame.repaint()
JFrame
默认布局为
BorderLayout
无需显式设置。如果将组件添加到
JPanel
中,然后将此
JPanel
设置为
JFrame
的内容窗格,而不是直接将组件添加到顶层容器中,这将允许在另一个视图中再次重用相同的代码,这将是明智的做法。我尝试了,但仍然无法工作。同样的结果:在构造函数中调用AddGraph(c)有效,在按钮事件中调用它无效。如果@nIcEcOw所说的不起作用,请尝试创建一个返回
ChartPanel
的方法,然后在actionPerformed集合内容窗格中使用
setContentPane(ChartPanel)
。您还可以选择在构造函数中创建整个ChartPanel对象。