Как сделать холст с помощью Swing? - PullRequest
24 голосов
/ 22 апреля 2009

Я пытаюсь создать редактор рисования на Java, в котором у меня есть панель инструментов с объектами, которые я хотел бы вставить на холст. Я использую компоненты Swing для создания GUI, но когда я искал способ создания холста, я нашел только класс canvas из AWT.

Есть ли способ сделать что-то похожее на canvas с помощью Swing? (например, JPanel?) Я читал, что использование холста класса из AWT с графическим интерфейсом, созданным с использованием Swing, не будет работать правильно, это правда?

Ответы [ 4 ]

45 голосов
/ 22 апреля 2009

Чтобы создать собственный холст на качелях, вы обычно пишете подкласс JPanel. Затем необходимо переписать метод protected paintComponent(Graphics g) для JPanel.

В методе рисования вы можете вызывать методы объекта Graphics для фактического рисования на JPanel.

Как всегда, в руководствах по Java есть отличная ссылка , чтобы начать работу.

16 голосов
/ 22 апреля 2009

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

Основной подход, вероятно, будет заключаться в том, чтобы присвоить MouseListener подклассу JPanel, а затем реализовать функцию рисования.

Основная идея может быть чем-то вроде:

class MyCanvas extends JPanel implements MouseListener
{
    Image img;      // Contains the image to draw on MyCanvas

    public MyCanvas()
    {
        // Initialize img here.
        this.addMouseListener(this);
    }

    public void paintComponent(Graphics g)
    {
        // Draws the image to the canvas
        g.drawImage(img, 0, 0, null);
    }

    public void mouseClicked(MouseEvent e)
    {
        int x = e.getX();
        int y = e.getY();

        Graphics g = img.getGraphics();
        g.fillOval(x, y, 3, 3);
        g.dispose();
    }

    // ... other MouseListener methods ... //
}

Приведенный выше пример неполон (и не проверен - он определенно не будет компилироваться), но он дает представление о том, как реализовать класс MyCanvas, в котором пользователь может щелкать и рисовать круги.

Объект img используется для хранения изображения холста. Метод paintComponent используется для рисования объекта img на холсте. В методе mouseClicked объект Graphics, связанный с img, извлекается для fillOval на изображении.

Поскольку одним из требований является вставка изображений на холст, было бы неплохо иметь несколько Image, которые вы хотите вставить на холст. Возможно, что-то вроде:

Image[] myImages;    // Used to store images to paint to screen.

Затем в процедуре закрасить изображение на img, хранящееся в MyCanvas:

g.drawImage(myImage[INDEX_OF_DESIRED_IMAGE], 0, 0, null);

При использовании метода drawImage объекта Graphics другие Image s могут быть нарисованы на Image s.


Что касается вопроса о AWT и Swing, то да, это правда, что вы не хотите смешивать компоненты из AWT и Swing, так как они отличаются тем, как они отображают компоненты GUI. AWT основан на тяжеловесных компонентах, что означает, что они являются родными окнами для рисования графического интерфейса, в то время как Swing основан на облегченных компонентах, что означает, что GUI рисуется самой Java без использования собственных компонентов.

Хорошее руководство по различию AWT и Swing представлено в Живопись в AWT и Swing Статья от Sun.

13 голосов
/ 22 апреля 2009

Просто подкласс JComponent.

JPanel - неприемлемый класс. Это часто предлагается, поскольку кажется, что setOpaque(true) вызывается автоматически. Это на самом деле PL & F, который делает это, и зависит ли это от реализации и зависит от поставщика.

Canvas является тяжелым компонентом. То есть он управляется базовой оконной системой. В результате он обычно рисуется поверх компонентов Swing, без учета z-порядка или отсечения (помещение его в область прокрутки даст странное поведение).

2 голосов
/ 30 апреля 2009

Возможно, вы захотите взглянуть на API Minueto. Это очень простой в использовании графический API, и вы можете комбинировать прослушивание событий Java с ним, чтобы обеспечить возможность рисования.

http://minueto.cs.mcgill.ca/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...