2013-09-14 4 views
0

Я пытался добавить чертеж в существующую JPanel в JForm. Этот JForm создается в Netbeans (с опцией 'add jform'). В этой форме я разместил JPanel. В исходном коде я хочу изменить JPanel, поэтому появится чертеж. Я пытался, но это не будет работать ... Можно ли сделать это таким образом (если это правда, Ват я делаю не так?) ...Recreate a Jpanel

jPanel3 = new JPanel() { 
    @Override 
    public void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     Graphics2D g2 = (Graphics2D)g; 

     Line2D line = new Line2D.Double(10, 10, 120, 120); 
     g2.setColor(Color.blue); 
     g2.setStroke(new BasicStroke(10)); 
     g2.draw(line); 
    } 
}; 

С уважением, Joppe

(извините за мой плохой английский язык ... Я не говорю по-английски, как первый язык ...)

EDIT: некоторый код:

/* 
* To change this template, choose Tools | Templates 
* and open the template in the editor. 
*/ 
package javatest; 

import java.awt.BasicStroke; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.geom.Line2D; 
import javax.swing.JPanel; 

/** 
* 
* @author Joppe 
*/ 
public class JavaTest extends javax.swing.JFrame { 

/** 
* Creates new form JavaTest 
*/ 
public JavaTest() { 
    initComponents(); 
} 

/** 
* This method is called from within the constructor to initialize the form. 
* WARNING: Do NOT modify this code. The content of this method is always 
* regenerated by the Form Editor. 
*/ 
@SuppressWarnings("unchecked") 
// <editor-fold defaultstate="collapsed" desc="Generated Code">       
private void initComponents() { 

    jPanel3 = new javax.swing.JPanel(); 

    setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); 

    jPanel3.addContainerListener(new java.awt.event.ContainerAdapter() { 
     public void componentAdded(java.awt.event.ContainerEvent evt) { 
      jPanel3ComponentAdded(evt); 
     } 
    }); 

    javax.swing.GroupLayout jPanel3Layout = new javax.swing.GroupLayout(jPanel3); 
    jPanel3.setLayout(jPanel3Layout); 
    jPanel3Layout.setHorizontalGroup(
     jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
     .addGap(0, 380, Short.MAX_VALUE) 
    ); 
    jPanel3Layout.setVerticalGroup(
     jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
     .addGap(0, 278, Short.MAX_VALUE) 
    ); 

    javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); 
    getContentPane().setLayout(layout); 
    layout.setHorizontalGroup(
     layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
     .addGroup(layout.createSequentialGroup() 
      .addContainerGap() 
      .addComponent(jPanel3, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) 
      .addContainerGap()) 
    ); 
    layout.setVerticalGroup(
     layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
     .addGroup(layout.createSequentialGroup() 
      .addContainerGap() 
      .addComponent(jPanel3, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) 
      .addContainerGap()) 
    ); 

    pack(); 
}// </editor-fold>       

private void jPanel3ComponentAdded(java.awt.event.ContainerEvent evt) {          
    jPanel3 = new JPanel() { 
     @Override 
     public void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      Graphics2D g2 = (Graphics2D)g; 

      Line2D line = new Line2D.Double(10, 10, 120, 120); 
      g2.setColor(Color.blue); 
      g2.setStroke(new BasicStroke(10)); 
      g2.draw(line); 
     } 

     @Override 
     public Dimension getPreferredSize() { 
      return new Dimension(250,200); 
     } 
    }; 
}          

/** 
* @param args the command line arguments 
*/ 
public static void main(String args[]) { 
    /* Set the Nimbus look and feel */ 
    //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) "> 
    /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel. 
    * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
    */ 
    try { 
     for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) { 
      if ("Nimbus".equals(info.getName())) { 
       javax.swing.UIManager.setLookAndFeel(info.getClassName()); 
       break; 
      } 
     } 
    } catch (ClassNotFoundException ex) { 
     java.util.logging.Logger.getLogger(JavaTest.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
    } catch (InstantiationException ex) { 
     java.util.logging.Logger.getLogger(JavaTest.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
    } catch (IllegalAccessException ex) { 
     java.util.logging.Logger.getLogger(JavaTest.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
    } catch (javax.swing.UnsupportedLookAndFeelException ex) { 
     java.util.logging.Logger.getLogger(JavaTest.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
    } 
    //</editor-fold> 

    /* Create and display the form */ 
    java.awt.EventQueue.invokeLater(new Runnable() { 
     public void run() { 
      new JavaTest().setVisible(true); 
     } 
    }); 
} 
// Variables declaration - do not modify      
private javax.swing.JPanel jPanel3; 
// End of variables declaration     
} 
+0

Код выглядит нормально, * при условии правильности значений *. Что это не работает? ('paintComponent()' должно быть 'protected', но также обратите внимание, что drawLine(), как правило, лучше альтернативой рисованию общей« формы »). – kiheru

+0

В форме, кажется, там нет Jpanel ... – Jojojoppe

+0

1. Панель должна быть добавлена ​​в окно где-то * правильно *. 2. Его размер не должен быть 0 (см. Ответ @ camickr, это также зависит от менеджера компоновки, но правильный предпочтительный размер должен работать). – kiheru

ответ

2

Когда вы заказ картины вам lso необходимо переопределить getPreferredSize() панели для извлечения размера пользовательской картины, в противном случае размер считается равным (0, 0), поэтому рисовать нечего. Вы также должны отменить минимальные/максимальные размеры.

Для получения дополнительной информации и примеров ознакомьтесь с разделом из учебника Swing по телефону Custom Painting.

Если вам нужна дополнительная помощь, тогда разместите надлежащее SSCCE, что демонстрирует проблему.

Edit:

jPanel3 = new javax.swing.JPanel(); 

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

jPanel3.addContainerListener(new java.awt.event.ContainerAdapter() { 
    public void componentAdded(java.awt.event.ContainerEvent evt) { 
     jPanel3ComponentAdded(evt); 
    } 
}); 

Не знаете, в чем смысл этого кода. Событие должно быть запущено при добавлении компонента в jPanel3. Я не вижу:

jPanel3.add(....); 

в любом месте вашего кода, чтобы это событие никогда не запускалось. Если это событие срабатывает, выполняется следующий код:

jPanel3 = new JPanel() { 
    @Override 
    public void paintComponent(Graphics g) { 
     ... 

Ну, этот код ничего не делает. Все, что он делает, создает компонент и изменяет переменную jPanel3 для ссылки на этот компонент. Однако компонент НЕ добавляется в графический интерфейс в любом месте, поэтому вы никогда не увидите обычную роспись.

Ваша проблема с IDE. Моя рекомендация - забыть о среде IDE и узнать, как создать графический интерфейс вручную. Я уже дал вам ссылку на учебник Swing по теме «Custom Painting», который делает это. Лучше потратить время на изучение Java, а затем изучить IDE. Как только вы поймете, как работает Java, вы, вероятно, сможете лучше понять IDE.

В любом случае, я не могу посоветовать вам, как использовать IDE, потому что я никогда не использовал его.

+0

@Override public Dimension getPreferredSize() { return new Dimension (250,200); } Если я добавлю это к тэну JPanel {и т. Д.}, Он ничего не меняет. – Jojojoppe

+0

'он ничего не меняет'' - и, как я сказал, если вам нужна дополнительная помощь, вам нужно разместить надлежащий' SSCCE', потому что мы не являются читателями разума. Мы не знаем контекста того, как вы на самом деле используете код. У нас нет времени, чтобы сыграть 20 вопросов, угадывая, что вы на самом деле делаете. – camickr

+0

[link] (https://dl.dropboxusercontent.com/u/59298953/Afbeeldingen/StackOverflow/1.png) Это форма. (Я использовал его в rs232-терминале). Это «поле» ниже «read» - это jPanel3. (Я использую для отображения некоторых цифр). Если я добавлю код из моего startpost в компонентный метод, ничего не изменится в виде. Это выглядит так же ... вот в чем проблема. Надеюсь, это полезно? – Jojojoppe

0
private void jPanel3ComponentAdded(java.awt.event.ContainerEvent evt) {          
    jPanel3 = new JPanel() { 
    ... 

Изменение jPanel3 после того, как уже было добавлено не помогает - панель, которая была добавлена ​​в контейнер является нормальным JPanel, а не один с пользовательской картины. Для тривиального случая вы можете просто создать jPanel3 в области содержимого, но это не работает для более сложного макета, что, вероятно, будет иметь место при использовании построителя GUI.

Вместо:

  1. Выберите место, где вы хотите иметь собственный компонент. Для вашего образца это будет jPanel3.
  2. Установить менеджер компоновки jPanel3 к чему-то, что является более управляемым, чем GroupLayout при использовании вручную, например FlowLayout (вы все еще можете использовать GroupLayout, если вы настаиваете, но это немного complicated). Это можно сделать с помощью конструктора форм.
  3. В коде, добавить настраиваемую панель рисования для jPanel3:

    JPanel customPanel = new JPanel() { 
        @Override 
        protected void paintComponent(Graphics g) { 
         super.paintComponent(g); 
         ... 
        } 
    
        @Override 
        public Dimension getPreferredSize() { 
         return new Dimension(250,200); 
        } 
    }; 
    jPanel3.add(customPanel); 
    

Образец также нуждается в pack() вызов после того, потому что один в initComponents() делается перед добавлением пользовательских панелей.

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