簡體   English   中英

JFrame不從單獨的類添加圖形

[英]JFrame not adding graphics from separate class

我很擅長搖擺,而且我的JFrame中沒有顯示圖形的問題。 我應該看到的是一個藍色的矩形,慢慢向下穿過框架,在它后面是一個純白色的背景。 但是,當我運行我的主類時,我看到的只是一個普通的JFrame。 這是我的代碼:

Execute課程

public class Execute {

public static void main (String[ ] args) {
    GUI gui = new GUI();
    gui.createFrame(800,600);

    ElevatorOne e1 = new ElevatorOne();
    e1.addElevatorOne();
}
}

ElevatorOne類(應該初始化和添加圖形的位置)

import java.awt.Color;
import java.awt.Graphics;

import javax.swing.JPanel;

public class ElevatorOne extends GUI{

int y = 100;

public void addElevatorOne() {

    drawElevatorOne drawE1 = new drawElevatorOne();
    frame.getContentPane().add(drawE1);

    for(int i = 0; i < 130; i++) {
        y++;

        drawE1.repaint();

        try {
            Thread.sleep(50);
        } catch (Exception ex) { }
    }
}

@SuppressWarnings("serial")
class drawElevatorOne extends JPanel{
    public void paintComponent(Graphics g) {
        g.setColor(Color.WHITE);
        g.fillRect(0, 0, getWidth(), getHeight());

        g.setColor(Color.BLUE);
        g.drawRect(200,y,40,60);
    }
}

}

最后,我的GUI類(創建frame )導入javax.swing.JFrame;

public class GUI {

JFrame frame = new JFrame();

public void createFrame(int x, int y) {
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setVisible(true);
    frame.setResizable(false);
    frame.setSize(x, y);
}

}

雖然你已經接受了一個接受的答案,但我確實對這個答案有疑問並感到有必要加上我的兩分錢:

  • 我認為你有一個GUI類沒有任何意圖,然后讓Elevator1擴展它。 如果您希望Elevator1使用JFrame,那么讓它創建一個JFrame,因為您的繼承確實沒有必要或從中受益。
  • 我自己,我有Elevator1擴展JPanel,然后用它自己的paintComponent方法繪制,因此不需要drawElevatorOne內部類(應該命名為DrawElevatorOne以遵守Java命名約定)。
  • 您在Swing GUI中使用Thread.sleep,這是非常危險的。 這有效的唯一原因是因為它是在主線程中調用的。 如果您的代碼已正確創建並設置為在Swing事件線程中啟動並創建GUI組件,那么這將會失敗,因為它會使Swing事件線程進入休眠狀態。 不要這樣做,不要在可能在Swing事件線程中調用的方法中調用Thread.sleep。
  • 而是使用Swing Timer來管理延遲。
  • 不要忘記(幾乎)總是在你的oeverride中調用super.paintComponent(g)方法。 不這樣做打破了Swing繪畫鏈,並且存在很難調試副作用的風險。

例如:

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;

public class ElevatorTest {
   private static final int PREF_W = 800;
   private static final int PREF_H = 600;

   private static void createAndShowGui() {
      MyElevator mainPanel = new MyElevator(PREF_W, PREF_H);

      JFrame frame = new JFrame("Elevator Test");
      frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
      frame.getContentPane().add(mainPanel);
      frame.pack();
      frame.setLocationByPlatform(true);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      // start everything on the Swing event thread
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}

class MyElevator extends JPanel {
   private static final Color BACKGROUND = Color.white;
   private static final int ELEVATOR_X = 200;
   private static final int ELEVATOR_W = 40;
   private static final int ELEVATOR_H = 60;
   private static final int TIMER_DELAY = 50;
   public static final int MAX_ELEVATOR_Y = 130;
   private static final Color ELEVATOR_COLOR = Color.blue;
   private int prefW;
   private int prefH;
   private int elevatorY = 0;

   public MyElevator(int prefW, int prefH) {
      this.prefW = prefW;
      this.prefH = prefH;
      setBackground(BACKGROUND);

      new Timer(TIMER_DELAY, new TimerListener()).start();
   }

   @Override
   protected void paintComponent(Graphics g) {
      // Don't forget to call the super method
      super.paintComponent(g);

      g.setColor(ELEVATOR_COLOR);
      g.fillRect(ELEVATOR_X, elevatorY, ELEVATOR_W, ELEVATOR_H);
   }

   // to help size our GUI properly
   @Override
   public Dimension getPreferredSize() {
      Dimension superSz = super.getPreferredSize();
      if (isPreferredSizeSet()) {
         return superSz;
      }
      int w = Math.max(superSz.width, prefW);
      int h = Math.max(superSz.height, prefH);
      return new Dimension(w, h);
   }

   private class TimerListener implements ActionListener {
      @Override
      public void actionPerformed(ActionEvent e) {
         if (elevatorY >= MAX_ELEVATOR_Y) {
            // if elevator at max, stop thimer
            ((Timer) e.getSource()).stop();
         } else {
            // advance elevator and draw it
            elevatorY++;
            repaint();
         }
      }
   }
}

您的ElevatorOne類擴展了GUI。 因此,它繼承了GUI的所有功能,但您創建了它們。 這可能是你打算做的:

編輯:我運行此代碼,確實有一個框移動指定。

public class Execute {

public static void main (String[ ] args) {
    //    GUI gui = new GUI();
    //    gui.createFrame(800,600);

    ElevatorOne e1 = new ElevatorOne();
    e1.createFrame(800, 600);
    e1.addElevatorOne();
}

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM