Java 使用paint(g)和run()打印点
我想做的是,一旦我按下“GO”按钮,它将用不同的坐标绘制3个椭圆形。我试过重新粉刷,但似乎不起作用。它只显示一个椭圆形,这是最后一个椭圆形。我希望它堆叠起来并附加椭圆 这是我的密码:Java 使用paint(g)和run()打印点,java,user-interface,paint,runnable,Java,User Interface,Paint,Runnable,我想做的是,一旦我按下“GO”按钮,它将用不同的坐标绘制3个椭圆形。我试过重新粉刷,但似乎不起作用。它只显示一个椭圆形,这是最后一个椭圆形。我希望它堆叠起来并附加椭圆 这是我的密码: import javax.swing.*; import java.awt.Graphics; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; public class T
import javax.swing.*;
import java.awt.Graphics;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class Test extends JFrame implements ActionListener{
JButton button;
int[] itoken;
int x,y;
public Test() {
super("Test");
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setSize(600,500);
this.setVisible(true);
this.setResizable(true);
this.setLayout(null);
button= new JButton("GO");
button.setBounds(500, 100, 50,50);
this.add(button);
button.addActionListener(this);
}
public void actionPerformed(ActionEvent e){
if(e.getSource()==button){
String text= "200 300 250 150 400 100";
String[] token= text.split("\\W");
itoken= new int[token.length];
int i=0;
for (String str : token){
itoken[i++] = Integer.parseInt(str);
}
for(i=0; i<itoken.length; i++)
System.out.println(itoken[i]);
run();
}
}
public void paint(Graphics g) {
super.paint(g);
g.drawOval(x - 5, y - 5, 10, 10);
}
public void run(){
int i=0;
while(i<itoken.length-1){
repaint();
x=itoken[i];
y=itoken[i+1];
i++;
}
}
public static void main(String[] args) {
Test test = new Test();
}
}
import javax.swing.*;
导入java.awt.Graphics;
导入java.awt.*;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
公共类测试扩展JFrame实现ActionListener{
按钮;
int[]伊藤肯;
int x,y;
公开考试(){
超级(“测试”);
此.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
这个。设置大小(600500);
此.setVisible(true);
此参数为.setresizeable(true);
此.setLayout(null);
按钮=新的JButton(“GO”);
按钮.立根(500,100,50,50);
这个。添加(按钮);
addActionListener(这个);
}
已执行的公共无效操作(操作事件e){
如果(例如getSource()==按钮){
String text=“200 300 250 150 400 100”;
字符串[]标记=text.split(\\W”);
itoken=newint[token.length];
int i=0;
for(字符串str:token){
itoken[i++]=Integer.parseInt(str);
}
对于(i=0;i
注意-在您删除上一个问题之前,我正在准备这个答案,因此,从您在这个问题中发布的新代码来看,这个答案可能会有点偏差,但它会让您朝着相同的目标前进
不要初始化actionPerformed
中的所有内容。你会得到一个NullPointerException
,因为paint
在数组初始化之前由帧隐式调用。我所做的是创建一个初始化它的方法
int[] iToken = initArray();
...
private int[] initArray() {
String text = "200 300 250 150 400 100";
String[] token = text.split("\\W");
int[] itoken = new int[token.length];
int i = 0;
for (String str : token) {
itoken[i++] = Integer.parseInt(str);
}
return itoken;
}
不要在顶级容器上绘制,比如JFrame
。而是使用JPanel
或JCompoent
覆盖paintComponent
,并覆盖JPanel
中的getPreferredSize()
,这样您就不必设置JFrame
的大小。只需pack()
就可以了
从中运行Swing应用程序,如下所示
public static void main(String[] args) {
SwingUtilitiies.invokeLater(new Runnable(){
public void run(){
new Test();
}
});
}
您从不将按钮添加到框架中
不要使用空布局。请使用
添加组件,然后调用setVisible
下面是正在运行的重构代码
import javax.swing.*;
import java.awt.Graphics;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class Test extends JFrame implements ActionListener {
JButton button;
boolean paint = false;
int x, y;
int[] iToken = initArray();
public Test() {
super("Test");
button = new JButton("GO");
button.setBounds(500, 100, 50, 50);
button.addActionListener(this);
add(button, BorderLayout.SOUTH);
add(new DrawPanel());
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.pack();
this.setVisible(true);
this.setResizable(true);
}
public void actionPerformed(ActionEvent e) {
if (e.getSource() == button) {
paint = true;
repaint();
}
}
private int[] initArray() {
String text = "200 300 250 150 400 100";
String[] token = text.split("\\W");
int[] itoken = new int[token.length];
int i = 0;
for (String str : token) {
itoken[i++] = Integer.parseInt(str);
}
return itoken;
}
public class DrawPanel extends JPanel {
public void paintComponent(Graphics g) {
super.paintComponent(g);
if (paint) {
for (int i = 0; i < iToken.length; i += 2) {
x = iToken[i];
y = iToken[i + 1];
g.drawOval(x - 5, y - 5, 10, 10);
}
}
}
public Dimension getPreferredSize() {
return new Dimension(500, 500);
}
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new Test();
}
});
}
}
import javax.swing.*;
导入java.awt.Graphics;
导入java.awt.*;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
公共类测试扩展JFrame实现ActionListener{
按钮;
布尔绘制=假;
int x,y;
int[]iToken=initArray();
公开考试(){
超级(“测试”);
按钮=新的JButton(“GO”);
按钮.立根(500,100,50,50);
addActionListener(这个);
添加(按钮,BorderLayout.SOUTH);
添加(新的DrawPanel());
此.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
这个包();
此.setVisible(true);
此参数为.setresizeable(true);
}
已执行的公共无效操作(操作事件e){
如果(例如getSource()==按钮){
油漆=真;
重新油漆();
}
}
私有int[]initArray(){
String text=“200 300 250 150 400 100”;
字符串[]标记=text.split(\\W”);
int[]itoken=新的int[token.length];
int i=0;
for(字符串str:token){
itoken[i++]=Integer.parseInt(str);
}
返回伊藤肯;
}
公共类DrawPanel扩展了JPanel{
公共组件(图形g){
超级组件(g);
如果(油漆){
对于(int i=0;i
这里是这个?y=itoken[i+1];
?试试while(i
@tobias_k Nice bro.谢谢。现在我需要知道如何叠加卵形。有6个坐标,所以它应该有3个卵形。伙计,你真是太棒了。从你的代码中学到了很多。爱你不是同性恋。srs.btw,paint()用于框架,而paintComponent()用于面板。我说得对吗?是的,你说得对。虽然JPanel
有一个paint
方法,但你应该调用paintComponent
。哦,我在代码中有一个输入错误。y=iToken[i+1];
是你需要的,而不是y=iToken[2];