2014-01-29 63 views
0

我創建了一個簡單的「電梯」程序(它仍處於開始階段),當我點擊UP時,它會上升到1樓,反之亦然。將JFrame傳輸到JPanel

當我將所有組件都繪製到JFrame中時,我非常糟糕,並且如預期的那樣,每次單擊按鈕(重繪)時它都會閃爍。我知道要在JPanel中繪製的解決方案,並將所述面板放在JFrame中,但是在將JFrame組件轉換爲JPanel時遇到問題。我試過擴展JPanel,創建一個JFrame對象,然後重寫paintComponent()方法並在那裏做繪製,但是當我編譯它時根本沒有繪製它。它只創建框架。

任何人都可以幫助我或給我提示,關於如何將我的編程從JFrame基礎轉移到基於JPanel?先謝謝你!

我的代碼如下:

import java.awt.*; 
import javax.swing.*; 
import java.awt.event.ActionListener; 
import java.awt.event.ActionEvent; 
import javax.swing.Timer; 
import java.math.*; 



public class MyCanvas extends JFrame { 

private int up = 0; 
private int down = 0; 
private int movefloorup = 0; 
private int buildingType;//type of building (1 = Residential, 2 = Commercial) 
private int totnumoffloors; //for the total number of floors 
private int numofelevators; //for the number of elevators to be generated 
private int floorlimit = 0; //to determine up until where the elevator will be moving 
private int currenttime; //determine the time of the day the elevator is operating (1 = Morning, 2 = Lunch, 3 = Afternooon) 

//For elevator resetting to bottom 
private int rectX = 190; 
private int switchmarker = 0; 

//Lines and stuff 
private int horizborder = 0; 
private int bordercount = 0; 

private class UpAction implements ActionListener //move the elevator up 
{ 
    public void actionPerformed(ActionEvent e) 
    { 
     if(movefloorup<780){ 
      repaint(); 
      up++; 
      movefloorup = movefloorup + 130; 
      //repaint(); 

     } 
     else 
     { 
       switchmarker = 1; 
       movefloorup = 0; 
       repaint(); 

     } 
    } 
} 

private class DownAction implements ActionListener //move the elevator down 
{ 
    public void actionPerformed(ActionEvent e) 
    { 

     if(movefloorup>0){ 
     repaint(); 
     down++; 
     movefloorup = movefloorup - 130; 
     //repaint(); 
     } 

     else 
     { 
      switchmarker = 0; 
      movefloorup = 780; 
      repaint(); 
     } 
    } 
} 


public MyCanvas(int buildingType, int totnumoffloors, int numofelevators, int currenttime){ 


    this.buildingType = buildingType; 
    this.totnumoffloors = totnumoffloors; 
    this.numofelevators = numofelevators; 
    this.currenttime = currenttime; 
    String title; 

    if(this.buildingType == 1) 
    { 
     title = "Residential Building"; 
    } 
    else 
    { 
     title = "Commercial Building"; 
    } 

    setLayout(null); 

    horizborder = 500*((int)Math.ceil((double)totnumoffloors/7)); //calculating how wide the window should be 
    bordercount = ((int)Math.ceil((double)totnumoffloors/7)); //counts how many borders there will be 

    //NOTES 
    //A floor is 130 units in the Y-Direction 


    //Drawing the bulding layout 
    if(totnumoffloors>7) 
    { 
     setSize(horizborder, 1000); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setTitle(title); 
     setLayout(new BorderLayout()); 
     getContentPane().setBackground(Color.WHITE); 
    } 

    else{ 
     setSize(500, 1000); //suitable for 7 floors 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setTitle(title); 
     setLayout(new BorderLayout()); 
     getContentPane().setBackground(Color.WHITE); 
    } 

    JButton upButton = new JButton("UP"); 
    upButton.addActionListener(new UpAction()); 
    add(upButton, BorderLayout.NORTH); 

    JButton downButton = new JButton("DOWN"); 
    //downButton.setBounds(0, 0, 220, 30); 
    //downButton.setLocation(100, 100); 
    downButton.addActionListener(new DownAction()); 
    add(downButton, BorderLayout.SOUTH); 


} 


public void paint(Graphics graphics){ //this is where you draw shit 

    super.paint(graphics); 

    //Floors 
    graphics.setColor(Color.RED); 

    int numoffloorsY = 830; 
    int numoffloorsX = 830; 
    int floorbeginning = 0; 
    int floorcounter = 1; 
    int floorflag = 0; 
    int rightedge = 500; 

    if(this.totnumoffloors>7) //drawing the floors 
    { 

     //Default number of floors -> 7 
     for(int i = 0;i<totnumoffloors;i++) 
     { 
      graphics.setColor(Color.RED); 
      graphics.drawLine(floorbeginning,numoffloorsX,rightedge,numoffloorsY); //FLOORS 
      graphics.setColor(Color.DARK_GRAY); 
      graphics.setFont(new Font("TimesRoman", Font.PLAIN, 15)); 
      graphics.drawString(" "+floorcounter, floorbeginning+10, numoffloorsY+20); //SAVE THIS FOR DRAWING FLOORS 
      numoffloorsY = numoffloorsY - 130; 
      numoffloorsX = numoffloorsX - 130; 
      floorcounter++; 
      floorflag++; 

      if(floorflag==7) 
      { 
       floorbeginning = floorbeginning + 500; 
       rightedge = rightedge+500; 
       numoffloorsY = 830; 
       numoffloorsX = 830; 
       floorflag = 0; 
      } 


     } 



     //Every other floor past 7 will be added here. 
     /*for(int i = 0;i<totnumoffloors-7;i++) 
     { 
      //System.out.println("LOLOOLO"); 
      graphics.setColor(Color.RED); 
      graphics.drawLine(floorbeginning,numoffloorsX,horizborder,numoffloorsY); 
      graphics.setColor(Color.DARK_GRAY); 
      graphics.setFont(new Font("TimesRoman", Font.PLAIN, 15)); 
      graphics.drawString(" "+floorcounter, floorbeginning, numoffloorsY+20); 
      //graphics.setColor(Color.DARK_GRAY); 
      //graphics.drawLine(500,0,500,1000); 

      floorcounter++; 

      numoffloorsY = numoffloorsY - 130; 
      numoffloorsX = numoffloorsX - 130; 
     }*/ 

     //DIVIDING LINE -> to determine the first 7 floors from the ones higher up. 
     for(int i=0;i<bordercount;i++) 
     { 
      graphics.setColor(Color.DARK_GRAY); 
      graphics.drawLine(500*i,0,500*i,1000); 

     } 

    } 

    else{ 

     for(int i = 0;i<this.totnumoffloors;i++) 
     { 
      graphics.setColor(Color.RED); 
      graphics.drawLine(0,numoffloorsX,500,numoffloorsY); 
      graphics.setColor(Color.DARK_GRAY); 
      graphics.setFont(new Font("TimesRoman", Font.PLAIN, 15)); 
      graphics.drawString(" "+floorcounter, floorbeginning+10, numoffloorsY+20); //SAVE THIS FOR DRAWING FLOOR 
      numoffloorsY = numoffloorsY - 130; 
      numoffloorsX = numoffloorsX - 130; 
      floorcounter++; 
     } 
    } 

    //Drawing the elevators 
    if(up>0 && movefloorup<1000){ 

    graphics.setColor(Color.GRAY); 
    if(switchmarker==1) 
    { 
     System.out.println("ELSA"); 
     rectX = 690; 
     //rectX = rectX + 190; 

    } 
    else 
    { 
     rectX = 190; 
    } 

    System.out.println(rectX); 
    graphics.fillRect(rectX, 850-movefloorup, 100, 100); //this needs to match the stats of the rectangle to fill it properly 
    graphics.drawRect(rectX, 850-movefloorup, 100, 100); 

    //Line for the door 
    graphics.setColor(Color.BLACK); 
    graphics.drawLine(rectX+50, 850-movefloorup, rectX+50, 950-movefloorup); //match the y-coordinate for the rectangle, add 100 for the y-coordinate of the other end 

    System.out.println(movefloorup); 
    System.out.println(switchmarker); 

    //drawLine(x1, y1, x2, y2); --From (x1,y1) to (x2,y2) 
    } 

    else if(down>0 && movefloorup>0) 
    { 
    graphics.setColor(Color.GRAY); 

    if(switchmarker==1) //This determines when the elevator should move to the next column of higher floors. 
    { 
     System.out.println("ELSA"); 
     rectX = 500; 
    } 
    System.out.println(rectX); 
    graphics.fillRect(rectX, 850-movefloorup, 100, 100); //this needs to match the stats of the rectangle to fill it properly 
    //graphics.drawRect(190, 850 + movefloorup, 100, 100); //FIRST FLOOR 
    graphics.drawRect(rectX, 850-movefloorup, 100, 100); //SECOND FLOOR (135 units difference in Y-axis between floors) 
    //x-coordinate, y-coordinate, width, height 


    //Line for the door 
    graphics.setColor(Color.BLACK); 
    graphics.drawLine(rectX+50, 850-movefloorup, rectX+50, 950-movefloorup); //match the y-coordinate for the rectangle, add 100 for the y-coordinate of the other end 

    System.out.println(movefloorup); 
    System.out.println(switchmarker); 
    } 

    else 
    { 
    graphics.setColor(Color.GRAY); 
    graphics.fillRect(190, 850, 100, 100); //this needs to match the stats of the rectangle to fill it properly 
    graphics.drawRect(190, 850, 100, 100); //FIRST FLOOR 
    graphics.drawRect(190, 850, 100, 100); //SECOND FLOOR (135 units difference in Y-axis between floors) 
     //x-coordinate, y-coordinate, width, height 
    //Line for the door 
    graphics.setColor(Color.BLACK); 
    graphics.drawLine(240, 850, 240, 950); //match the y-coordinate for the rectangle, add 100 for the y-coordinate of the other end 
     //System.out.println("In else!"); 

    } 

} 

} 

主類只是獲取用戶的輸入,如樓層,數量,時間等

回答

2

這將是一個小亂。

首先創建一個從JPanel(我將其稱爲ElevatorPane)的自定義組件。

取當前的paint方法的內容,並將它們放在這個組件paintComponent的方法中。這將涉及移動實例變量,該paintComponent方法將需要包括totnumoffloorsbordercountupdownmovefloorupswitchmarkerrectX

這是它變得有點凌亂...

您需要請將您的ActionListeners的內容翻譯成ElevatorPane內的方法,這樣您就可以在不暴露細節的情況下公開功能...

ElevatorPane內創建構造函數這需要樓層的數量。

覆蓋的ElevatorPanegetPrefferedSize方法,並返回大小的組件必須滿足您的需求...

MyCanvas創建的ElevatorPane實例字段,實例並把它添加到框架。

清潔,建造,運行...

+0

首先,非常感謝你回答這個問題。通過創建一個新組件,你的意思是創建一個新的課程是正確的?對不起,我對Java並不熟悉。 –

+1

是............ – MadProgrammer