Spec-Zone .ru
спецификации, руководства, описания, API
Домашняя страница > Создание GUI С JFC/Swing

Ответы: Выполнение Пользовательского Рисования

Вопросы

Вопрос 1. Какой метод, определенный JComponent красит внутреннюю часть компонента?
Ответ 1: paintComponent метод красит внутренности компонента (за исключением любых дочерних элементов, которые он содержит).

Вопрос 2. Какие из следующих фрагментов кода красят прямоугольник (заполненный или не), который является 100x100 пиксели?

a. g.fillRect(x, y, 100, 100)
b. g.fillRect(x, y, 99, 99)
c. g.drawRect(x, y, 100, 100)
d. b и c
e. a и c

Ответ 2: a. drawRect методы красят строки только ниже указанного прямоугольника. Так получить 100x100 прямоугольник, Вы должны определить width и height 99, 99 к drawRect. Для fillXxx методы, с другой стороны, Вы определяете точно требуемый width и height, таким образом, g.fillRect(x, y, 100, 100) результаты в 100x100 прямоугольник.


Вопрос 3. Какой код Вы использовали бы, чтобы заставить компонент выполнить следующую работу рисования, используя цвет фона в 50%-ой прозрачности?
Ответ 3:

g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.5f));

Упражнения

Упражнение 1. Используя стандартную границу и пользовательское компонентное рисование, реализуйте компонент, который имеет привилегированный размер 250x100, непрозрачен по умолчанию, имеет черную границу с 5 пикселями, и красит ⠀œ X⠀ (использование 5 пикселей толстые строки) в цвете переднего плана, как показано в следующем числе. ComponentDisplayer-1.png

Ответ 1: См. XMarksTheSpot.java, который можно выполнить использование ComponentDisplayer.java.

Вот код, который устанавливает границу XMarksTheSpot компонент:

setBorder(BorderFactory.createMatteBorder(5,5,5,5, Color.BLACK));

Вот X-код-для-прорисовки от paintComponent метод XMarksTheSpot:

Graphics2D g2 = (Graphics2D)g;
Insets insets = getInsets();
g2.setStroke(new BasicStroke(5.0f));
g2.draw(new Line2D.Double(insets.left,
                          insets.top,
                          getWidth() - insets.right,
                          getHeight() - insets.bottom));
g2.draw(new Line2D.Double(insets.left,
                          getHeight() - insets.bottom,
                          getWidth() - insets.right,
                          insets.top));


Упражнение 2. Реализуйте значок that⠀™ s 10x10 пиксели, и красит сплошной прямоугольник, который заполняется 10x10 область. Если icon⠀™ s компонент включается, прямоугольник должен быть красным; если отключено, серый. Сделайте копию ButtonDemo.java это использует Ваше пользовательское Icon для средней кнопки, вместо отображения middle.gif. Следующие изображения показывают то, на что должен быть похожим значок.

SquareIcon-1.png SquareIcon-2.png

Ответ 2: См. SquareIcon.java, который можно выполнить использование, это изменило ButtonDemo.java.

Вот код, который устанавливает значок:

Icon middleButtonIcon = new SquareIcon();
...
b2 = new JButton("Middle button", middleButtonIcon);

Вот SquareIcon's реализация этих трех методов, требуемых Icon интерфейс:

public void paintIcon(Component c, Graphics g,
                      int x, int y) {
    if (c.isEnabled()) {
        g.setColor(Color.RED);
    } else {
        g.setColor(Color.GRAY);
    }

    g.fillRect(x, y, SIZE, SIZE);
}

public int getIconWidth() {
    return SIZE;
}

public int getIconHeight() {
    return SIZE;
}


Упражнение 3. Реализуйте границу, которая красит красные 15 пикселей высокой дорожкой полностью через вершину ее компонента. Протестируйте эту границу, заменяя этим границу на компоненте, который Вы создали в упражнении 1. Результат должен быть похожим на следующее число. ComponentDisplayer-2.pngОтвет 3: См. StripeBorder.java, который можно выполнить использование ComponentDisplayer.java и XMarksTheSpot.java (убедитесь, чтобы непрокомментировать строку, который устанавливаете границу в StripeBorder). Вот StripeBorder's реализация этих трех методов, требуемых Border интерфейс:

public void paintBorder(Component c, Graphics g,
                        int x, int y,
                        int width, int height) {
    g.setColor(Color.RED);
    g.fillRect(x, y, c.getWidth(), HEIGHT);
}

public Insets getBorderInsets(Component c) {
    return new Insets(HEIGHT, 0, 0, 0);
}

public boolean isBorderOpaque() {
    return true;
}


«ПредыдущийTOC

Проблемы с примерами? Попытайтесь Компилировать и Выполнить Примеры: FAQ.
Жалобы? Поздравление? Предложения? Дайте нам свою обратную связь
.

Предыдущая страница: Вопросы и Упражнения: Выполнение Пользовательского Рисования