Как установить положение GeneralPath в JPanel?

1

Мне нужно выполнить упражнение, в котором необходимо поставить черный JPanel слева, где мне нужно нарисовать звездообразный GeneralPath и некоторые кнопки справа, которые должны будут перемещать этот общий путь, плюс кнопку сброса, которая установит положение общего пути в середине панели.

Это код:

import java.awt.*;
import java.awt.geom.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.border.*;

public class SunGUI extends JFrame {
    private Space space;
    private Control control;
    private final int DELTA = 50;
    private int posX, posY;

    public SunGUI() {
        Container cnt = getContentPane();

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLayout(new BorderLayout());

        space = new Space();
        control = new Control();

        cnt.add(space, BorderLayout.CENTER);
        cnt.add(control, BorderLayout.EAST);

        pack();
        setVisible(true);

    }

    public class Space extends JPanel {
        private GeneralPath sun;

        public Space() {
            setPreferredSize(new Dimension(800, 600));
            sun = createSun();

        }

        public GeneralPath createSun() {
            GeneralPath sun = new GeneralPath();

            sun.moveTo(-30, -30);
            sun.lineTo(50, 50);
            sun.moveTo(50, -30);
            sun.lineTo(-30, 50);
            sun.moveTo(10, -35);
            sun.lineTo(10, 55);
            sun.moveTo(-35, 10);
            sun.lineTo(55, 10);
            sun.moveTo(-5, -25);
            sun.lineTo(25, 45);
            sun.moveTo(25, -25);
            sun.lineTo(-5, 45);
            sun.moveTo(-25, -5);
            sun.lineTo(45, 25);
            sun.moveTo(45, -5);
            sun.lineTo(-25, 25);

            sun.closePath();
            return sun;

        }

        @Override
        public void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2 = (Graphics2D)g;

            setBorder(BorderFactory.createLineBorder(Color.red));
            setBackground(Color.black);

            g2.setPaint(Color.white);
            g2.draw(sun);

        }
    }

    public class Control extends JPanel {
        private JButton up, down, left, right, reset;
        private JPanel arrows, panel, resetPanel, container;

        public Control() {
            setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));

            panel = new JPanel();
            arrows = new JPanel();
            resetPanel = new JPanel();
            container = new JPanel();

            arrows.setLayout(new GridLayout(1, 4));
            resetPanel.setLayout(new GridLayout(1, 1));
            container.setLayout(new GridLayout(2, 1));

            up = new JButton("^");
            down = new JButton("v");
            left = new JButton("<");
            right = new JButton(">");
            reset = new JButton("R");

            arrows.add(up);
            arrows.add(left);
            arrows.add(right);
            arrows.add(down);

            resetPanel.add(reset);

            container.add(arrows);
            container.add(resetPanel);
            arrows.setPreferredSize(new Dimension(160, 20));
            resetPanel.setPreferredSize(new Dimension(160, 20));

            panel.add(container);
            panel.setBorder(new TitledBorder("Comandi"));
            add(panel);

        }
    }

    public static void main(String args[]) {
        new SunGUI();

    }
}

Прямо сейчас этот код будет показывать только статический графический интерфейс со звездообразным общим дорожкой в верхнем левом углу, но я хочу сделать его посреди черной панели.

Я искал в Интернете, но ничего не нашел, у кого-нибудь есть идея?

  • 0
    @ Andrew Thompson Я использовал ваш код, но таким образом все содержимое JPanel (включая границу) теперь переводится ... Как я могу переместить только GeneralPath? Еще раз спасибо
Теги:
swing
java-2d

2 ответа

1
super.paintComponent(g);
AffineTransform move = AffineTransform.getTranslateInstance(x,y);
g.setTransform(move);
// draw the shape...
  • 0
    Поочередно используйте g2.translate(x,y); ..
  • 0
    «Я использовал ваш код, но таким образом все содержимое JPanel (включая границу) теперь переводится ...» Во-первых, я получаю уведомления о комментариях, только если они относятся к ответу или комментарию, который я написал, обратите внимание, что для будущее. Что касается вашего вопроса, вы думали проверить документацию для метода? Это охватывает только эту ситуацию. Лучше привыкни читать документацию сейчас. Как программисты, нам нужно читать их много.
0

Вы можете перевести весь графический контекст с g2.translate как ответил Эндрю Томпсон (а затем сбросить преобразование), или перевести только форму, используя createTransformedShape метод AffineTransform. Вот пример: как иметь вращающуюся форму Ellipse в Java?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню