Рисование графики на JPanel без использования метода PaintComponent и вызова перерисовки

Я хочу рисовать графику на JPanel. Прямо сейчас я использую метод paintComponent для определения рисунка:

public void paintComponent(Graphics g) {
    super.paintComponent(g);
    g.setColor(Color.BLACK);
    g.fillRect(10,10,100,100);
}

Затем я вызываю repaint() везде, где хочу поместить графику.

Но мне интересно, есть ли способ добавить графику в JPanel так же, как добавление компонентов, без использования этого метода paintComponent: panel.add(myComponent). Я видел, что тип Graphics не может быть инициирован, но, возможно, может быть другой тип, позволяющий мне это сделать.

Я почти уверен, что многие графические интерфейсы, такие как FANG Engine, имеют эту опцию, но все примеры, которые я видел с Swing, использовали этот метод. Есть предложения обойтись без этого? Потому что иногда это портит общий дизайн моей программы.

Заранее спасибо.


person Emir    schedule 13.07.2011    source источник
comment
@mKorbel, я прошел все эти API и учебные пособия, прежде чем пришел сюда. Вы хоть читали мой вопрос?   -  person Emir    schedule 13.07.2011
comment
@Emir: иногда это портит общий дизайн моей программы. Если вы не поймете, почему это не так, я подозреваю, что проблемы сохранятся при использовании альтернативных методов, которые были предложены.   -  person Andrew Thompson    schedule 13.07.2011
comment
@Emir: Вы вообще прочитали мой вопрос? -1 У меня не было времени внимательно прочитать ваш вопрос. Если хотите, я удалю свой комментарий, а не копаюсь в деталях. (И это был хороший совет, что мы не можем знать, что вы проверили, пока вы нам не расскажете. Мы не телепаты.)   -  person Andrew Thompson    schedule 13.07.2011
comment
@Эндью Томпсон: Пожалуйста. Я занимаюсь этой проблемой уже неделю и я все прочитал, прежде чем я пришел сюда. Если бы я рассказал, почему это мешает общему замыслу моей программы, это ничего бы не дало, кроме сложности для комментаторов. И вопрос не в этом бардаке, если вы прочтете заголовок, в нем сказано все, что я хочу знать. Я проверю ответ, как только смогу сделать то, что указано в заголовке, это не имеет никакого отношения к моей программе в целом. Я сделал свой выбор дизайна и не собираюсь возвращаться. Мой вопрос прост по структуре; Я не прошу руководство программиста.   -  person Emir    schedule 13.07.2011
comment
1) убедитесь, что мануал лучше в большинстве случаев, так как неправильные привычки, используемые большинством гуру программистов :-) 2) пожалуйста, о чем вы говорили, см. мой пост, я бы не использовал ни `paintComponent(), ни ваш исходный вопрос уже отпал?   -  person mKorbel    schedule 13.07.2011
comment
@mKorbel: Не получилось, друг мой, не играй словами. Мой первоначальный вопрос говорит о том, что рисование графики на JPanel, и если вы пойдете дальше и прочитаете описание, любой человек с Земли сможет понять, что графика относится к java.awt.Graphics. Даже если вы не использовали paintComponent() в своем посте, целью которого было высмеять меня, вы не написали ни строчки о графике. Убеждены, что вы должны слушать, что говорят люди, прежде чем отвечать им?   -  person Emir    schedule 13.07.2011


Ответы (4)


Самый простой способ — создать собственный значок Объект, который отвечает за вашу картину. Затем вы можете добавить значок на панель с помощью JLabel (или поместить его на кнопку или любой другой компонент, который принимает значки), абстрагируя работу по рисованию.

person Reverend Gonzo    schedule 13.07.2011
comment
+1 для implements Icon, для пример. - person trashgod; 13.07.2011
comment
Но я хочу рисовать графику. Например, g.drawLine и т. д. Смогу ли я сделать это в классе значков? - person Emir; 13.07.2011
comment
@Emir, вы можете создать BufferedImage, получить его объект Graphics, выполнить там свои задачи по рисованию, а затем установить BufferedImage в качестве значка JLabel. - person mre; 13.07.2011
comment
@little bunny foo foo, Звучит неплохо. Смогу ли я изменить координаты иконки? - person Emir; 13.07.2011
comment
@Emir: Если вы посмотрите на пример, вы увидите, что координаты и графический контекст передаются в paintIcon(). - person trashgod; 13.07.2011

Вы можете взглянуть на изображение и API буферизованного изображения. Вы можете генерировать и обрабатывать буферизованные изображения многими способами, отличными от компонента рисования и графики g. Я думаю, если вы сгенерируете буферизованные изображения, а затем загрузите их на JPanel, вы сможете получить аналогичный эффект. Вы можете использовать метод setRGB, чтобы нарисовать то, что хотите. Это не так универсально, как метод рисования, но это альтернатива.

person Eternal_Light    schedule 13.07.2011
comment
BufferedImage не имеет метода рисования. Можете быть более конкретными? - person Emir; 13.07.2011
comment
У него есть функция setRGB, хотя она довольно полезна. Просто не так просто сделать это в соответствии с вашими потребностями, как метод рисования. Вам, скорее всего, придется работать попиксельно. Я добавил это в свой основной пост. - person Eternal_Light; 13.07.2011

Идея заключалась бы в том, чтобы поместить каждую пользовательскую картину в отдельную JPanel, а затем добавить это.

public class MyFrame extends JFrame {
    //initialize frame...
    //put your components

    //now put your jpanel
    MyPanel custom = new MyPanel();
    custom.setBounds(10, 10, 100, 100);

    this.add(custom);
}

public class MyPanel extends JPanel {
    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        //draw your stuff...
    }
}

Конечно, это сделало бы его намного менее динамичным...

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

Говоря о разделении, если вы хотите разделить свой экран, например. две части: одна для пользовательской окраски и одна для компонентов, например для игры, тогда это решение должно соответствовать вашим потребностям...

person Tom S.    schedule 14.07.2011
comment
Спасибо за ответ. Но зачем мне это делать? Я мог бы сделать все это в одном классе. Что еще более важно, здесь по-прежнему используется метод paintComponent. Спасибо за попытку. - person Emir; 14.07.2011

person    schedule
comment
1) это ваш заголовок и код, который вы разместили здесь, 2) для других рисунков требуется использование JLabel (как упоминалось здесь), 3) вы не сказали нам, что именно вы действительно хотели нарисовать, тогда какой-то ответ выглядит так ( для вас) как кадры в темноте... потому что вы можете рисовать на изображении или значке и помещать его в JLabel или... или... 4) если вы хотите использовать java.awt.Graphics, то посмотрите здесь java2s.com/Code/Java/2D-Graphics-GUI/Catalog2D -Graphics-GUI.htm - person mKorbel; 14.07.2011