gpt4 book ai didi

java - fillRect() 使用哪个坐标?

转载 作者:行者123 更新时间:2023-12-02 11:03:27 24 4
gpt4 key购买 nike

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

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

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

编辑:好的,我在一个公共(public)类中编写了一个示例,我认为我无法更简洁并重现相同的结果。

解决方案: https://docs.oracle.com/javase/tutorial/uiswing/painting/refining.html

这是我的代码:

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();
}
}

这是测试 1 和测试 2 对应的结果:

TEST 1

TEST 2

最佳答案

所有绘画都是相对于包含自定义绘画的组件完成的,而不是相对于您添加组件的面板。

所以在你的例子中,只需从 (0, 0) 开始绘画即可。

布局管理器会将 Cell 放置在布局管理器确定的位置。

注意:

绘画方法仅用于绘画。它永远不应该创建一个组件,就像您当前的 Box 类所做的那样。

基本逻辑是:

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

如果你想管理面板上不同位置的绘画,那么不要使用真正的组件。相反,您保留要绘制的形状的 ArrayList。每个形状都包含应绘制的位置。然后,您在paintComponent() 方法中迭代ArrayList 来绘制每个形状。有关此方法的示例,请查看 Custom Painting Approaches 中的 Draw On Component 示例。 .

关于java - fillRect() 使用哪个坐标?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51158443/

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