container.java.svn-base

来自「j2me设计的界面包」· SVN-BASE 代码 · 共 759 行 · 第 1/2 页

SVN-BASE
759
字号
    public void revalidate() {
        setShouldCalcPreferredSize(true);
        Form root = getComponentForm();
        if (root != null) {
            root.layoutContainer();
            root.repaint();
        } else {
            layoutContainer();
            repaint();
        }
    }

    /**
     * @inheritDoc
     */
    public void paint(Graphics g) {
        layoutContainer();
        g.translate(getX(), getY());
        Enumeration enums = components.elements();
        while (enums.hasMoreElements()) {
            Component cmp = (Component) enums.nextElement();
            cmp.paintInternal(g);
        }

        g.translate(-getX(), -getY());
    }

    void paintIntersecting(Graphics g, Component cmp, Rectangle bounds, boolean above) {
        
        if (layout.isOverlapSupported() && components.contains(cmp)) {
            int indexOfComponent = components.indexOf(cmp);
            int startIndex;
            int endIndex;
            if (above) {
                startIndex = indexOfComponent + 1;
                endIndex = components.size();
            } else {
                startIndex = 0;
                endIndex = indexOfComponent;
            }

            for (int i = startIndex; i < endIndex; i++) {
                Component cmp2 = (Component) components.elementAt(i);
                Rectangle rect = new Rectangle(cmp2.getBounds());
                rect.setX(cmp2.getAbsoluteX());
                rect.setY(cmp2.getAbsoluteY());

                if (rect.intersects(bounds)) {
                    cmp2.paintInternal(g, false);
                }
            }
        }
    }

    /**
     * Performs the layout of the container if a layout is necessary
     */
    public void layoutContainer() {
        //will compute the container + components and will layout the components.
        if (shouldLayout) {
            shouldLayout = false;
            doLayout();
        }

    }

    /**
     * Lays out the container
     */
    void doLayout() {
        layout.layoutContainer(this);
        int count = getComponentCount();
        for (int i = 0; i <
                count; i++) {
            Component c = getComponentAt(i);
            if (c instanceof Container) {
                ((Container) c).doLayout();
            }

        }
    }

    /**
     * Returns the number of components
     * 
     * @return the Component count
     */
    public int getComponentCount() {
        return components.size();
    }

    /**
     * Returns the Component at a given index
     * 
     * @param index of the Component you wish to get
     * @return a Component
     * @throws ArrayIndexOutOfBoundsException if an invalid index was given.
     */
    public Component getComponentAt(
            int index) {
        return (Component) components.elementAt(index);
    }

    /**
     * Returns the Component index in the Container
     * 
     * @param cmp the component to search for
     * @return the Component index in the Container or -1 if not found
     */
    public int getComponentIndex(Component cmp) {
        int count = getComponentCount();
        for (int i = 0; i <
                count; i++) {
            Component c = getComponentAt(i);
            if (c.equals(cmp)) {
                return i;
            }
        }
        return -1;
    }

    /**
     * Returns true if the given component is within the hierarchy of this container
     *
     * @param cmp a Component to check
     * @return true if this Component contains in this Container
     */
    public boolean contains(Component cmp) {
        boolean found = false;
        int count = getComponentCount();
        for (int i = 0; i < count; i++) {
            Component c = getComponentAt(i);
            if (c.equals(cmp)) {
                return true;
            }

            if (c instanceof Container) {
                found = ((Container) c).contains(cmp);
                if (found) {
                    return true;
                }

            }
        }
        return false;
    }

    /**
     * Makes sure the component is visible in the scroll if this container is 
     * scrollable
     * 
     * @param c the component that will be scrolling for visibility
     */
    protected void scrollComponentToVisible(Component c) {
        if (isScrollable()) {
            if (c != null) {
                if (c.getParent() != null) {
                    // special case for the first component to allow the user to scroll all the 
                    // way to the top
                    Form f = getComponentForm();
                    if (f != null && f.getFocusPosition(c) == 0) {
                        scrollRectToVisible(new Rectangle(0, 0, c.getX() + c.getWidth(), c.getY() + c.getHeight()), c);
                        return;
                    }
                }
                scrollRectToVisible(c.getBounds(), c);
            }
        }

    }

    /**
     * Returns a Component that exists in the given x, y coordinates by traversing
     * component objects and invoking contains
     * 
     * @param x absolute screen location
     * @param y absolute screen location
     * @return a Component if found, null otherwise
     * @see Component#contains
     */
    public Component getComponentAt(int x, int y) {
        int count = getComponentCount();
        for (int i = count - 1; i >= 0; i--) {
            Component cmp = getComponentAt(i);
            if (cmp.contains(x, y)) {
                if (cmp instanceof Container) {
                    return ((Container) cmp).getComponentAt(x, y);
                }
                return cmp;
            }

        }
        return null;
    }

    /**
     * @inheritDoc
     */
    public void pointerPressed(int x, int y) {
        if (!isDragActivated()) {
            Component cmp = getComponentAt(x, y);
            if (cmp != null) {
                cmp.pointerPressed(x, y);
            }
        }
    }

    /**
     * @inheritDoc
     */
    public void pointerReleased(int x, int y) {
        if (isDragActivated()) {
            super.pointerReleased(x, y);
            return;
        }
        Component cmp = getComponentAt(x, y);
        if (cmp != null) {
            cmp.pointerReleased(x, y);
        }

    }

    /**
     * @inheritDoc
     */
    protected Dimension calcPreferredSize() {
        Dimension d = layout.getPreferredSize(this);
        return d;
    }

//    /**
//     * @inheritDoc
//     */
//    public boolean isFocusable() {
//        return false;
//    }
    /**
     * @inheritDoc
     */
    protected String paramString() {
        String className = layout.getClass().getName();
        String layoutStr = className.substring(className.lastIndexOf('.') + 1);
        return super.paramString() + ", layout = " + layoutStr +
                ", scrollableX = " + scrollableX +
                ", scrollableY = " + scrollableY +
                ", components = " + getComponentsNames();
    }

    /**
     * Return the conatainer components objects as list of Strings
     * @return the conatainer components objects as list of Strings
     */
    private String getComponentsNames() {
        String ret = "[";
        Enumeration enums = components.elements();
        while (enums.hasMoreElements()) {
            String className = enums.nextElement().getClass().getName();
            ret += className.substring(className.lastIndexOf('.') + 1) + ", ";
        }

        return ret.substring(0, ret.length() - 2) + "]";
    }

    /**
     * @inheritDoc
     */
    public void refreshTheme() {
        super.refreshTheme();
        Enumeration enums = components.elements();
        while (enums.hasMoreElements()) {
            Component cmp = (Component) enums.nextElement();
            cmp.refreshTheme();
        }
    }

    /**
     * @inheritDoc
     */
    public boolean isScrollableX() {
        return scrollableX && getPreferredW() > getWidth();
    }

    /**
     * @inheritDoc
     */
    public boolean isScrollableY() {
        return scrollableY && getPreferredH() > getHeight();
    }

    /**
     * Sets whether the component should/could scroll on the X axis
     * 
     * @param scrollableX whether the component should/could scroll on the X axis
     */
    public void setScrollableX(boolean scrollableX) {
        this.scrollableX = scrollableX;
    }

    /**
     * Sets whether the component should/could scroll on the Y axis
     * 
     * @param scrollableY whether the component should/could scroll on the Y axis
     */
    public void setScrollableY(boolean scrollableY) {
        this.scrollableY = scrollableY;
    }

    /**
     * The equivalent of calling both setScrollableY and setScrollableX
     * 
     * @param scrollable whether the component should/could scroll on the 
     * X and Y axis
     */
    public void setScrollable(boolean scrollable) {
        setScrollableX(scrollable);
        setScrollableY(scrollable);
    }

    /**
     * @inheritDoc
     */
    public void setCellRenderer(boolean cellRenderer) {
        if (isCellRenderer() != cellRenderer) {
            super.setCellRenderer(cellRenderer);
            int size = getComponentCount();
            for (int iter = 0; iter <
                    size; iter++) {
                getComponentAt(iter).setCellRenderer(cellRenderer);
            }
        }
    }

    /**
     * @inheritDoc
     */
    protected String getUIID() {
        return "Container";
    }
}

class Anim implements Animation {

    private Transition t;
    private Component current;
    private Component next;
    private boolean started = false;
    private Container thisContainer;

    public Anim(Container thisContainer, Component current, Component next, Transition t) {
        this.t = t;
        this.next = next;
        this.current = current;
        this.thisContainer = thisContainer;
    }

    public boolean animate() {
        if (!started) {
            t.init(current, next);
            t.initTransition();
            started = true;
        }
        boolean notFinished = t.animate();
        if (!notFinished) {
            next.setParent(null);
            thisContainer.replace(current, next);
            //release the events blocking
            Display.getInstance().blockEvents(false);
            t.cleanup();
            thisContainer.getComponentForm().deregisterAnimated(this);
        }
        return notFinished;
    }

    public void paint(Graphics g) {
        t.paint(g);
    }
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?