javax.swing.JFrame被覆盖

时间:2013-11-26 02:02:20

标签: java swing

我正在Windows 7上的NetBeans 7.3.1上使用Java SE进行开发。

我的java main方法有以下调用

static Vector<Point2D> acceptedByFilter, coords;

// Some code to read the coords from a file

// Some code to filter coords and produce a subset called acceptedByFilter

DisplayInputPoints();
DisplayPointsAcceptedByFilter();

这些方法定义如下

static protected void DisplayPointsAcceptedByFilter(){
    Panel panel=new Panel();
    panel.DisplayInputPoints(acceptedByFilter, xMin, xMax, yMin, yMax, true, "Points                  accepted by filter");
 }

static void DisplayInputPoints(){
    Panel panel=new Panel();
    panel.DisplayInputPoints(coords, xMin, xMax, yMin, yMax, true, "Original Points");
}

Panel.DisplayInputPoints定义如下

import javax.swing.JFrame;
import javax.swing.JPanel;

public 
class Panel extends JPanel  
{
    public static void DisplayInputPoints(Vector<Point2D> coords, double xMin, double xMax, double yMin, 
        double yMax, boolean invert, String label){

        JFrame frame = new JFrame(label);
        Panel panel = new Panel();
        panel.setPreferredSize(new Dimension((int)Math.round(xMax-xMin) + 10, 
            (int)Math.round(yMax-yMin) + 10));
        panel.loadPoints(coords);
        frame.setContentPane(panel);
        frame.pack();
        frame.setVisible(true);
        frame.repaint();
    }
}

当我打电话

DisplayInputPoints();

出现第一帧并显示coords矢量中的点。当我打电话

DisplayPointsAcceptedByFilter();

我得到另一个帧,并且acceptedByFilter中的点出现在两个帧中。也就是说,第一帧被第二帧中的显示覆盖。

阻止第一帧被仅应在第二帧中覆盖的最佳方法是什么?

2 个答案:

答案 0 :(得分:2)

您的代码结构似乎方式关闭,这可能是您的主要问题。例如,

  • 您不应该为一件事使用静态方法或字段。唯一的静态方法应该是主要的方法和相关的方法和实用方法。唯一的静态字段应该是类字段,例如常量。
  • 您的DisplayPointsAcceptedByFilter会创建一个Panel对象,导致显示第二个JFrame。从Panel类中获取显示代码,它不属于那里并导致您的问题。
  • 不要命名与Java核心类同名的类,例如Panel。
  • 您的Panel类甚至不是真正的OOP类,但只是静态方法的持有者。这违反了所有OOP规则。
  • 如果这是我的代码,我会废弃它并使用OOP原则重新编写它。

有关更详细和更好的帮助,请考虑在您的问题中提供更多信息,并可能创建和发布sscce


修改
考虑创建:

  • 从文件中读取坐标的类。然后它可以将坐标放入ArrayList。它应该没有静态方法或字段。
  • 用于过滤坐标的类。它也应该没有静态方法或字段,也没有GUI代码。
  • 扩展用于显示数据的JPanel的GUI类。
  • GUI类接受coordinaates的数组列表,然后以某种方式绘制坐标。
  • GUI类使用setter方法接受新坐标,然后重新绘制新坐标。
  • 一个带有main方法的类,它为要显示的GUI类创建一个JFrame,并编排所有其他类,让它们启动。

答案 1 :(得分:1)

你有没有想过让Panel成为一个抽象类,也许是为了两个目的专门改变它?我的意思是我觉得你应该展示更多代码以正确理解问题