2014-02-05 45 views
0

我有這樣的代碼,我希望它重新繪製,這樣,當用戶進入它打印出的加速和油耗的細節(在另一個類計算),我可以看到它的作品,因爲我有system.out.println顯示的值,但他們沒有更新到我的JFrame。repaint方法不使用的Java

窗口()被調用在另一個類另一個構造,JFrame中打開不錯,但不更新

任何想法?

感謝

public class Vehicle extends JFrame { 

    protected static double horsepower; 
    protected static double aerodynamics; 
    protected static double weight; 
    protected static double acceleration; 
    protected static double topspeed; 
    protected double fuelconsumption; 
    protected String userHorsepower; 
    protected String userWeight; 
    protected String userTopspeed; 
    protected String userInput = "No Current Selection"; 

    JPanel panel = new JPanel(); 
    JButton Van = new JButton("Add Van"); 



    public Vehicle(double horsepower, double weight, double aerodynamics, double topspeed){ 
     super(); 
    } 

    public void window(){ 

     JButton Van = new JButton("Add Van Car"); 
     Van.addActionListener(new ActionListener(){ 
      public void actionPerformed(ActionEvent e) { 

       userHorsepower = JOptionPane.showInputDialog("Enter Horsepower"); 
       horsepower = Double.parseDouble(userHorsepower); 
       userWeight = JOptionPane.showInputDialog("Enter Weight"); 
       weight = Double.parseDouble(userWeight); 
       userTopspeed = JOptionPane.showInputDialog("Enter Topspeed"); 
       topspeed = Double.parseDouble(userTopspeed); 
       aerodynamics = 0.9; 
       userInput = "Van"; 
       TestConsumption.printVan(); 
       repaint(); 
       return; 

      }}); 

     JButton SportCar = new JButton("Add Sports Car"); 
     SportCar.addActionListener(new ActionListener(){ 
      public void actionPerformed(ActionEvent e) { 
         userHorsepower = JOptionPane.showInputDialog("Enter Horsepower"); 
         horsepower = Double.parseDouble(userHorsepower); 
         userWeight = JOptionPane.showInputDialog("Enter Weight"); 
         weight = Double.parseDouble(userWeight); 
         userTopspeed = JOptionPane.showInputDialog("Enter Topspeed"); 
         topspeed = Double.parseDouble(userTopspeed); 
         aerodynamics = 0.5; 
         userInput = "Sports Car"; 
         TestConsumption.printCar(); 
         panel.repaint(); 
      }}); 

     JLabel userChoice = new JLabel(userInput); 
     JLabel accel = new JLabel("Acceleration: " + acceleration); 
     JLabel fuel = new JLabel("Fuel Consumption: " + fuelconsumption); 

     panel.setLayout(new GridLayout(5,5,0,0)); 
     panel.add(Van); 
     panel.add(SportCar); 
     panel.add(userChoice); 
     panel.add(accel); 
     panel.add(fuel); 
     add(panel); 
     pack(); 
     setTitle("Title Here"); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setResizable(true); 
     setSize(300,200); 
     setLocationRelativeTo(null); 
     setVisible(true); 
     repaint(); 
    } 

窗口被稱爲這個類

public class TestConsumption extends Vehicle { 

    public TestConsumption(double horsepower, double weight, double aerodynamics, double topspeed) { 
     super(horsepower, weight, aerodynamics, topspeed); 
    } 

    public static void main(String [] args){ 

     Vehicle vh = new Vehicle(500, 500, 500, 500); 
     vh.window(); 
    } 


    public static void printCar(){ 
     Vehicle Car = new SportCar(horsepower,weight,aerodynamics,topspeed); 

     Car.acceleration(); 
     Car.showFuelConsumption(); 
    } 

    public static void printVan(){ 

     Vehicle FirstVan = new Van(horsepower,weight,aerodynamics,topspeed); 

     FirstVan.acceleration(); 
     FirstVan.showFuelConsumption(); 
    } 
} 
+0

其中是'window()'調用,其中是'System.out'調用你提到的 –

+0

窗口在另一個類中被調用,在公共靜態void主要部分 – user3166873

+0

這是不夠的代碼給你一個回答。請提供一個[SSCCE](http://sscce.org),以顯示您在兩個班級中所做的工作。請注意,這不應該是你的整個程序,只是足夠的,所以我們可以得到一個想法。 –

回答

0

至於我們可以看到,你永遠更新的JLabel文本。計算該標籤的新對應值後,您需要在每個JLabel上撥打setText

然而,在您的情況,您JLabel對象作爲window()方法的局部範圍變量創建的,所以他們不再容易獲得(在技術上有訪問他們,因爲你將他們添加到您的JPanel的方式,但這是不必要的繁瑣)。

由於TestConsumption.printVan()顯然是用來計算加速和油耗,使生活更輕鬆,我建議促進JLabel accelJLabel fuel實例變量,然後制定個體化的方法來計算TestConsumption兩個值。所以你的動作事件可能看起來像這樣:

sportCar.addActionListener(new ActionListener(){ 
    public void actionPerformed(ActionEvent e) { 
     userHorsepower = JOptionPane.showInputDialog("Enter Horsepower"); 
     horsepower = Double.parseDouble(userHorsepower); 

     userWeight = JOptionPane.showInputDialog("Enter Weight"); 
     weight = Double.parseDouble(userWeight); 

     userTopspeed = JOptionPane.showInputDialog("Enter Topspeed"); 
     topspeed = Double.parseDouble(userTopspeed); 

     aerodynamics = 0.5; 
     userInput = "Sports Car"; 

     // These static methods would be added to your TestConsumption class 
     acceleration = TestConsumption.calculateAcceleration(...whatever params required for this calculation...); 
     fuelConsumption = TestConsumption.calculateFuelConsumption(...whatever params required for this calculation...); 

     accel.setText("Acceleration: " + acceleration); 
     fuel.setText("Fuel Consumption: " + fuelConsumption); 

     panel.repaint(); 
}}); 

或者,你不必將JLabels提升爲實例變量;只要你之前在window()方法頂部聲明accelfuel你兩個按鈕設置了ActionListener,他們將在通過actionPerformed方法的範圍機箱中的事件動作來訪問。

一些旁註:

請記住,變量名的Java命名慣例是,以小寫字母開頭他們。所以,你的VanSportCar變量應該是vansportCar。在我的例子中,我已經寫下了它們。雖然它不會造成任何問題,但從語法上講,它很難一眼就知道是否正在查看類或變量名。

據我所知,您的TestConsumption類不需要延長Vehicle。它不是一輛車;它似乎既是你的應用程序的起點,又是一個輔助類(靜態方法)。

這似乎是學校裏的功課,所以我不能肯定你是否已經明確告訴以這種方式來設計你的程序,但是從設計的角度來看,你在你的組合概念「視圖」和「模型「在一起。 A JFrame不是車輛;它是一個窗口,用於幫助表示數據的視圖元素。您可能會發現它將通過提取特定於車輛的字段和方法(如acceleration,topspeed等)將其清理到一個名爲Vehicle的單獨類中,然後您可以使用SportCarVan進行子類化(正如您似乎按照TestConsumption中的指示進行)。您的JFrame子類(我們可以稱其爲MainWindow或其他類似的東西),只負責更新其數據表示(在本例中爲我們的accelfuel JLabel)。

+1

非常感謝,這幫助我加載並解決了我的問題! – user3166873

0

呼叫window()constructor Vehicle(double horsepower, double weight, double aerodynamics, double topspeed)

+0

窗口在另一個類的構造函數中調用 – user3166873

相關問題