Java - используя paintComponent для графики, вызывая функции изнутри? - PullRequest
2 голосов
/ 30 июля 2011

Я действительно запутался в потоке программы о том, как функция paintComponent работает в моем JPanel. В идеале я хотел бы иметь доступ к объекту Graphics, чтобы рисовать вещи из других функций на основе потока моей программы. Я думаю о том, что:

private Graphics myG;

public void paintComponent(Graphics g) {
    super.paintComponent(g);
    myG = g; //I want a graphics object that I can just draw with. 
             //Should I just initialize to myG = new Graphics(); or something?
    //private Graphics myG = new Graphics(); does not seem to work        
  }

//this is what's getting called, where I want to call other functions that 
//can use myG to draw graphics as I please
public void startPanelView() {      

    myG.drawRect(350, 20, 400, 300); //doesn't work

    otherFunctionForGraphics(); //which will also use myG.  
}

Надеюсь, я прояснил это здесь. Я просто хочу иметь возможность использовать класс Graphics по своему усмотрению. В настоящее время я могу делать только такие вещи, как g.drawRect(...) внутри функции paintComponent(). Это может работать для моих целей, но я бы хотел больше гибкости.

Спасибо.

РЕДАКТИРОВАТЬ - Хорошо, я понимаю, что я не должен пытаться ссылаться на графический объект снаружи. Но как мне отделить логику приложения от функции paintComponent? Сейчас этот класс выглядит немного грязно, потому что у меня есть следующее:

public void paintComponent(Graphics g) {

    if (flag1 == true) {
        //do some graphics stuff, that I would prefer to be in another function
    }

    if (flag2 == true) {
        //do some other graphics stuff, again, which I would prefer 
        //to be in another function
    }

    //... etc. More of these cases.
}

И в основном функция paintComponent становится глупо длинной и сложной для меня, поэтому я хотел бы разбить ее любым возможным способом.

Ответы [ 4 ]

4 голосов
/ 30 июля 2011

Другие правы в том, что вы не можете сохранить объект Graphics в качестве переменной-члена, но если проблема в том, что ваш метод paintComponent становится слишком длинным, вы все равно можете передать Graphics Swing, который дает вам какаргумент для других методов:

public void paintComponent(Graphics g) {
    super.paintComponent(g);
    g.drawRect(350, 20, 400, 300);
    doSomeStuff(g);
    if (flag1) {
        doMoreStuff(g);
    } else {
        doDifferentStuff(g);
    }
}
4 голосов
/ 30 июля 2011

Вызовите repaint из вашего startPanelView метода на объекте панели.Вы никогда не должны воздействовать на графический объект вне методов paint, и при этом вы не должны поддерживать ссылку на графический объект для использования вне метода paint.

2 голосов
/ 30 июля 2011

Мне бы хотелось иметь доступ к объекту Graphics, чтобы рисовать вещи из других функций на основе потока моей программы.Я имею в виду следующее:

Нет, вы не должны делать это в стандартном приложении Swing, поскольку полученный объект Graphics не будет сохраняться, а ваши рисунки исчезнут всякий раз, когда JVM илиоперационная система решает, что перекрашивание необходимо.Рассмотрите возможность создания списков или других коллекций объектов для рисования (например, из классов, которые реализуют Shape) и итерации по этим коллекциям в методе paintComponent.Другой метод - нарисовать BufferedImage, а затем отобразить его в вашем методе paintComponent.

1 голос
/ 30 июля 2011

basic JComponent для Painting/Custom Painting/2D Graphics в Swing или для Image / ImageIcon тоже составляет JLabel ,

не вызывайте другой viod (s) или класс (ы) из 2D Graphics или CustomPainting , некоторые ценные примеры здесь или здесь , ищите на этом форуме отличные предложения о Custom Painting и 2D Graphics

...