Java:如何使用变量编辑JFrame?

Java:如何使用变量编辑JFrame?,java,list,arraylist,jframe,Java,List,Arraylist,Jframe,我对Java编程相当陌生,我不明白为什么这段代码总是生成一个空白的JFrame: mainClass.java: import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import javax.swing.JFrame; public class mainClass { public static void main(String[] args) { drawing d = new d

我对Java编程相当陌生,我不明白为什么这段代码总是生成一个空白的JFrame:

mainClass.java:

import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JFrame;

public class mainClass {
    public static void main(String[] args) {
        drawing d = new drawing();

        d.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        d.setSize(1000, 1000);
        d.setTitle("Test Game");
        d.setVisible(true);
        d.repaint();
        d.addMouseListener(new MouseAdapter() {
            public void mousePressed(MouseEvent e) {
                d.repaint();
            }
        });
    }
}
import java.awt.event.*;
import javax.swing.*;

public class mainClass {
    private static int x, y;
    private static drawing d = new drawing();
    public static void main(String[] args) {
        JFrame frame = new JFrame("Mouse");
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(1000, 1000);
        frame.setResizable(false);
        frame.add(d);
        d.addMouseListener(new AL());
    }
    static class AL extends MouseAdapter{
        public void mousePressed(MouseEvent e) {
            x = e.getX();
            y = e.getY();
            d.draw(x,y);
        }
    }
}
drawing.java:

import java.awt.*;
import javax.swing.*;
import java.util.ArrayList;
import java.util.List;
import java.awt.event.*;

public class drawing extends JFrame implements MouseListener{
    public List<units> p1 = new ArrayList<units>();
    public List<units> p2 = new ArrayList<units>();
    JFrame frame = new JFrame();
    public void paint(Graphics g) {
        for(units u : p1) {
            g.setColor(new Color(0,0,255));
            g.drawRect(u.unitX-1, u.unitY-1, u.unitX+1, u.unitY+1);
        }
    }
    public void mousePressed(MouseEvent e) {
        int x = e.getX();
        int y = e.getY();
        p1.add(new units(x,y));

        boolean tryPrint = true;

        if(p1.size()==10 && tryPrint) {
            for(units u : p1) {
                System.out.println(u.unitX + "," + u.unitY);
            }

            tryPrint = false;
        }

        frame.repaint();
    }

    public void mouseClicked(MouseEvent e) {}
    public void mouseEntered(MouseEvent e) {}
    public void mouseExited(MouseEvent e) {}
    public void mouseReleased(MouseEvent e) {}
}
import java.awt.*;
import javax.swing.*;
import java.util.ArrayList;
import java.util.List;

public class drawing extends JPanel {
    public void draw(int x, int y) {
        p1.add(new ArrayList<Integer>());
        p1.get(p1.size()-1).add(x);
        p1.get(p1.size()-1).add(y);
        repaint();
    }
    public List<List<Integer>> p1 = new ArrayList<List<Integer>>(); 
    public List<List<Integer>> p2 = new ArrayList<List<Integer>>();
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        for(List<Integer> u : p1) {
            g.setColor(new Color(0,0,255));
            g.fillRect(u.get(0)-1, u.get(1)-1, 3, 3);
        }
    }
}
对不起,代码太冗长了。我相信问题在于我对变量或类的处理。感谢您的帮助


此外,此代码经过编辑,因此可能是某些注释没有意义的原因。

首先,我建议您使用更内聚的类。除此之外,我想说的是,您需要重写JFrame的paint方法,而不是为它创建一个新类,请参见以下示例:

我希望你能完成你的申请

问候,


-Rod

问题似乎在于我将绘图类包含到JFrame中,以及该JFrame的位置。我最终解决的代码如下:

mainClass.java:

import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JFrame;

public class mainClass {
    public static void main(String[] args) {
        drawing d = new drawing();

        d.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        d.setSize(1000, 1000);
        d.setTitle("Test Game");
        d.setVisible(true);
        d.repaint();
        d.addMouseListener(new MouseAdapter() {
            public void mousePressed(MouseEvent e) {
                d.repaint();
            }
        });
    }
}
import java.awt.event.*;
import javax.swing.*;

public class mainClass {
    private static int x, y;
    private static drawing d = new drawing();
    public static void main(String[] args) {
        JFrame frame = new JFrame("Mouse");
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(1000, 1000);
        frame.setResizable(false);
        frame.add(d);
        d.addMouseListener(new AL());
    }
    static class AL extends MouseAdapter{
        public void mousePressed(MouseEvent e) {
            x = e.getX();
            y = e.getY();
            d.draw(x,y);
        }
    }
}
drawing.java:

import java.awt.*;
import javax.swing.*;
import java.util.ArrayList;
import java.util.List;
import java.awt.event.*;

public class drawing extends JFrame implements MouseListener{
    public List<units> p1 = new ArrayList<units>();
    public List<units> p2 = new ArrayList<units>();
    JFrame frame = new JFrame();
    public void paint(Graphics g) {
        for(units u : p1) {
            g.setColor(new Color(0,0,255));
            g.drawRect(u.unitX-1, u.unitY-1, u.unitX+1, u.unitY+1);
        }
    }
    public void mousePressed(MouseEvent e) {
        int x = e.getX();
        int y = e.getY();
        p1.add(new units(x,y));

        boolean tryPrint = true;

        if(p1.size()==10 && tryPrint) {
            for(units u : p1) {
                System.out.println(u.unitX + "," + u.unitY);
            }

            tryPrint = false;
        }

        frame.repaint();
    }

    public void mouseClicked(MouseEvent e) {}
    public void mouseEntered(MouseEvent e) {}
    public void mouseExited(MouseEvent e) {}
    public void mouseReleased(MouseEvent e) {}
}
import java.awt.*;
import javax.swing.*;
import java.util.ArrayList;
import java.util.List;

public class drawing extends JPanel {
    public void draw(int x, int y) {
        p1.add(new ArrayList<Integer>());
        p1.get(p1.size()-1).add(x);
        p1.get(p1.size()-1).add(y);
        repaint();
    }
    public List<List<Integer>> p1 = new ArrayList<List<Integer>>(); 
    public List<List<Integer>> p2 = new ArrayList<List<Integer>>();
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        for(List<Integer> u : p1) {
            g.setColor(new Color(0,0,255));
            g.fillRect(u.get(0)-1, u.get(1)-1, 3, 3);
        }
    }
}
import java.awt.*;
导入javax.swing.*;
导入java.util.ArrayList;
导入java.util.List;
公共类绘图扩展了JPanel{
公共无效提款(整数x,整数y){
p1.添加(新的ArrayList());
p1.get(p1.size()-1)、add(x);
p1.get(p1.size()-1)、add(y);
重新油漆();
}
公共列表p1=新的ArrayList();
public List p2=新的ArrayList();
公共组件(图形g){
超级组件(g);
对于(列表u:p1){
g、 setColor(新颜色(0,0255));
g、 fillRect(u.get(0)-1,u.get(1)-1,3,3);
}
}
}

mainClass
drawing
之间有一个断开的连接,因为每个都在创建一个新的实例,所以它们没有共享相同的信息。我认为您的设计是错误的。与管理
MouseListener
和点不同,
drawing
应该是,你不能仅仅创建一个新的mainClass实例(
mainClass m=new mainClass();
),并期望它在启动过程中与先前创建的实例交互。此外,
p1
p2
列表应该只属于新的JComponent类。我现在遇到了一个框架为空的问题,这可能是因为我将MouseEvent和点切换到了绘图类。你知道为什么会发生这种情况吗?请@Bug将你的新代码放在这里,然后我们可以评估正在发生的事情。另外,如果你能用代码展示解决方案,那就太好了,谢谢