Java JApplet:为什么不';我的组件不会出现在屏幕上吗?
所以我有一个挑战,就是在一个小程序中制作一个spirograph绘图。问题是,我是Java新手,完全不知道如何让任何组件出现在屏幕上。我希望有人能添加一行额外的代码来解决这个问题,尽管我真的很感谢您的回答:)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
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();
}
}
}
}