Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用paint(g)和run()打印点_Java_User Interface_Paint_Runnable - Fatal编程技术网

Java 使用paint(g)和run()打印点

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

我想做的是,一旦我按下“GO”按钮,它将用不同的坐标绘制3个椭圆形。我试过重新粉刷,但似乎不起作用。它只显示一个椭圆形,这是最后一个椭圆形。我希望它堆叠起来并附加椭圆

这是我的密码:

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];