Какие координаты использует fillRect ()? - PullRequest
0 голосов
/ 03 июля 2018

Это мой первый проект с 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

1 Ответ

0 голосов
/ 03 июля 2018

Все рисование выполняется относительно компонента, который содержит настраиваемый рисунок, а не панели, к которой вы добавляете компонент.

Так что в вашем случае просто сделайте рисование из (0, 0).

Менеджер по расположению разместит ячейку в месте, определенном менеджером по расположению.

Примечание:

Метод рисования только для рисования. Он НИКОГДА не должен создавать компонент, как делает ваш текущий класс Box.

Основная логика заключается в следующем:

  1. создайте панель с нужным макетом.
  2. добавить компоненты на панель.
  3. размер / расположение компонентов, добавляемых на панель, будет определяться менеджером макета. Поэтому в вашем классе Cell вам необходимо реализовать метод getPreferredSize(), чтобы менеджер по расположению мог использовать эту информацию для позиционирования каждого компонента, добавляемого на панель.

Если вы хотите управлять рисованием в разных местах на панели, не используйте реальные компоненты. Вместо этого вы сохраняете ArrayList форм, которые вы хотите нарисовать. Каждая фигура будет содержать место, где она должна быть нарисована. Затем вы перебираете ArrayList в методе paintComponent () для рисования каждой фигуры. Примером такого подхода является пример Draw On Component, который можно найти в Пользовательские подходы к рисованию .

...