繁体   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