Рисование JPanel и добавление JPanel в JFrame - PullRequest
2 голосов
/ 22 августа 2009

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

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

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

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

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

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

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 не отображается ...

Простите, если вопрос глупый .. я новичок ..

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

Ответы [ 3 ]

2 голосов
/ 22 августа 2009

Поведение вашего кода непредсказуемо, поскольку вы нарушаете основное правило разработки Swing: вся работа с пользовательским интерфейсом должна выполняться в потоке диспетчеризации событий (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 голос
/ 22 августа 2009

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

obj.add(pane); 

вам нужно

obj.getContentPane().add(pane); 
0 голосов
/ 22 августа 2009

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

Посмотрите их демонстрации и примеры кода.

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

...