2010-06-15 50 views
1

我已经为我的Netbeans生成的GUI添加了一个JPanel,并添加了一个覆盖paintComponent的JPanel BoxThing并绘制一个小红框,但它不显示,paintComponent甚至不会被调用。如果我实例化我自己的JFrame并将一个包含BoxThing的JPanel放入其中,它可以正常工作。在Netbeans GUI中覆盖paintComponent

我见过这个问题,在随机论坛上问了几个问题,人们不回答这个问题,而是指向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(); 
      } 
     }); 
    } 

} 

正如你所看到的,如果你只是运行BoxThing.javamain它的工作原理。如果你运行Netbeans GUI,它不会工作。那么,如何将自定义组件添加到Netbeans生成的Swing GUI?

+0

您是否尝试在NetBeans生成的版本中使用FlowLayout? – 2010-06-15 15:21:52

+0

@mmyers:我将'panel'的布局更改为FlowLayout,并修复了它,结果表明它之前使用了GroupLayout,我想这可以解释它。 – 2010-06-15 15:33:21

+0

我在这台机器上没有Netbeans,或者我自己尝试。它一定是一个布局问题,但我无法从代码中知道它为什么可能被隐藏起来。 – 2010-06-15 15:47:29

回答

1

这就是组布局的工作方式。它将屏幕房地产分成Groups。在布局过程中,它循环遍历组以确定每个组件的界限。当您将面板添加到容器时,它不会被添加到任何组中,因此从未给出过大小或位置。因此它的大小(0,0)并不会被绘制。

您可以通过设置尺寸来显示尺寸,但由于它在布局中未被考虑,所以很可能会与其他元件重叠。

要完成你想要的任务,你需要将panel的布局设置为其他内容,如BorderLayout。例如:

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