Рисование с помощью графики и виджетов в JApplet/Swing?

По сути, у меня есть JApplet, который пытается рисовать с помощью графики (например, g.drawOval(10,10,100,100), а также включает JCompotents (например, JButton). Что происходит, так это то, что перерисовка может стать действительно дурацкой.

Иногда графика будет отображаться поверх виджетов или наоборот. Это ненадежно и приводит к непредсказуемому поведению.

(Кнопка также всегда будет поверх этой графики)

Я играл с ним, пытаясь переопределить или вручную нарисовать компоненты, изменить порядок и т. Д., Но думаю, что здесь мне не хватает чего-то очень фундаментального. У кого-нибудь есть шаблон или правильный способ использования как g.drawXXX, так и JCompotents?


person user1516346    schedule 11.07.2012    source источник
comment
Вам нужно показать свой код, где вы рисуете, и любой другой соответствующий код. В противном случае мы понятия не имеем, что вы можете делать неправильно. Кроме того, никогда не рисуйте непосредственно в JApplet, а скорее в JPanel или в его ContentPane (который является JPanel). Обязательно нарисуйте метод paintComponent(...) этого JPanel.   -  person Hovercraft Full Of Eels    schedule 11.07.2012
comment
Проверьте обычные подозреваемые и сравните свой код с этим AnimationTest.   -  person trashgod    schedule 11.07.2012
comment
@user1516346: конечно, в сети и на этом сайте есть много примеров, некоторые я написал сам. Продолжай искать! И ваша проблема просто в том, что вы не следуете ни одному из моих предложений в моем первом посте. Вы по-прежнему рисуете прямо в апплете.   -  person Hovercraft Full Of Eels    schedule 11.07.2012
comment
Изображение объясняет это лучше: Хм.. Изображение обычно рисует тысячу слов, но это можно было бы суммировать, но рисунок появляется поверх компонентов.   -  person Andrew Thompson    schedule 11.07.2012
comment
@HovercraftFullOfEels, ссылка? Я искал часы, но, поскольку у вас есть много примеров, я был бы очень признателен! :)   -  person user1516346    schedule 11.07.2012
comment
Одна ссылка вот эта. Смотрите ответ ниже. Но что еще более важно, прочитайте учебные пособия по рисованию Oracle Swing. Там же это прописано.   -  person Hovercraft Full Of Eels    schedule 11.07.2012
comment
Я изменил его на это, но проблема осталась: getContentPane().getGraphics().drawImage(images[state], 300, 10, this);   -  person user1516346    schedule 11.07.2012
comment
НИКОГДА не используйте getGraphics() для компонента! Этот объект Graphics не будет сохраняться, и вы флиртуете с NullPointerException или хуже.   -  person Hovercraft Full Of Eels    schedule 11.07.2012


Ответы (1)


Опять же, просто следуйте тому, что я рекомендовал,

никогда не рисуйте непосредственно в JApplet, а скорее в JPanel или в его ContentPane (который является JPanel). Обязательно нарисуйте метод paintComponent(...) этого JPanel.

и это работает:

import java.awt.*;
import java.awt.event.*;
import java.lang.reflect.InvocationTargetException;

import javax.swing.*;

public class Test2 extends JApplet {


   public void init() {
      try {
         SwingUtilities.invokeAndWait(new Runnable() {
            public void run() {
               Test2BPanel panel = new Test2BPanel();
               setContentPane(panel);
            }
         });
      } catch (InvocationTargetException e) {
         e.printStackTrace();
      } catch (InterruptedException e) {
         e.printStackTrace();
      }

   }


}

class Test2BPanel extends JPanel {
   private String[] backgroundImageFileNames = { "test", "test", "test" };

   private JButton refreshButton;
   private JComboBox backgroundList;

   public Test2BPanel() {

      setBackground(Color.white);

      setLayout(new FlowLayout());

      refreshButton = new JButton("replant new forest");
      refreshButton.addActionListener(new ActionListener() {
         public void actionPerformed(ActionEvent e) {

         }

      });
      add(refreshButton);

      backgroundList = new JComboBox(backgroundImageFileNames);
      backgroundList.setSelectedIndex(2);
      add(backgroundList);
   }

   @Override
   protected void paintComponent(Graphics g) {
      super.paintComponent(g);
      paintIt(g);
   }

   public void paintIt(Graphics g) {
      for (int i = 0; i < 200; i++) {
         for (int j = 0; j < 200; j++) {
            g.setColor(Color.red);
            g.drawOval(10 * i, j, 10, 10);
         }
      }
   }
}

Кроме того, ознакомьтесь с учебными пособиями по рисованию Swing, включая основное руководство по рисованию. и Расширенное руководство по рисованию.

Для получения отличной книги об этом и многом другом, пожалуйста, ознакомьтесь с покупкой Filthy Rich Clients Чета Хааса и Ромена Гая. Вы не пожалеете о покупке! Это одна из лучших книг по Java, которые у меня есть.

person Hovercraft Full Of Eels    schedule 11.07.2012
comment
Пожалуйста. Пожалуйста, прочитайте учебники, на которые есть ссылки в нижней части моего ответа, чтобы узнать подробности. Тогда бегите, не ходите в книжный магазин, и купите Filthy Rich Clients от Haase and Guy, чтобы знать все, что вы нужно знать и многое другое! - person Hovercraft Full Of Eels; 11.07.2012