gpt4 book ai didi

java - 如何不重绘 JFrame?只是画

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:24:50 24 4
gpt4 key购买 nike

我需要有关简单程序的帮助。我想,当我点击程序标记它。我想看看我过去做过的 Action 。就像铅笔在油漆中。

类测试.java

import java.awt.*;
import java.awt.event.*;
import java.util.Scanner;
import java.io.IOException;
import java.lang.*;
import javax.swing.*;

public class Test{

JFrame frame;

public static void main(String[] args){
Test smallTest = new Test();
smallTest.letsDoIt();
}

public void letsDoIt(){
frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

JButton buttonOfTheEnd = new JButton("EXIT");
buttonOfTheEnd.addActionListener(new theEndListener());

graphPanel panelR = new graphPanel();
panelR.setBackground(Color.WHITE);
frame.getContentPane().add(BorderLayout.CENTER, panelR);
frame.getContentPane().add(BorderLayout.SOUTH, buttonOfTheEnd);
frame.setSize(500,500);
frame.setVisible(true);


frame.addMouseListener(new java.awt.event.MouseAdapter() {
public void mouseClicked(java.awt.event.MouseEvent evt) {

frameMouseClicked(evt);

}
});

}

void frameMouseClicked(java.awt.event.MouseEvent evt) {


System.out.println("("+MouseInfo.getPointerInfo().getLocation().x+", "+MouseInfo.getPointerInfo().getLocation().y+")");
frame.repaint();

}

class theEndListener implements ActionListener {
public void actionPerformed(ActionEvent zdarzenie){
System.exit(0);
}
}


// public void paintComponent(Graphics g){
// super.paintComponent(g);
// int wspX = MouseInfo.getPointerInfo().getLocation().x;
// int wspY = MouseInfo.getPointerInfo().getLocation().y;

// g.setColor(Color.RED);
// g.fillRect( wspX, wspY, 10, 10);

//




}

类图面板

import java.awt.*;
import javax.swing.*;

class graphPanel extends JPanel{


public void paintComponent(Graphics g){
super.paintComponent(g);


int locX = MouseInfo.getPointerInfo().getLocation().x - 10;
int locY = MouseInfo.getPointerInfo().getLocation().y - 30;
g.setColor(Color.ORANGE);
g.fillRect(locX, locY, 10, 10);
}
}

感谢您的帮助。

最佳答案

您必须将最近的位置存储在某处。 List 是一个不错的选择。现在,当您单击屏幕上的某处时,您会将位置添加到列表中,当您需要重新绘制屏幕时,您会绘制所有存储的位置。这类似于分离模型和 View (模型 是您的二维位置列表, View 是您在屏幕上绘制的内容)。

所以在某处创建一个列表:

// public static only to keep it simple!!
public static List<Point> points = new ArrayList<Point>();

然后(感谢 oliholz!)将监听器添加到 panelR 而不是 frame:

panelR.addMouseListener(new MouseAdapter() {
// ...

然后像这样写 frameMouseClicked:

void frameMouseClicked(MouseEvent evt) {
points.add(evt.getPoint());
frame.repaint();
}

paintComponent 中,您遍历列表并绘制所有存储的位置(再次强调:非常简单、精简、可改进!)

g.setColor(Color.ORANGE);
for (Point point:points) { // <- this is the list of stored points
g.fillRect(point.x, point.y, 10, 10);
}

关于java - 如何不重绘 JFrame?只是画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7357684/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com