Java Swing, как рисовать полигоны с координатными параметрами, когда макет не является абсолютным - PullRequest
0 голосов
/ 02 декабря 2018

Я пытаюсь сделать небольшой графический интерфейс, используя свинг.Я хотел бы нарисовать многоугольник на JPanel, который имеет GridBagLayout.Как мне это сделать?Могу ли я указать координаты многоугольника для рисования?Координаты основаны на ячейке, в которой нарисован многоугольник, или на JPanel, или на фрейме?

Изначально для проверки я просто попытался нарисовать линию с координатами в моем классе, а затем добавитьэто к JPanel.Ничего не рисуется.

Переопределенный метод paintComponent, который у меня есть в классе UniverseDisplay:

@Override
public void paintComponent(Graphics g) {
    super.paintComponent(g);
    g.setColor(Color.black);
    g.drawLine(20,  20,  30,  30);
    System.out.println("PAINTED");
}

У меня есть функция, которая устанавливает UniverseDisplay и которая вызывает paintComponent, следующим образом:

public void setUpGenerateButton(){
    generateButton = new JButton("Generate Model");
    generateButton.addActionListener(
            new ActionListener() {
                public void actionPerformed(ActionEvent e) {

                    Universe u = new Universe(reflexive, transitive, symmetric, hereditary);
                    World w = new World(u);
                    u.addWorld(w);
                    Tree t = new Tree();
                    t.setRoot(t);
                    t.setData(expressions, 0, expressions.size());
                    t.setInitialWorlds(w);
                    t.setInitialUniverses(u);
                    t.evaluateModalExpressionV2(u);
                    /*
                     * this bit below isnt actually painting anything on the 
                     * JPanel even though paintComponent() is being called properly
                     */
                    UniverseDisplay ud = new UniverseDisplay(u);
                    rightPanel.add(ud);
                    rightPanel.revalidate();
                    rightPanel.repaint();
                }
            });
}

JPanel установлен

public void setUpPanels() {
    setUpTextInputField();
    setUpGenerateButton();
    setUpPropsPanel();
    setUpButtons();
    setUpClearButton();


    leftPanel = new JPanel();
    rightPanel = new JPanel();
    leftPanel.setLayout(new GridBagLayout());
    rightPanel.setLayout(new GridBagLayout());

    leftPanel.setBackground(Color.gray);
    rightPanel.setBackground(Color.white);

    /*
     * create a new constraints for each new component, to avoid bugs
     */
    GridBagConstraints constraints = new GridBagConstraints();
    constraints.gridx = 0;
    constraints.gridy = 0;
    leftPanel.add(inputL, constraints);

    constraints = new GridBagConstraints();
    constraints.gridx = 0;
    constraints.gridy = 1;
    leftPanel.add(inputField, constraints);

    constraints = new GridBagConstraints();
    constraints.gridx = 1;
    constraints.gridy = 1;
    constraints.insets = new Insets(0, 15, 0, 0);
    leftPanel.add(generateButton, constraints);

    constraints = new GridBagConstraints();
    constraints.gridx = 0;
    constraints.gridy = 2;
    leftPanel.add(propsL, constraints);

    constraints = new GridBagConstraints();
    constraints.gridx = 0;
    constraints.gridy = 3;
    constraints.insets = new Insets(10, 0, 0, 0);
    constraints.fill = GridBagConstraints.BOTH;
    constraints.anchor = GridBagConstraints.WEST;
    leftPanel.add(propsPanel, constraints);

    constraints = new GridBagConstraints();
    constraints.gridx = 1;
    constraints.gridy = 3;
    constraints.ipadx = 30;
    constraints.ipady = 70;
    constraints.anchor = GridBagConstraints.WEST;
    constraints.insets = new Insets(10, 15, 0, 0);
    leftPanel.add(buttonPanel, constraints);

    constraints = new GridBagConstraints();
    constraints.gridx = 0;
    constraints.gridy = 4;
    constraints.insets = new Insets(10, 0, 0, 0);
    constraints.anchor = GridBagConstraints.WEST;
    leftPanel.add(clearButton, constraints);

    add(leftPanel);
    add(rightPanel);
}

Почему эта линия не рисуется в JPanel?Как мне начать рисовать фигуры в JPanel, для которого макет не имеет нулевого значения?

Надеюсь, этого достаточно для полезного ответа:)

1 Ответ

0 голосов
/ 02 декабря 2018

Когда вы делаете пользовательскую окраску, вы несете ответственность за определение предпочтительного размера компонента.Это делается путем переопределения getPreferredSize() вашего компонента.

Так что в вашем случае вам нужно использовать:

@Overrid
public Dimension getPreferredSize()
{
    return new Dimension(50, 50);
}

Тогда менеджер компоновки может использовать информацию о предпочтительном размере для позиционированиякомпонент в вашем макете.

...