2009-08-22 4 views
2

Мне нужно нарисовать график над JPanel, переопределив метод paintComponent() JPanel.Рисование над JPanel и добавление JPanel к JFrame

При проектировании gui с использованием netbeans, когда я перетаскиваю JPanel над JFrame, он генерирует код, создавая приватную переменную, объект JPanel. В таком случае, как я могу переопределить его метод, чтобы нарисовать его ...

или если я пишу код для класса, расширив JPanel и переопределив метод его рисования, мне нужно создать новый JFrame и добавьте JPanel к нему.

JFrame fr = new JFrame(); fr.add (панель); // панель - это объект класса, который расширяет JPanel, где я рисую fr.setVisible (true);

В этом случае он работает ..

Но если я получить ссылку на авто созданного класса, который расширяет JFrame с помощью NetBeans и использовать, чтобы добавить JPanel с помощью метода добавления в ссылке получил Безразлично» т работа ...

class x extends JPanel 
{ 
     paintComponent(Graphics g){   //overridden method 

      //my code for drawing say lines goes here.. 
      } 
} 

class y extends Thread 
{ 
     z obj; 

     y(z obj){ 

      this.obj=obj; 
      } 
     public void run(){ 

       x pane=new x(); 
       pane.setVisible(true); 
       obj.add(pane); 
       obj.setVisible(true);   //im not getting the pane visible here.. if i created a new JFrame class here as i said earlier and added the pane to it i can see it.. 
      } 
} 

class z extends JFrame 
{ 
      z(){//code generated by netbeans} 

      public static void main(String args[]) 
      { 


        new y(new z()).start(); 
      } 
} 

Он не показывает ошибки, но когда я запустить программу только JFrame видна .. JPanel не показан ...

пардон, если вопрос глупый .. им начинающий ..

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

ответ

2

Поведения вашего кода непредсказуемо, потому что вы нарушаете основное правило развития свинга: всех работы интерфейса должны быть сделаны на событие диспетчерского Thread (EDT). Ваш код должен выглядеть примерно так:

public static void main(String args[]) { 
    SwingUtilities.invokeLater(new Runnable() { 
     void run() 
     { 
      JFrame z = new JFrame(); 
      z.add(new X()); // works only in java 6 
      //z.getContentPane().add(new X()); // works in any version of java 
      z.pack(); // assuming your pane has preferred size 
      z.setVisible(true); 

     } 
    }); 
} 

Больше об этой теме здесь: http://java.sun.com/products/jfc/tsc/articles/threads/threads1.html

1

Ваш код в значительной степени запутан. Во всяком случае, вместо

obj.add(pane); 

вам нужно

obj.getContentPane().add(pane); 
-1

Это звучит, как вы новичок, используя Swing. Тем не менее, использование библиотеки JXLayer делает работу над компонентами чрезвычайно простой и интуитивно понятной.

Ознакомьтесь с их демонстрационными примерами и образцом кода.

В противном случае отличный JFreeChart - отличная библиотека графического отображения (и визуализации) Java

Смежные вопросы