Попытка заставить окно нарисовать себя, когда это загружается - PullRequest
0 голосов
/ 12 апреля 2011

Это оказалось сложнее, чем я думал.Я просто учусь и возлюсь с функцией рисования.Я хочу, чтобы программа запускала окно, которое содержит, скажем, прямоугольник.Размер этого прямоугольника будет масштабироваться по размеру окна (т. Е. Если окно имеет размер 1000px, а прямоугольник настроен на масштабирование в 90%, прямоугольник будет 900px).У меня есть математика, выясняющая, как отцентрировать его и определить его размер, но с помощью заглушек я обнаружил, что при использовании object.getWidth () и height и т. Д. Каждый раз возвращается 0, полностью отбрасывая математику дляsizing.

Подумав некоторое время, я предполагаю, что это потому, что он пытается получить ширину и высоту от объекта, который все еще строится.По моей собственной логике, до тех пор, пока вы выполняете математику после частей сборки конструктора, все должно быть хорошо, но, увы, я, похоже, ошибаюсь.

Я пытался создать отдельные классы, которые создают фрейми тот, который делает рисунок.Рисующий объект принимает JFrame как часть конструктора и пытается рисовать на нем.Я создаю каждый из них отдельно, сначала кадр, затем рисующий объект (отправляя ему объект кадра), но это тоже не работает.

Есть предложения?

РЕДАКТИРОВАТЬ:

По предложению Эндрю.Вот мой объект панели, который нужно добавить в окно

package scaling_test;
import java.awt.*;
import javax.swing.*;

public class MyDrawing extends JPanel
{

    public MyDrawing() throws HeadlessException
    {
        this.setVisible(true);
    }

    public void paintComponent(Graphics g)
    {
        super.paintComponents(g);
        //set scaling
        int usrScale = 90;
        int scaleRef = (100 - usrScale) / 2;
        int xStart = this.getWidth() * (scaleRef / 100);
        int yStart = this.getHeight() * (scaleRef / 100);
        int width = (usrScale / 100) * this.getWidth();
        int height = (usrScale / 100) * this.getHeight(); 

        //draw square outline
        g.setColor(Color.green);
        g.fillRect(xStart, yStart, width, height);
    }
}

И это окно, добавляющее этот объект jpanel:

package scaling_test;
import java.awt.*;
import javax.swing.*;

public class DrawThis extends JFrame
{
    MyDrawing drawing;

    public DrawThis() throws HeadlessException
    {
        drawing = new MyDrawing();
        this.add(drawing);
    }
}

И модуль запуска

package scaling_test;

public class ScaleTest
{
    public static void main(String[] args)
    {
        DrawThis program = new DrawThis();
        program.setBounds(250, 250, 800, 600);
        program.setVisible(true);
    }
}

Обновленная панель (все еще не работает):

package scaling_test;
import java.awt.*;
import javax.swing.*;

public class MyDrawing extends JPanel
{

    public MyDrawing() throws HeadlessException
    {
    }

    public void paintComponent(Graphics g)
    {
        super.paintComponents(g);

        //set scaling
        int usrScale = 90;
        int scaleRef = (100 - usrScale) / 2;
        int xStart = this.getWidth() * scaleRef / 100;
        int yStart = this.getHeight() * scaleRef / 100;

        int width = usrScale * this.getWidth() / 100;
        int height = usrScale * this.getHeight() / 100;

        //draw square outline
        g.setColor(Color.green);
        g.fillRect(xStart, yStart, width, height);
    }
}

Ответы [ 3 ]

2 голосов
/ 12 апреля 2011

Выполните вычисления в методе paintComponent(Graphics) для JPanel, который добавляется к JFrame.Метод paintComponent() вызывается только после того, как компонент «реализован» на экране.

2 голосов
/ 12 апреля 2011

Почему вы используете метод getGraphics (...), когда метод paintComponent (...) передается объекту Graphics?Кроме того, вы должны вызывать super.paintComponent (g) в качестве первого утверждения в вашем методе.Я не знаю, почему вы это прокомментировали.

Прочитайте раздел учебника по Swing на Custom Painting для рабочих примеров.

Если вам нужна дополнительная помощь, тогда пишитеваш SSCCE , поэтому мы не догадываемся, как выглядит ваш фактический код.

Редактировать:

Вы добавили какие-либо операторы отображения, чтобы увидеть, используются ли значения, используемые вМетод drawRect (...) имеет смысл?Не думайте, что ваши математические форумы верны.Прежде всего вам необходимо понять, как работают целочисленные вычисления:

//        int width = (usrScale / 100) * this.getWidth();
//        int height = (usrScale / 100) * this.getHeight();
        int width = usrScale * this.getWidth() / 100;
        int height = usrScale * this.getHeight() / 100;

В закомментированном коде (usrScale / 100) = 0, поскольку это значение преобразуется в целое число до того, как умножение выполнено.

0 голосов
/ 12 апреля 2011

Немного сложно увидеть ваш код, но один из вариантов - setPreferredSize (x, y); на JFrame, затем вызовите pack (); После этого вы можете проверить размер окна.

...