2010-06-15 1 views
1

Я добавил JPanel в свой графический интерфейс с NetBeans и добавлю JPanel BoxThing, который переопределяет paintComponent и рисует небольшой красный квадрат, но он не отображается, но paintComponent никогда не вызывает. Если я создам собственный JFrame и поставлю JPanel, содержащий BoxThing, он отлично работает.Переопределить paintComponent в Netbeans GUI

Я видел этот вопрос, заданный еще несколько раз на случайных форумах, и люди не отвечают на вопрос, вместо этого они указывают на custom painting tutorial, что явно не помогает.

Сначала я попытался с Netbeans 5.5, а затем переключился на Netbeans 6.8, ту же проблему.

Main.java

package MadProGUI9000; 

public class Main extends javax.swing.JFrame { 

    /** Creates new form Main */ 
    public Main() { 
     initComponents(); 
     panel.add(new BoxThing()); 
    } 

    /** 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() { 

     panel = new javax.swing.JPanel(); 

     setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); 

     panel.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(0, 0, 0))); 

     javax.swing.GroupLayout panelLayout = new javax.swing.GroupLayout(panel); 
     panel.setLayout(panelLayout); 
     panelLayout.setHorizontalGroup(
      panelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
      .addGap(0, 260, Short.MAX_VALUE) 
     ); 
     panelLayout.setVerticalGroup(
      panelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
      .addGap(0, 185, 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() 
       .addGap(69, 69, 69) 
       .addComponent(panel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) 
       .addContainerGap(69, Short.MAX_VALUE)) 
     ); 
     layout.setVerticalGroup(
      layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
      .addGroup(layout.createSequentialGroup() 
       .addGap(45, 45, 45) 
       .addComponent(panel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) 
       .addContainerGap(68, Short.MAX_VALUE)) 
     ); 

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

    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String args[]) { 
     java.awt.EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       new Main().setVisible(true); 
      } 
     }); 
    } 

    // Variables declaration - do not modify 
    private javax.swing.JPanel panel; 
    // End of variables declaration 

} 

BoxThing.java

package MadProGUI9000; 

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 

/** 
* A component with a red box in the center. 
*/ 
public class BoxThing extends JPanel { 

    @Override 
    public void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     Graphics2D g2 = (Graphics2D) g; 
     Dimension size = getSize(); 

     int rX = (size.width - 5)/2; 
     int rY = (size.height - 5)/2; 

     g.setColor(Color.RED); 
     g2.fillRect(rX, rY, 5, 5); 
    } 

    public static void main(String args[]) { 
     java.awt.EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       JFrame frame = new JFrame("BoxThing demo"); 
       JPanel panel = new JPanel(); 
       frame.add(panel); 
       panel.add(new BoxThing()); 
       frame.setVisible(true); 
       panel.setPreferredSize(new Dimension(100, 100)); 
       frame.pack(); 
      } 
     }); 
    } 

} 

Как вы можете видеть, это работает, если вы просто запустите «ы mainBoxThing.java. Если вы запустите GUI Netbeans, это не сработает. Итак, как добавить пользовательские компоненты в созданный Netbeans Swing GUI?

+0

Вы пытались использовать FlowLayout в версии, созданной в NetBeans? –

+0

@mmyers: Я изменил макет панели на FlowLayout и исправил ее, оказалось, что раньше она использовала GroupLayout, я думаю, это объясняет это. –

+0

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

ответ

1

Именно так работает групповой макет. Он делит экранную недвижимость на Groups. Во время компоновки он циклически проходит через группы, чтобы определить границы для каждого компонента. Когда вы добавили свою панель в контейнер, она не была добавлена ​​в какую-либо группу и поэтому никогда не давалась размер или местоположение. В результате он имеет размер (0,0) и никогда не окрашивается.

Вы можете сделать это, установив размер, но поскольку он не рассматривается в макете, он, скорее всего, перекрыт с другими компонентами.

Чтобы выполнить то, что вы хотите, вам нужно установить макет panel на что-то еще, например BorderLayout. Например:

public Main() { 
    initComponents(); 
    panel.setLayout(new BorderLayout()); 
    panel.add(new BoxThing(), Borderlayout.CENTER); 
} 

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

  • Нет связанных вопросов^_^