Java fillRect()使用哪个坐标?

Java fillRect()使用哪个坐标?,java,swing,layout,awt,coordinates,Java,Swing,Layout,Awt,Coordinates,这是我使用AWT/Swing的第一个项目。我正试图设计一个简单的细胞自动机。我在选择布局管理器时遇到了一些问题,现在我使用GridLayout,因为它最接近我想要的。但是,当a尝试在JPanel中放置一个单元格时,坐标并不像我预期的那样工作。也许我不应该从JComponent扩展并使用fillRect()?或者GridLayout不是我需要的布局?主要问题是点(0,0)似乎在“移动”fillRect是否与GridLayout冲突? 注1:我尝试过GridBagLayout,但没有成功(因为我不知

这是我使用AWT/Swing的第一个项目。我正试图设计一个简单的细胞自动机。我在选择布局管理器时遇到了一些问题,现在我使用GridLayout,因为它最接近我想要的。但是,当a尝试在JPanel中放置一个单元格时,坐标并不像我预期的那样工作。也许我不应该从JComponent扩展并使用fillRect()?或者GridLayout不是我需要的布局?主要问题是点(0,0)似乎在“移动”fillRect是否与GridLayout冲突?

注1:我尝试过GridBagLayout,但没有成功(因为我不知道如何配置它)。我也尝试过add(component,x,y)方法,但它不起作用

注2:我没有发布有关单元格状态的代码,因为它不相关

编辑:好的,我在一个公共课上写了一个例子,我不认为我能更简洁,重现同样的结果

解决方案:

这是我的代码:

public class Example{
    class Cell extends JComponent{
        private int x = 0;    //Cell position ?
        private int y = 0;
        public Cell(int x, int y){
            this.x = x;
            this.y = y;
        }
        @Override
        public void paintComponent(Graphics g){
            super.paintComponent(g);
            //draw cell
            g.setColor(Color.white);
            g.fillRect(x,y,15,15);        
        }
    }
    Example(){
        JFrame frame = new JFrame("title");
        frame.setBackground(Color.black);
        frame.getContentPane().setPreferredSize(new Dimension(300,300));
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setResizable(false);
        JPanel box = new JPanel(new GridLayout(20,20)){
            @Override
            public void paintComponent(Graphics g){
                super.paintComponent(g);
                setBackground(Color.black);
                //draw grid
                for(int i = 0; i <= this.getHeight(); i += 15){
                    g.drawLine(0,0+i,getWidth(),0+i);
                }
                for(int i = 0; i <= this.getWidth(); i += 15){
                    g.drawLine(0+i,0,0+i,getHeight());
                }
            }
        };
        /*box.add(new Cell(0,0)); //TEST 1
        box.add(new Cell(0,0));
        box.add(new Cell(0,0));
        box.add(new Cell(0,0));*/
        box.add(new Cell(0,0));   //TEST 2
        box.add(new Cell(15,0));
        box.add(new Cell(30,0));
        box.add(new Cell(45,0));
        frame.add(box);
        frame.pack();
        frame.setVisible(true);
    }
    public static void main(String[] args){
        new Example();
    }
}
公共类示例{
类单元扩展了JComponent{
私有int x=0;//单元格位置?
私有整数y=0;
公共单元格(整数x,整数y){
这个.x=x;
这个。y=y;
}
@凌驾
公共组件(图形g){
超级组件(g);
//绘图单元
g、 setColor(Color.white);
g、 fillRect(x,y,15,15);
}
}
示例(){
JFrame=新JFrame(“标题”);
框架.立根背景(颜色.黑色);
frame.getContentPane().setPreferredSize(新维度(300300));
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setresizeable(false);
JPanel框=新JPanel(新网格布局(20,20)){
@凌驾
公共组件(图形g){
超级组件(g);
挫折背景(颜色:黑色);
//绘制网格

对于(int i=0;i所有绘制都是相对于包含自定义绘制的构件而不是添加该构件的面板完成的

因此,在你的情况下,只需从(0,0)开始绘制

布局管理器将单元定位在布局管理器确定的位置

注:

绘画方法仅用于绘画。它不应像当前的Box类那样创建组件

基本逻辑是:

  • 创建具有所需布局的面板
  • 将组件添加到面板中
  • 添加到面板的组件的大小/位置将由布局管理器确定。因此,在单元类中,您需要实现
    getPreferredSize()
    方法,以便布局管理器可以使用此信息定位添加到面板的每个组件

  • 如果要在面板上的不同位置管理绘制,则不要使用真实的组件。而是保留要绘制的形状的ArrayList。每个形状将包含其应绘制的位置。然后在paintComponent()中遍历ArrayList方法绘制每个形状。有关此方法的示例,请查看中的
    绘制组件
    示例。

    “我没有发布有关单元格状态的代码,因为它不相关。”打得好。也没有3门公开课。将其中一门作为问题的答案。如果你在做定制绘画,你应该阅读包含大量重要信息的文档。你在文章标题中的问题可能在中得到了回答,但你应该阅读整个页面。我也同意安德鲁的评论,如果你需要具体帮助使用代码,您需要发布MCVE。