Java JApplet:为什么不';我的组件不会出现在屏幕上吗?

Java JApplet:为什么不';我的组件不会出现在屏幕上吗?,java,swing,user-interface,applet,japplet,Java,Swing,User Interface,Applet,Japplet,所以我有一个挑战,就是在一个小程序中制作一个spirograph绘图。问题是,我是Java新手,完全不知道如何让任何组件出现在屏幕上。我希望有人能添加一行额外的代码来解决这个问题,尽管我真的很感谢您的回答:) import javax.swing.JApplet; 导入javax.swing.JOptionPane; 导入javax.swing.JTextField; 导入java.awt.BorderLayout; 导入java.awt.event.KeyAdapter; 导入java.awt

所以我有一个挑战,就是在一个小程序中制作一个spirograph绘图。问题是,我是Java新手,完全不知道如何让任何组件出现在屏幕上。我希望有人能添加一行额外的代码来解决这个问题,尽管我真的很感谢您的回答:)

import javax.swing.JApplet;
导入javax.swing.JOptionPane;
导入javax.swing.JTextField;
导入java.awt.BorderLayout;
导入java.awt.event.KeyAdapter;
导入java.awt.event.KeyEvent;
导入java.awt.Color;
导入java.awt.Graphics;
导入java.awt.Rectangle;
导入java.awt.Dimension;
导入java.awt.Toolkit;
公共级太空学员3_WB扩展JApplet{
int numOfPoints=1080;
int[]x=新的int[numOfPoints];
int[]y=新的int[numOfPoints];
int-x1,x2,y1,y2,宽度,高度,动画睡眠=0;
int R=75;
int r=10;
INTO=75;
JTextField changeNumOfPoints=新的JTextField(15);
公共空间学员3_WB(){
}
公开作废开始(){
这个。设置大小(600600);
此.挫折背景(新颜色(100100255));
this.getContentPane().setLayout(null);
this.getContentPane().add(changeNumOfPoints);
changeNumOfPoints.setVisible(真);
setLocation(width-changeNumOfPoints.getSize().width-25,25);
}
公共无效计算点(){
width=SpaceCadets3_WB.this.getWidth();
height=SpaceCadets3_WB.this.getHeight();

对于(int t=0;t你的睡眠绘制方法,这是你应该永远不要做的事情。调用
Thread.sleep(…)是不好的
在Swing事件线程上,但在任何绘制方法中都是错误的。因此,现在小程序无法绘制。请记住,任何绘制方法只能绘制,并且必须非常快地绘制。它不应该执行任何程序逻辑,不应该直接执行动画,它应该只绘制。使用Swing计时器,就像任何类似问题一样你该怎么做

另外,不要直接在applet中绘制,而是在applet所持有的JPanel的paintComponent方法中绘制

因此,创建您的JPanel,重写其paintComponent方法,并使用类的字段进行绘制。然后在计时器中更改这些字段的状态,并在JPanel上调用repaint()


编辑 是的,您应该避免使用空布局,因为这会妨碍您轻松、充分地向GUI添加组件。相反,在这种情况下,一个FlowLayout(JPanel的默认布局)将非常有用

例如:

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.RenderingHints;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.lang.reflect.InvocationTargetException;
import java.util.concurrent.ExecutionException;

import javax.swing.*;

@SuppressWarnings("serial")
public class SpaceCadets extends JApplet {
   @Override
   public void init() {
      try {
         SwingUtilities.invokeAndWait(new Runnable() {
            public void run() {
               SpaceCadetsPanel panel = new SpaceCadetsPanel();
               getContentPane().add(panel);
               setSize(SpaceCadetsPanel.PREF_W, SpaceCadetsPanel.PREF_H);
            }
         });
      } catch (InvocationTargetException | InterruptedException e) {
         e.printStackTrace();
      }
   }
}

@SuppressWarnings("serial")
class SpaceCadetsPanel extends JPanel {
   public static final int PREF_W = 600;
   public static final int PREF_H = 600;
   public final static int TOTAL_POINTS = 1080;
   private static final int R = 75;
   private static final int R2 = 10;
   private static final int O = 75;
   private static final Color DRAW_COLOR = Color.RED;
   private static final int ANIMATION_DELAY = 20;
   private Point[] pts;
   private JSpinner pointCountSpinner = new JSpinner(new SpinnerNumberModel(
         800, 100, 1080, 1));
   private JButton doItButton = new JButton(new DoItBtnAction("Do It!"));
   private BufferedImage bufImg = new BufferedImage(PREF_W, PREF_H,
         BufferedImage.TYPE_INT_ARGB);
   private Timer timer;
   public int imageIndex;
   private CalcWorker calcWorker;
   public Graphics2D g2;

   public SpaceCadetsPanel() {
      System.out.println(pointCountSpinner.getEditor().getClass());
      add(pointCountSpinner);
      add(doItButton);
      setBackground(Color.white);
   }

   @Override
   public Dimension getPreferredSize() {
      if (isPreferredSizeSet()) {
         return super.getPreferredSize();
      }
      return new Dimension(PREF_W, PREF_H);
   }

   @Override
   protected void paintComponent(Graphics g) {
      super.paintComponent(g);
      if (bufImg != null) {
         g.drawImage(bufImg, 0, 0, this);
      }
   }

   class DoItBtnAction extends AbstractAction {
      public DoItBtnAction(String name) {
         super(name);
         int mnemonic = (int) name.charAt(0);
         putValue(MNEMONIC_KEY, mnemonic);
      }

      @Override
      public void actionPerformed(ActionEvent e) {
         imageIndex = 0;
         if (timer != null && timer.isRunning()) {
            timer.stop();
         }
         if (g2 != null) {
            g2.dispose();
         }
         pts = new Point[0];
         bufImg = new BufferedImage(PREF_W, PREF_H, BufferedImage.TYPE_INT_ARGB);
         g2 = bufImg.createGraphics();
         g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
               RenderingHints.VALUE_ANTIALIAS_ON);
         g2.setColor(DRAW_COLOR);
         int totalPoints = 0;
         totalPoints = ((Integer) pointCountSpinner.getValue()).intValue();

         timer = new Timer(ANIMATION_DELAY, new TimerListener(totalPoints));
         calcWorker = new CalcWorker(totalPoints);
         calcWorker.addPropertyChangeListener(new CalcWorkerListener());
         calcWorker.execute();
      }
   }

   class CalcWorker extends SwingWorker<Point[], Void> {
      private int totalPoints;

      public CalcWorker(int totalPoints) {
         this.totalPoints = totalPoints;
      }

      @Override
      protected Point[] doInBackground() throws Exception {
         Point[] pts2 = new Point[totalPoints];
         for (int i = 0; i < pts2.length; i++) {
            int x = (int) ((R + R2) * Math.cos(i) - (R2 + O)
                  * Math.cos(((R + R2) / R2) * i) + PREF_W / 2);
            int y = (int) ((R + R2) * Math.sin(i) - (R2 + O)
                  * Math.sin(((R + R2) / R2) * i) + PREF_H / 2);
            pts2[i] = new Point(x, y);
         }
         return pts2;
      }
   }

   class CalcWorkerListener implements PropertyChangeListener {
      @Override
      public void propertyChange(PropertyChangeEvent evt) {
         if (SwingWorker.StateValue.DONE == evt.getNewValue()) {
            try {
               pts = calcWorker.get();
               timer.start();
            } catch (InterruptedException | ExecutionException e) {
               e.printStackTrace();
            }
         }
      }
   }

   class TimerListener implements ActionListener {
      private int totalPoints;

      public TimerListener(int totalPoints) {
         this.totalPoints = totalPoints;
      }

      @Override
      public void actionPerformed(ActionEvent e) {
         int x1 = pts[imageIndex].x;
         int y1 = pts[imageIndex].y;
         int x2 = pts[imageIndex + 1].x;
         int y2 = pts[imageIndex + 1].y;
         g2.drawLine(x1, y1, x2, y2);
         repaint();
         imageIndex++;

         if (imageIndex == totalPoints - 1) {
            ((Timer) e.getSource()).stop();
         }

      }
   }
}
导入java.awt.Color;
导入java.awt.Dimension;
导入java.awt.Graphics;
导入java.awt.Graphics2D;
导入java.awt.Point;
导入java.awt.RenderingHints;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入java.awt.image.buffereImage;
导入java.beans.PropertyChangeEvent;
导入java.beans.PropertyChangeListener;
导入java.lang.reflect.InvocationTargetException;
导入java.util.concurrent.ExecutionException;
导入javax.swing.*;
@抑制警告(“串行”)
公共级太空学员{
@凌驾
公共void init(){
试一试{
SwingUtilities.invokeAndWait(新的Runnable(){
公开募捐{
SpaceCadetsPanel=新的SpaceCadetsPanel();
getContentPane().add(面板);
设置大小(SpaceCadetsPanel.PREF_W,SpaceCadetsPanel.PREF_H);
}
});
}catch(InvocationTargetException | InterruptedException e){
e、 printStackTrace();
}
}
}
@抑制警告(“串行”)
类SpaceCadetsPanel扩展JPanel{
公共静态最终int PREF_W=600;
公共静态最终int PREF_H=600;
公共最终静态积分总积分=1080;
专用静态最终整数R=75;
专用静态最终整数R2=10;
专用静态最终INTO=75;
专用静态最终颜色绘制_Color=Color.RED;
专用静态最终int动画_延迟=20;
私人点[]临时秘书处;
私有JSpinner pointCountSpinner=新JSpinner(新SpinnerNumberModel(
800, 100, 1080, 1));
私有JButton doItButton=newjbutton(newdoitbtaction(“doit!”);
private BufferedImage bufImg=新的BufferedImage(PREF_W,PREF_H,
BuffereImage.TYPE_INT_ARGB);
私人定时器;
公共图像索引;
私人计程员计程员;
公共图形2d-g2;
公共空间学员小组(){
System.out.println(pointCountSpinner.getEditor().getClass());
添加(pointCountSpinner);
添加(doItButton);
挫折地面(颜色:白色);
}
@凌驾
公共维度getPreferredSize(){
如果(isPreferredSizeSet()){
返回super.getPreferredSize();
}
返回新维度(PREF_W,PREF_H);
}
@凌驾
受保护组件(图形g){
超级组件(g);
如果(bufImg!=null){
g、 drawImage(bufImg,0,0,this);
}
}
类DoItBtnAction扩展了AbstractAction{
公共DoItBtnAction(字符串名称){
超级(姓名);
int助记符=(int)name.charAt(0);
putValue(助记符键,助记符);
}
@凌驾
已执行的公共无效操作(操作事件e){
imageIndex=0;
if(timer!=null&&timer.isRunning()){
timer.stop();
}
如果(g2!=null){
g2.dispose();
}
pts=新点[0];
bufImg=新的BuffereImage(PREF_W,PREF_H,BuffereImage.TYPE_INT_ARGB);
g2=bufImg.createGraphics();
g2.setRenderingHint(RenderingHints.KEY_抗锯齿,
RenderingHints.VALUE_ANTIALIAS_ON);
g2.设置颜色(绘制颜色);
int totalPoints=0;
totalPoints=((整数)pointCountSpinner.getValue()).intValue();
计时器=新计时器(动画延迟、新计时器指示器(总点));
calcWorker=新calcWorker(总分);
addPropertyChangeListener(新的CalcWorkerListener()
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.RenderingHints;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.lang.reflect.InvocationTargetException;
import java.util.concurrent.ExecutionException;

import javax.swing.*;

@SuppressWarnings("serial")
public class SpaceCadets extends JApplet {
   @Override
   public void init() {
      try {
         SwingUtilities.invokeAndWait(new Runnable() {
            public void run() {
               SpaceCadetsPanel panel = new SpaceCadetsPanel();
               getContentPane().add(panel);
               setSize(SpaceCadetsPanel.PREF_W, SpaceCadetsPanel.PREF_H);
            }
         });
      } catch (InvocationTargetException | InterruptedException e) {
         e.printStackTrace();
      }
   }
}

@SuppressWarnings("serial")
class SpaceCadetsPanel extends JPanel {
   public static final int PREF_W = 600;
   public static final int PREF_H = 600;
   public final static int TOTAL_POINTS = 1080;
   private static final int R = 75;
   private static final int R2 = 10;
   private static final int O = 75;
   private static final Color DRAW_COLOR = Color.RED;
   private static final int ANIMATION_DELAY = 20;
   private Point[] pts;
   private JSpinner pointCountSpinner = new JSpinner(new SpinnerNumberModel(
         800, 100, 1080, 1));
   private JButton doItButton = new JButton(new DoItBtnAction("Do It!"));
   private BufferedImage bufImg = new BufferedImage(PREF_W, PREF_H,
         BufferedImage.TYPE_INT_ARGB);
   private Timer timer;
   public int imageIndex;
   private CalcWorker calcWorker;
   public Graphics2D g2;

   public SpaceCadetsPanel() {
      System.out.println(pointCountSpinner.getEditor().getClass());
      add(pointCountSpinner);
      add(doItButton);
      setBackground(Color.white);
   }

   @Override
   public Dimension getPreferredSize() {
      if (isPreferredSizeSet()) {
         return super.getPreferredSize();
      }
      return new Dimension(PREF_W, PREF_H);
   }

   @Override
   protected void paintComponent(Graphics g) {
      super.paintComponent(g);
      if (bufImg != null) {
         g.drawImage(bufImg, 0, 0, this);
      }
   }

   class DoItBtnAction extends AbstractAction {
      public DoItBtnAction(String name) {
         super(name);
         int mnemonic = (int) name.charAt(0);
         putValue(MNEMONIC_KEY, mnemonic);
      }

      @Override
      public void actionPerformed(ActionEvent e) {
         imageIndex = 0;
         if (timer != null && timer.isRunning()) {
            timer.stop();
         }
         if (g2 != null) {
            g2.dispose();
         }
         pts = new Point[0];
         bufImg = new BufferedImage(PREF_W, PREF_H, BufferedImage.TYPE_INT_ARGB);
         g2 = bufImg.createGraphics();
         g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
               RenderingHints.VALUE_ANTIALIAS_ON);
         g2.setColor(DRAW_COLOR);
         int totalPoints = 0;
         totalPoints = ((Integer) pointCountSpinner.getValue()).intValue();

         timer = new Timer(ANIMATION_DELAY, new TimerListener(totalPoints));
         calcWorker = new CalcWorker(totalPoints);
         calcWorker.addPropertyChangeListener(new CalcWorkerListener());
         calcWorker.execute();
      }
   }

   class CalcWorker extends SwingWorker<Point[], Void> {
      private int totalPoints;

      public CalcWorker(int totalPoints) {
         this.totalPoints = totalPoints;
      }

      @Override
      protected Point[] doInBackground() throws Exception {
         Point[] pts2 = new Point[totalPoints];
         for (int i = 0; i < pts2.length; i++) {
            int x = (int) ((R + R2) * Math.cos(i) - (R2 + O)
                  * Math.cos(((R + R2) / R2) * i) + PREF_W / 2);
            int y = (int) ((R + R2) * Math.sin(i) - (R2 + O)
                  * Math.sin(((R + R2) / R2) * i) + PREF_H / 2);
            pts2[i] = new Point(x, y);
         }
         return pts2;
      }
   }

   class CalcWorkerListener implements PropertyChangeListener {
      @Override
      public void propertyChange(PropertyChangeEvent evt) {
         if (SwingWorker.StateValue.DONE == evt.getNewValue()) {
            try {
               pts = calcWorker.get();
               timer.start();
            } catch (InterruptedException | ExecutionException e) {
               e.printStackTrace();
            }
         }
      }
   }

   class TimerListener implements ActionListener {
      private int totalPoints;

      public TimerListener(int totalPoints) {
         this.totalPoints = totalPoints;
      }

      @Override
      public void actionPerformed(ActionEvent e) {
         int x1 = pts[imageIndex].x;
         int y1 = pts[imageIndex].y;
         int x2 = pts[imageIndex + 1].x;
         int y2 = pts[imageIndex + 1].y;
         g2.drawLine(x1, y1, x2, y2);
         repaint();
         imageIndex++;

         if (imageIndex == totalPoints - 1) {
            ((Timer) e.getSource()).stop();
         }

      }
   }
}