Супер упрощенным примером является следующий:
<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
Для создания пользовательского «холста» на качелях вы обычно пишете подкласс JPanel
. Затем вы должны перезаписать метод protected paintComponent(Graphics g)
из JPanel
.
В методе рисования вы можете вызывать методы объекта Graphics
для рисования на JPanel
.
Как всегда, в руководствах по Java есть отличная ссылка , чтобы начать работу.
Возможно, вы захотите сделать подкласс из 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.
Просто подкласс JComponent
.
JPanel
является неподходящим классом. Часто предлагается, так как кажется, что setOpaque (true)
вызывается автоматически. Это на самом деле PL & F, который делает это, и зависит ли это от реализации и зависит от поставщика.
Canvas
является тяжеловесным компонентом. То есть он управляется базовой оконной системой. В результате он обычно рисуется поверх компонентов Swing, без учета z-порядка или отсечения (помещение его в область прокрутки даст странное поведение).
Возможно, вы захотите взглянуть на API Minueto. Это очень простой в использовании графический интерфейс API, и вы можете комбинировать прослушивание событий Java с ним, чтобы обеспечить возможность рисования.