Java 移动椭圆以跟随光标
我想要一些建议: 我正在学习如何使用swing,我有一个助手建议制作一个应用程序,用户可以从一个组合框中选择JPanel的背景颜色(实现为自定义光束)。此外,我们还有其他组合框来选择形状的颜色。 用户需要移动光标并观察跟随它的五个椭圆形。然后我完成了所有的界面,我学会了如何使用计时器每100毫秒重新绘制画布 接口: 那么,我怎样才能存储椭圆形的最后五个位置呢?我的代码: 基架:Java 移动椭圆以跟随光标,java,Java,我想要一些建议: 我正在学习如何使用swing,我有一个助手建议制作一个应用程序,用户可以从一个组合框中选择JPanel的背景颜色(实现为自定义光束)。此外,我们还有其他组合框来选择形状的颜色。 用户需要移动光标并观察跟随它的五个椭圆形。然后我完成了所有的界面,我学会了如何使用计时器每100毫秒重新绘制画布 接口: 那么,我怎样才能存储椭圆形的最后五个位置呢?我的代码: 基架: import java.awt.Color; import java.awt.geom.Point2D; impor
import java.awt.Color;
import java.awt.geom.Point2D;
import java.lang.reflect.Field;
public class Frame extends javax.swing.JFrame {
public Frame() {
initComponents();
}
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {
chooseBackground = new javax.swing.JComboBox<>();
chooseShape = new javax.swing.JComboBox<>();
jLabel1 = new javax.swing.JLabel();
jLabel2 = new javax.swing.JLabel();
jLabel3 = new javax.swing.JLabel();
canvas1 = new lienzo();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
chooseBackground.setModel(new javax.swing.DefaultComboBoxModel<>(new String[] { "WHITE", "BLACK", "PINK" }));
chooseBackground.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
chooseBackgroundActionPerformed(evt);
}
});
chooseShape.setModel(new javax.swing.DefaultComboBoxModel<>(new String[] { "BLUE", "YELLOW", "ORANGE" }));
chooseShape.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
chooseShapeActionPerformed(evt);
}
});
jLabel1.setText("Seleccione el color:");
jLabel2.setText("Fondo:");
jLabel3.setText("Figura:");
canvas1.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() {
public void mouseMoved(java.awt.event.MouseEvent evt) {
canvas1MouseMoved(evt);
}
});
canvas1.addMouseListener(new java.awt.event.MouseAdapter() {
public void mouseEntered(java.awt.event.MouseEvent evt) {
canvas1MouseEntered(evt);
}
public void mouseExited(java.awt.event.MouseEvent evt) {
canvas1MouseExited(evt);
}
});
javax.swing.GroupLayout canvas1Layout = new javax.swing.GroupLayout(canvas1);
canvas1.setLayout(canvas1Layout);
canvas1Layout.setHorizontalGroup(
canvas1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 0, Short.MAX_VALUE)
);
canvas1Layout.setVerticalGroup(
canvas1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 184, Short.MAX_VALUE)
);
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGap(31, 31, 31)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addComponent(jLabel1)
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
.addComponent(canvas1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addGroup(layout.createSequentialGroup()
.addComponent(jLabel2)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addComponent(chooseBackground, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 59, Short.MAX_VALUE)
.addComponent(jLabel3)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addComponent(chooseShape, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))
.addGap(97, 97, 97))))
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGap(13, 13, 13)
.addComponent(jLabel1)
.addGap(18, 18, 18)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(chooseBackground, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(chooseShape, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(jLabel2)
.addComponent(jLabel3))
.addGap(18, 18, 18)
.addComponent(canvas1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap(33, Short.MAX_VALUE))
);
pack();
}// </editor-fold>
private void chooseBackgroundActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
String selection = chooseBackground.getSelectedItem().toString();
Color color;
try{
Field field = Class.forName("java.awt.Color").getField(selection);
color = (Color)field.get(null);
}catch(Exception e){
color = null;
}
canvas1.setBackground(color);
}
private void chooseShapeActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
String selection = chooseShape.getSelectedItem().toString();
Color color;
try{
Field field = Class.forName("java.awt.Color").getField(selection);
color = (Color)field.get(null);
}catch(Exception e){
color = null;
}
canvas1.setForeground(color);
}
private void canvas1MouseMoved(java.awt.event.MouseEvent evt) {
// TODO add your handling code here:
canvas1.setX(evt.getX());
canvas1.setY(evt.getY());
}
private void canvas1MouseEntered(java.awt.event.MouseEvent evt) {
// TODO add your handling code here:
canvas1.userHasMouseEntered=true;
}
private void canvas1MouseExited(java.awt.event.MouseEvent evt) {
// TODO add your handling code here:
canvas1.userHasMouseEntered=false;
}
/**
* @param args the command line arguments
*/
public static void main(String args[]) {
/* Set the Nimbus look and feel */
//<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
/* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
* For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html
*/
try {
for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
if ("Nimbus".equals(info.getName())) {
javax.swing.UIManager.setLookAndFeel(info.getClassName());
break;
}
}
} catch (ClassNotFoundException ex) {
java.util.logging.Logger.getLogger(Frame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
} catch (InstantiationException ex) {
java.util.logging.Logger.getLogger(Frame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
} catch (IllegalAccessException ex) {
java.util.logging.Logger.getLogger(Frame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
} catch (javax.swing.UnsupportedLookAndFeelException ex) {
java.util.logging.Logger.getLogger(Frame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
}
//</editor-fold>
//</editor-fold>
/* Create and display the form */
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new Frame().setVisible(true);
}
});
}
// Variables declaration - do not modify
private lienzo canvas1;
private javax.swing.JComboBox<String> chooseBackground;
private javax.swing.JComboBox<String> chooseShape;
private javax.swing.JLabel jLabel1;
private javax.swing.JLabel jLabel2;
private javax.swing.JLabel jLabel3;
// End of variables declaration
}
导入java.awt.Color;
导入java.awt.geom.Point2D;
导入java.lang.reflect.Field;
公共类框架扩展了javax.swing.JFrame{
公共框架(){
初始化组件();
}
@抑制警告(“未选中”)
//
私有组件(){
chooseBackground=newjavax.swing.JComboBox();
chooseShape=newjavax.swing.JComboBox();
jLabel1=newjavax.swing.JLabel();
jLabel2=newjavax.swing.JLabel();
jLabel3=newjavax.swing.JLabel();
canvas1=新的lienzo();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
选择background.setModel(新的javax.swing.DefaultComboxModel(新字符串[]{“白色”、“黑色”、“粉色”}));
选择Background.addActionListener(新java.awt.event.ActionListener(){
public void actionPerformed(java.awt.event.ActionEvent evt){
选择BackgroundActionPerformed(evt);
}
});
选择shape.setModel(新的javax.swing.DefaultComboxModel(新字符串[]{“蓝色”、“黄色”、“橙色”}));
选择shape.addActionListener(新建java.awt.event.ActionListener()){
public void actionPerformed(java.awt.event.ActionEvent evt){
选择已执行的形状(evt);
}
});
jLabel1.setText(“选择颜色:”);
jLabel2.setText(“Fondo:”);
jLabel3.setText(“图:”);
canvas1.addMouseMotionListener(新java.awt.event.MouseMotionAdapter(){
public void mouseMoved(java.awt.event.MouseEvent evt){
拉票(evt);
}
});
canvas1.addMouseListener(新java.awt.event.MouseAdapter(){
public void mouseenterned(java.awt.event.MouseEvent evt){
拉票(evt);
}
public void mouseExited(java.awt.event.MouseEvent evt){
拉票1退出(evt);
}
});
javax.swing.GroupLayout canvas1Layout=新建javax.swing.GroupLayout(canvas1);
画布1.设置布局(画布1布局);
canvas1Layout.setHorizontalGroup(
canvas1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0,0,短.MAX_值)
);
canvas1Layout.setVerticalGroup(
canvas1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0,184,短.MAX_值)
);
javax.swing.GroupLayout=newjavax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(布局);
layout.setHorizontalGroup(
createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGap(31,31,31)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addComponent(jLabel1)
.addContainerGap(javax.swing.GroupLayout.DEFAULT\u SIZE,Short.MAX\u VALUE))
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING,layout.createSequentialGroup()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.training)
.addComponent(canvas1,javax.swing.GroupLayout.DEFAULT\u SIZE,javax.swing.GroupLayout.DEFAULT\u SIZE,Short.MAX\u值)
.addGroup(layout.createSequentialGroup()
.addComponent(jLabel2)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addComponent(选择背景,javax.swing.GroupLayout.PREFERRED\u大小,javax.swing.GroupLayout.DEFAULT\u大小,javax.swing.GroupLayout.PREFERRED\u大小)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED,59,Short.MAX_值)
.addComponent(jLabel3)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addComponent(选择形状,javax.swing.GroupLayout.PREFERRED\u大小,javax.swing.GroupLayout.DEFAULT\u大小,javax.swing.GroupLayout.PREFERRED\u大小)
.addGap(97,97,97)))
);
layout.setVerticalGroup(
createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGap(13,13,13)
.addComponent(jLabel1)
.addGap(18,18,18)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(选择背景,javax.swing.GroupLayout.PREFERRED\u大小,javax.swing.GroupLayout.DEFAULT\u大小,javax.swing.GroupLayout.PREFERRED\u大小)
.addComponent(选择形状、javax.swing.GroupLayout.PREFERRED\u大小、javax.swing.GroupLayout.DEFAULT\u大小、javax.swing.GroupLayout.PREFERRED\u大小)
.addComponent(jLabel2)
.addComponent(jLabel3))
.addGap(18,18,18)
.addComponent(canvas1,javax.swing.GroupLayout.PREFERRED\u SIZE,javax.swing.GroupLayout.DEFAULT\u SIZE,ja
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JPanel;
import javax.swing.Timer;
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
/**
*
* @author YonePC
*/
public class lienzo extends JPanel {
public boolean userHasMouseEntered;
private int countSavedPos = 0;
private int[] posX = new int[5];
private int[] posY = new int[5];
private int x;
private int y;
public void setX(int x) {
this.x = x;
}
public void setY(int y) {
this.y = y;
}
public lienzo() {
Timer timer = new Timer(100, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
repaint();
}
});
timer.start();
this.setBackground(Color.white);
this.setForeground(Color.blue);
}
@Override
public void paintComponent(Graphics g){
super.paintComponent(g);
if(userHasMouseEntered)
g.fillOval(x, y, 30, 30);
posX[countSavedPos] = x;
posY[countSavedPos] = y;
countSavedPos++;
if(countSavedPos>4) countSavedPos=0;
for (int i = 0; i < countSavedPos; i++) {
g.fillOval(posX[countSavedPos], posY[countSavedPos], 30, 30);
}
//repaint();
}
}
private final ArrayList<Position> trail = new ArrayList<>();
public void addNewPosition(Position position){
trail.add(0, position);
}
public void removeLastPosition(){
if (trail.size()> 5) trail.remove(5);
}
private void canvas1MouseMoved(java.awt.event.MouseEvent evt) {
// TODO add your handling code here:
canvas1.addNewPosition(new Position(evt.getX(),evt.getY()));
canvas1.removeLastPosition();
repaint();
/*
canvas1.setX(evt.getX());
canvas1.setY(evt.getY());*/
}
@Override
public void paintComponent(Graphics g){
super.paintComponent(g);
if(userHasMouseEntered){
for (int i = 0; i < trail.size(); i++) {
g.fillOval(trail.get(i).getX(), trail.get(i).getY(), 30, 30);
try {
Thread.sleep(25);
} catch (InterruptedException ex) {
Logger.getLogger(lienzo.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
repaint();
}