2013-11-26 143 views
1

我在Windows上的NetBeans 7.3.1使用Java SE開發7.javax.swing.JFrame中被覆蓋

我的Java的主要方法有以下電話

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點出現在幀。也就是說,第一幀被第二幀中的顯示覆蓋。

什麼是最好的方法來阻止第一幀被應該只在第二幀中被覆蓋?

+0

請參閱[使用多個JFrames,好/壞實踐?](http://stackoverflow.com/a/9554657/418556) –

回答

2

您的代碼結構似乎是關閉方式,這可能是您的主要問題。例如,

  • 你不應該使用靜態方法或字段的一件事。唯一的靜態方法應該是主要的和相關的方法和實用方法。唯一的靜態字段應該是類字段,如常量。
  • 您的DisplayPointsAcceptedByFilter創建一個Panel對象,它導致第二個JFrame顯示。從Panel類獲取顯示代碼,它不屬於那裏,並導致您的問題。
  • 不要命名與Java核心類相同名稱的類,例如Panel。
  • 你的Panel類甚至不是一個真正的OOP類,而只是一個靜態方法的持有者。這反對所有OOP規則。
  • 如果這是我的代碼,我會放棄它,並使用面向對象的原則重新編寫它。

有關更詳細和更好的幫助,請考慮在您的問題中提供更多信息,並可能創建併發布sscce


編輯
考慮創建:

  • ,在從文件中讀取座標的類。然後它可以將座標放入ArrayList中。它應該沒有靜態方法或字段。
  • 用於過濾座標的類。它也應該沒有靜態方法或字段,也沒有GUI代碼。
  • 擴展用於顯示數據的JPanel的GUI類。
  • GUI類接受座標數組列表,然後以某種方式繪製座標。
  • GUI類使用setter方法接受新座標,然後重新繪製新座標。
  • 一個帶有主要方法的類,它創建一個用於顯示GUI類的JFrame,並編排所有其他類,使它們啓動。
+0

希望將DisplayInputPoints()移出較大的類並將其移入Panel類。我忽略了它實際上稱爲Panel類的事實。我爲顯示代碼創建了一個單獨的類,並將其從Panel類中取出。這解決了問題。我看到你關於Panel類命名的觀點。我沒有意識到有這個名字的java類。 (我認爲這只是JPanel。)我會改變班級的名字。謝謝。 – OtagoHarbour

1

您是否曾想過讓Panel成爲一個抽象類,並且可能爲了兩個目的而專門改變它?我的意思是我覺得你應該展示更多代碼來正確理解問題