- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试编写一个程序,允许用户通过单击窗口中的 JButton,然后单击窗口中的某个位置(而不是按钮上)来创建正方形或圆形。
我目前正在为不同的按钮使用两个actionListener,这些按钮将方形或圆形添加到形状类型的数组列表(方形和圆形都实现的接口(interface))。我有一个名为frameListener的类,它实现了MouseListener和MouseMotionListener,当鼠标移动时更新正方形或圆形的位置,如果鼠标离开窗口则删除正方形或圆形,或者当单击鼠标时停止更新它(使得它是永久的)。
我还有一个名为 MyPanel 的类,它扩展了 JPanel,并使用 PaintComponent(Graphics g) 方法在背景上绘制正方形和圆形。
package smys01;
import java.util.ArrayList;
import java.text.*;
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
public class SMYS01 extends JFrame {
private Color c = new Color(0, 0, 0);
private static ArrayList<Shape> shapes = new ArrayList();
private static ArrayList<Shape> deleted = new ArrayList();
private Point a;
private boolean makeSquare = false, makeCircle = false, makeSquiggle = false;
public static void main(String[] args) {
SMYS01 window = new SMYS01();
}
//good main
//0 is empty for making things, 1 is having a square selected to change, 2 is background;
private JButton makeSquareB = new JButton("New Square" /*, add icon later*/);
private JButton makeCircleB = new JButton("New Circle");
private Color background = new Color(0, 150, 0);
public SMYS01() {
makeSquareB.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("making square");
if(!makeCircle&&!makeSquare){
makeSquare = true;
shapes.ensureCapacity(shapes.size());
shapes.add(new Square((int) a.getX(), (int) a.getY(), c));
}else if(makeSquare){
}else if(makeCircle){
makeCircle=false;
makeSquare=true;
shapes.remove(shapes.size()-1);
shapes.ensureCapacity(shapes.size());
shapes.add(new Square((int) a.getX(), (int) a.getY(), c));
}
}
});
makeCircleB.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("making circle");
if(!makeCircle&&!makeSquare){
makeCircle = true;
shapes.ensureCapacity(shapes.size());
shapes.add(new Circle((int) a.getX(), (int) a.getY(), c));
}else if(makeCircle){
}else if(makeSquare){
makeSquare=false;
shapes.remove(shapes.size()-1);
shapes.ensureCapacity(shapes.size());
shapes.add(new Circle((int) a.getX(), (int) a.getY(), c));
}
}
});
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane();
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
MyPanel thing = new MyPanel();
frame.addMouseListener(new FrameListener());
frame.setContentPane(thing);
frame.setSize(thing.getPreferredSize());
frame.setTitle("Art!");
frame.addMouseMotionListener(new FrameListener());
}
private class MyPanel extends JPanel {
public MyPanel() {
GroupLayout layout = new GroupLayout(this);
layout.setHorizontalGroup(
layout.createSequentialGroup()
.addComponent(makeCircleB)
.addComponent(makeSquareB)
);
layout.setVerticalGroup(
layout.createSequentialGroup()
.addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE)
.addComponent(makeCircleB)
.addComponent(makeSquareB)
)
);
}
@Override
public Dimension getPreferredSize() {
return new Dimension(500, 500);
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(background);
g.drawRect((int)g.getClipBounds().getX(),(int)g.getClipBounds().getY(),(int)g.getClipBounds().getWidth(),(int)g.getClipBounds().getHeight());
g.fillRect((int)g.getClipBounds().getX(),(int)g.getClipBounds().getY(),(int)g.getClipBounds().getWidth(),(int)g.getClipBounds().getHeight());
System.out.println(shapes.size());
for (Shape i : shapes) {
int[] a = i.getDim();
g.setColor(new Color(a[4], a[5], a[6], a[7]));
if(i instanceof Square){
g.drawRect(a[0], a[1], a[2], a[3]);
g.fillRect(a[0], a[1], a[2], a[3]);
}else if(i instanceof Circle){
g.drawOval(a[0], a[1], a[2], a[3]);
g.fillOval(a[0], a[1], a[2], a[3]);
}
}
}
}
class FrameListener implements MouseListener, MouseMotionListener {
public void mousePressed(MouseEvent e) {
System.out.println("pressed");
a = new Point(e.getPoint());
if (makeSquare) {
makeSquare = false;
System.out.println("square made!");
}
if (makeCircle) {
makeCircle = false;
System.out.println("cirlce made!");
}
//use this for sliders, nothing else.
}
public void mouseReleased(MouseEvent e) {
System.out.println("released");
a = new Point(e.getPoint());
//use for sliders, nothing else.
}
public void mouseClicked(MouseEvent e) {
System.out.println("clicked");
a = new Point(e.getPoint());
//don't need this
//makeSquare = false;
//makeCircle = false;
//makeSquiggle too.
}
public void mouseMoved(MouseEvent e) {
//showing up as false atm
a = new Point(e.getPoint());
System.out.println(a);
if (makeSquare||makeCircle) {
Shape b = shapes.get(shapes.size()-1);
b.updateLocation((int) a.getX(), (int) a.getY());
}
}
public void mouseDragged(MouseEvent e) {
//only check if over a JSlider
}
//complete methods:
public void mouseEntered(MouseEvent e) {
System.out.println("entered");
//nothing, Mouse re-entering doesn't effect the program.
}
public void mouseExited(MouseEvent e) {
System.out.println("exited");
makeSquare = false;
makeCircle = false;
makeSquiggle = false;
//if mouse leaves the window while trying to make one of these, stop it.
}
}
}
Shape 接口(interface)的代码:
package smys01;
public interface Shape {
public void updateLocation(int newXPos, int newYPos);
public void updateDimensions(int newXDim, int newYDim);
public void delete();
public void purge();
public void restore();
public int[] getDim();
}
广场代码:笔记!这段代码写得有点晚,有些部分根本不相关,甚至不完整(但完全未使用)。这是针对构造函数、updateDimensions() 方法和 updateLocation() 方法
package smys01;
import java.awt.Color;
public class Square implements Shape{
//tbr=to be returned.
boolean deleted=false;
boolean purged=false;
private int xPos, yPos, xDim, yDim;
private int saveXPos, saveYPos, saveXDim, saveYDim, saveR, saveG, saveB, saveA;
private Color fill;
public Square(int initX, int initY, Color a){
xPos=initX;
yPos=initY;
xDim=50;
yDim=50;
fill=a;
}
public void updateDimensions(int newXDim, int newYDim){
if(purged||deleted)
return;
if(newXDim<=2){
xDim=2;
}else{
xDim=newXDim;
}
if(newYDim<=2){
yDim=2;
}else{
yDim=newYDim;
}
}
public void updateLocation(int newXPos, int newYPos){
if(purged){
return;
}
if(newXPos<=5){
xPos=5;
}else{
xPos=newXPos;
}
if(newYPos<=25){
yPos=25;
}else{
yPos=newYPos;
}
}
public void delete(){
if(!deleted){
saveXPos=xPos;
saveYPos=yPos;
saveXDim=xDim;
saveYDim=yDim;
saveR=fill.getRed();
saveB=fill.getBlue();
saveG=fill.getGreen();
saveA=fill.getAlpha();
deleted=true;
xPos=-5;
yPos=-5;
xDim=1;
yDim=1;
}
}
public void purge(){
saveXPos=-10;
saveYPos=-10;
saveXDim=3;
saveYDim=3;
//use in an if statement, and if true (will be, set the square value to null, so this reference will go away, preventing data overflow
}
public void restore(){
xPos=saveXPos;
yPos=saveYPos;
xDim=saveXDim;
yDim=saveYDim;
deleted=false;
}
public int[] getDim(){
int[] tbr={xPos,yPos, xDim, yDim,fill.getRed(), fill.getBlue(), fill.getGreen(), fill.getAlpha()};
return tbr;
}
public String toString(){
String tbr="Square: ("+xPos+", "+yPos+"); ("+xDim+", "+yDim+"); ("+fill.toString();
return tbr;
}
}
Circle 类的代码完全相同,但对象类型允许 PaintComponent 方法区分它们。
我试图在调用 mouseMoved 时让它调用paintComponent,但是我似乎无法让它执行此操作。我尝试过使用 repaint(),并且我花了几个小时试图解决这个问题。
到目前为止,我已经看到,基本上,Swing 会在需要时调用 PaintComponent(当窗口大小更改时,或者窗口最小化并重新打开时)。
但是,我不确定如何在按下按钮或移动鼠标时调用它,并且 repaint() 对此不起作用。
如果有些代码马虎,我深表歉意,我重写了几次,有些部分是不必要的,但仍然存在。
有没有办法从匿名操作类或 FrameListener 类中主动调用 PaintComponent 方法?
最佳答案
经过 @MadProgrammer 的一些输入,我发现了什么不起作用。 mouseListener 附加到 JFrame 而不是 JPanel,因此事件被触发,但 PaintComponent(通过 repaint())没有被触发。我将其添加到面板中,并将 repaint() 添加到 mouseMoved() 方法的末尾,并且它运行良好。
关于java - PaintComponent() 方法未通过 mouseMoved() 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42181974/
为了让我的代码几乎完全用 Jquery 编写,我想用 Jquery 重写 AJAX 调用。 这是从网页到 Tomcat servlet 的调用。 我目前情况的类似代码: var http = new
我想使用 JNI 从 Java 调用 C 函数。在 C 函数中,我想创建一个 JVM 并调用一些 Java 对象。当我尝试创建 JVM 时,JNI_CreateJavaVM 返回 -1。 所以,我想知
环顾四周,我发现从 HTML 调用 Javascript 函数的最佳方法是将函数本身放在 HTML 中,而不是外部 Javascript 文件。所以我一直在网上四处寻找,找到了一些简短的教程,我可以根
我有这个组件: import {Component} from 'angular2/core'; import {UserServices} from '../services/UserService
我正在尝试用 C 实现一个简单的 OpenSSL 客户端/服务器模型,并且对 BIO_* 调用的使用感到好奇,与原始 SSL_* 调用相比,它允许一些不错的功能。 我对此比较陌生,所以我可能会完全错误
我正在处理有关异步调用的难题: 一个 JQuery 函数在用户点击时执行,然后调用一个 php 文件来检查用户输入是否与数据库中已有的信息重叠。如果是这样,则应提示用户确认是否要继续或取消,如果他单击
我有以下类(class)。 public Task { public static Task getInstance(String taskName) { return new
嘿,我正在构建一个小游戏,我正在通过制作一个数字 vector 来创建关卡,该数字 vector 通过枚举与 1-4 种颜色相关联。问题是循环(在 Simon::loadChallenge 中)我将颜
我有一个java spring boot api(数据接收器),客户端调用它来保存一些数据。一旦我完成了数据的持久化,我想进行另一个 api 调用(应该处理持久化的数据 - 数据聚合器),它应该自行异
首先,这涉及桌面应用程序而不是 ASP .Net 应用程序。 我已经为我的项目添加了一个 Web 引用,并构建了各种数据对象,例如 PayerInfo、Address 和 CreditCard。但问题
我如何告诉 FAKE 编译 .fs文件使用 fsc ? 解释如何传递参数的奖励积分,如 -a和 -target:dll . 编辑:我应该澄清一下,我正在尝试在没有 MSBuild/xbuild/.sl
我使用下划线模板配置了一个简单的主干模型和 View 。两个单独的 API 使用完全相同的配置。 API 1 按预期工作。 要重现该问题,请注释掉 API 1 的 URL,并取消注释 API 2 的
我不确定什么是更好的做法或更现实的做法。我希望从头开始创建目录系统,但不确定最佳方法是什么。 我想我在需要显示信息时使用对象,例如 info.php?id=100。有这样的代码用于显示 Game.cl
from datetime import timedelta class A: def __abs__(self): return -self class B1(A):
我在操作此生命游戏示例代码中的数组时遇到问题。 情况: “生命游戏”是约翰·康威发明的一种细胞自动化技术。它由一个细胞网格组成,这些细胞可以根据数学规则生存/死亡/繁殖。该网格中的活细胞和死细胞通过
如果我像这样调用 read() 来读取文件: unsigned char buf[512]; memset(buf, 0, sizeof(unsigned char) * 512); int fd;
我用 C 编写了一个简单的服务器,并希望调用它的功能与调用其他 C 守护程序的功能相同(例如使用 ./ftpd start 调用它并使用 ./ftpd stop 关闭该实例)。显然我遇到的问题是我不知
在 dos 中,当我粘贴此命令时它会起作用: "C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" https://google.
在 dos 中,当我粘贴此命令时它会起作用: "C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" https://google.
我希望能够从 cmd 在我的 Windows 10 计算机上调用 python3。 我已重新安装 Python3.7 以确保选择“添加到路径”选项,但仍无法调用 python3 并使 CMD 启动 P
我是一名优秀的程序员,十分优秀!