public void paint(Graphics g, JComponent c) { if (component != null) {//如果当前被设计的组件不为空,则画出该组件来 paintDesignedComponent(g); }if ((selected_components != null) &&!selected_components.isEmpty()) { //如果当前选中的组件不为空,则画出他们的resizing边框来 paintResizing(g); }if (selection_bounds != null) { //如果当前正在选择组件,画出选择框来 g.setColor(SELECTION_COLOR); g.drawRect(selection_bounds.x + LEFT_PAD, selection_bounds.y + TOP_PAD, selection_bounds.width, selection_bounds.height); } }private void paintResizing(Graphics g, JComponent c) { //当前这些选中的组件是否是可以resize的 //带有布局管理器的容器组件内的组件不应该能resizeable //另外如果所选择的组件跨了几个容器,它们也不应该能resizeable boolean resizable = isSelectedResizable();for (Component comp : selected_components) { Rectangle bounds = getRelativeBounds(comp); g.setColor(SELECTION_COLOR); int x = bounds.x + LEFT_PAD; int y = bounds.y + TOP_PAD; int w = bounds.width; int h = bounds.height;//画出被选择组件的高亮边框 g.drawRect(x, y, w, h); if (resizable) { //如果是resizable,要画出其拖拽点矩形 drawResizingThumbs(g, x, y, w, h); } } }private void paintDesignedComponent(Graphics g, JComponent c) { //这儿和以前讲过的一样,再使用Renderer技术时,要保证渲染组件是非缓冲的 ArrayList dbcomponents = new ArrayList();disableBuffer(component, dbcomponents); int width = component.getWidth(); int height = component.getHeight();//创建相对根组件的剪切窗口图形对象 Graphics clipg = g.create(LEFT_PAD, TOP_PAD, width, height);//使用跟组件渲染 component.paint(clipg); clipg.dispose();int x = LEFT_PAD - BORDER_THICK; int y = TOP_PAD - BORDER_THICK; int w = width + 2 * BORDER_THICK; int h = height + 2 * BORDER_THICK;//画出外边框来 areaBorder.paintBorder(component, g, x, y, w, h); resetBuffer(dbcomponents); } |
时间不多了,今天先写到这儿吧。明天再详细讲述如何给界面设计工具加上选择、键盘、编辑等功能。这儿有初步的。已经能进行组件选择、拖放、添加、删除、复制、粘贴等简单的编辑动作了。下面是个截图:
更新:
这两天做了进一步重构,添加了一些新的功能和注释。现在的设计界面工具可以进行布局管理,添加了添加提示、添加、删除、复制、剪切、粘帖、对齐等功能,把组件选择工具条做了修改,可以添加容器类等等。下面是几个截图: