如何刷新嵌套在另一个Jpanel中的JPanel?

时间:2016-10-28 18:27:20

标签: java swing jpanel refresh repaint

我在另一个JPanel中嵌套了一个Jpanel。我想刷新其中一个JPanel而不刷新另一个。我有以下代码,我可以使用repaint()函数,但它会更新所有JPanels,而不仅仅是我想要的那个(Time JPanel)。

我如何才能刷新Time JPanel?离开天气JPanel不受影响? 我希望能够从外部线程中做到这一点。

public class MainPanel extends JPanel{

public static JPanel TimePanel = new Time();
public static Weather WeatherPanel = new Weather();

public void paintComponent(Graphics g){
    super.paintComponent(g);
    this.setBackground(Color.BLACK);
    this.setLayout(new FlowLayout(FlowLayout.LEADING, 0, 0));

    TimePanel.setLocation(0, 0);
    TimePanel.setSize(new Dimension(500, 300));
    this.add(TimePanel);

    WeatherPanel.setLocation(0,300);
    WeatherPanel.setSize(new Dimension(100, 100));
    this.add(WeatherPanel);

    //repaint();//Just causes recursion
}
}

1 个答案:

答案 0 :(得分:2)

您的代码完全错误。 paintComponent()方法用于使用Graphics对象进行绘制。您不应该向面板添加组件或更改大小,或更改绘画方法中组件的位置。

您无需覆盖paintComponent()方法。

在您的类的构造函数中,您可以在其中创建子面板并将其添加到主面板。类似的东西:

public class MainPanel extends JPanel
{

    public JPanel timePanel = new Time();
    public Weather teatherPanel = new Weather();

    public MainPanel()
    {
        this.setBackground(Color.BLACK);
        this.setLayout(new FlowLayout(FlowLayout.LEADING, 0, 0));

        this.add(timePanel);
        this.add(weatherPanel);
    }
}

请注意我是如何更改变量的:

  1. 你不应该使用静态
  2. 变量名称以小写字符开头。
  3. 我建议您先阅读Swing基础知识的Swing Tutorial。您可以查看How To Use Panels部分的工作示例。