Как сделать холст с Swing?

Супер упрощенным примером является следующий:

<div class="TABLE">
        <div class="ROW">
            <div class="CELL CELL50">
                <asp:CheckBoxList ID="cblDepts" runat="server" OnSelectedIndexChanged="cblDepts_SelectedIndexChanged" AutoPostBack="True"></asp:CheckBoxList>
            </div>
            <div class="CELL CELL50">
                <asp:CheckBoxList ID="cblAreas" runat="server" Visible="false">
                </asp:CheckBoxList>
            </div>
        </div>
    </div>

public partial class _Default : Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!this.IsPostBack)
            {
                this.cblDepts.Items.Add(new ListItem() { Text = "1", Value = "1" });
                this.cblDepts.Items.Add(new ListItem() { Text = "2", Value = "2" });
                this.cblDepts.Items.Add(new ListItem() { Text = "3", Value = "3" });
            }
        }

        protected void cblDepts_SelectedIndexChanged(object sender, EventArgs e)
        {
            this.cblAreas.Items.Clear();
            foreach (ListItem item in this.cblDepts.Items) {
                var selectedValue = "-1";
                if (item.Selected)
                {
                    selectedValue = item.Value;
                }

                if (selectedValue == "1")
                {
                    this.cblAreas.Items.Add(new ListItem() { Text = "1.1", Value = "1.1" });
                }
                else if (selectedValue == "2")
                {
                    this.cblAreas.Items.Add(new ListItem() { Text = "2.2", Value = "2.2" });
                }
                else if (selectedValue == "3")
                {
                    this.cblAreas.Items.Add(new ListItem() { Text = "3.3", Value = "3.3" });
                }
            }

            if (this.cblAreas.Items == null || this.cblAreas.Items.Count == 0)
            {
                this.cblAreas.Visible = false;
            }
            else
            {
                this.cblAreas.Visible = true;
            }

        }
    }

Приведенный выше пример является фиктивным и только для демонстрации, он ни в коем случае не является правильным кодом для производства, но вы понимаете! & Л; 3

24
задан Laurel 25 June 2016 в 19:53
поделиться

4 ответа

Для создания пользовательского «холста» на качелях вы обычно пишете подкласс JPanel . Затем вы должны перезаписать метод protected paintComponent(Graphics g) из JPanel.

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

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

45
ответ дан jjnguy 28 November 2019 в 22:23
поделиться

Возможно, вы захотите сделать подкласс из 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 могут быть нарисованы на Image с.


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

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

16
ответ дан Javier 28 November 2019 в 22:23
поделиться

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

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

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

13
ответ дан 28 November 2019 в 22:23
поделиться

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

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

2
ответ дан 28 November 2019 в 22:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: