Это мой первый проект с AWT / Swing. Я пытаюсь создать простой клеточный автомат. У меня были некоторые проблемы с выбором менеджера компоновки, теперь я использую GridLayout, потому что я ближе всего к тому, что хочу. Однако при попытке поместить ячейку в JPanel координаты работают не так, как я ожидал. Может быть, я не должен расширяться от JComponent и использовать fillRect ()? Или, может быть, GridLayout - это не тот макет, который мне нужен? Основная проблема в том, что точка (0,0) кажется «движущейся». конфликтует ли fillRect с GridLayout?
Примечание 1: я пробовал GridBagLayout, но не работал (потому что я не знаю, как его настроить). Я также попробовал метод add (component, x, y), но он не работал.
Примечание 2. Я не опубликовал код, касающийся состояния ячейки, поскольку он не был релевантным.
Редактировать: Хорошо, я написал пример в одном общедоступном классе, я не думаю, что смогу быть более кратким и воспроизвести те же результаты.
Решение: 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:
ТЕСТ 1
ТЕСТ 2