javax.swing.JFrame 被覆盖

标签 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();

出现第一帧,它显示坐标 vector 中的点。当我打电话时

DisplayPointsAcceptedByFilter();

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

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

最佳答案

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

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

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


编辑
考虑创建:

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

关于javax.swing.JFrame 被覆盖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20207222/

相关文章:

java - 从 AsyncTask 类调用的 MainActivity 上不显示对话框

java - Swing 部件透明度故障

java - JTabbedpane 删除选项卡边框

java - 如何只声明一个

java - 如何在JTree中添加windows目录结构?

java - 如何修复“无法创建 protected 最终 java.lang.Class java.lang.ClassLoader.defineClass?

java - 使用 Maven 获取 Eclipse 项目的依赖文档

java - 记录密码查询

java - 对象变量的变量类型是什么?

Java JLayeredPane 内容在刷新时闪烁