Помогите с простой рамкой и графикой - PullRequest
0 голосов
/ 20 мая 2010

Для домашней работы я пытаюсь создать «CustomButton» с рамкой, и в этой рамке я рисую два треугольника и квадрат над ним. Он должен дать пользователю эффект нажатия кнопки, когда она нажата. Поэтому для начала я пытаюсь настроить начальную графику, рисуя два треугольника и квадрат. У меня проблема в том, что я установил свой кадр на 200, 200 и нарисованные треугольники, я думаю, до правильных концов размера моего кадра, когда я запускаю программу, мне нужно расширить окно, чтобы сделать всю иллюстрацию моя "CustomButton" для просмотра. Это нормально? Спасибо.

Код:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;


public class CustomButton
{
    public static void main(String[] args)
    {
        EventQueue.invokeLater(new Runnable()
        {
            public void run()
            {
                CustomButtonFrame frame = new CustomButtonFrame();
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setVisible(true);
            }
        });
    }
}

class CustomButtonFrame extends JFrame
{
    // constructor for CustomButtonFrame
    public CustomButtonFrame()
    {
        setTitle("Custom Button");
        setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);
        CustomButtonSetup buttonSetup = new CustomButtonSetup();
        this.add(buttonSetup);
    }

    private static final int DEFAULT_WIDTH = 200;
    private static final int DEFAULT_HEIGHT = 200;

}

class CustomButtonSetup extends JComponent
{
    public void paintComponent(Graphics g)
    {
        Graphics2D g2 = (Graphics2D) g;

        // first triangle coords
        int x[] = new int[TRIANGLE_SIDES];
        int y[] = new int[TRIANGLE_SIDES];
        x[0] = 0;   y[0] = 0;
        x[1] = 200; y[1] = 0;
        x[2] = 0;   y[2] = 200;
        Polygon firstTriangle = new Polygon(x, y, TRIANGLE_SIDES);

        // second triangle coords
        x[0] = 0;   y[0] = 200;     
        x[1] = 200; y[1] = 200;
        x[2] = 200; y[2] = 0;
        Polygon secondTriangle = new Polygon(x, y, TRIANGLE_SIDES);

        g2.drawPolygon(firstTriangle);
        g2.setColor(Color.WHITE);
        g2.fillPolygon(firstTriangle);

        g2.drawPolygon(secondTriangle);
        g2.setColor(Color.GRAY);
        g2.fillPolygon(secondTriangle);

        // draw rectangle 10 pixels off border
        g2.drawRect(10, 10, 180, 180);

    }
    public static final int TRIANGLE_SIDES = 3;
}

Ответы [ 2 ]

1 голос
/ 20 мая 2010

Установленные DEFAULT_WIDTH и DEFAULT_HEIGHT предназначены для всего кадра , включая границы, заголовки окон, значки и т. Д. Это не размер самого холста для рисования. Таким образом, ожидается, что если вы рисуете что-то на холсте 200x200, это не обязательно помещается в окне 200x200, содержащем этот холст.

1 голос
/ 20 мая 2010

Попробуйте добавить

public Dimension getPreferredSize() {
    return new Dimension(200, 200);
}

в ваш класс CustomButtonSetup.

А потом сделай

    setTitle("Custom Button");
    //setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);
    CustomButtonSetup buttonSetup = new CustomButtonSetup();
    this.add(buttonSetup);
    pack();

(из api-docs на pack():)

Заставляет размер этого окна соответствовать предпочтительному размеру и расположению его подкомпонентов.

Вы должны получить что-то вроде:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...