2010-06-15 5 views
1

Netbeans에서 생성 한 GUI에 JPanel을 추가하고 paintComponent을 덮어 쓰는 JPanel BoxThing을 추가하고 작은 빨간색 상자를 표시하지만 표시되지 않습니다. paintComponent도 호출되지 않습니다. 내 자신의 JFrame을 인스턴스화하고 BoxThing을 포함하는 JPanel을 넣으면 잘 동작합니다.Netbeans GUI에서 paintComponent를 덮어 씁니다.

저는이 질문을 무작위 포럼에서 몇 번 물었습니다. 사람들은 질문에 답하지 않고 대신 custom painting tutorial을 지적합니다. 분명히 도움이되지 않습니다.

Netbeans 5.5에서 먼저 시도한 다음 Netbeans 6.8에서 동일한 문제로 전환했습니다. 그냥 BoxThing.javamain을 실행하면 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(); 
      } 
     }); 
    } 

} 

당신이 볼 수 있듯이

, 그것은 작동합니다. Netbeans GUI를 실행하면 작동하지 않습니다. 그렇다면 Netbeans에서 생성 한 스윙 GUI에 어떻게 사용자 지정 구성 요소를 추가 할 수 있습니까?

+0

NetBeans 생성 버전에서 FlowLayout을 사용해 보셨습니까? –

+0

@mmyers :'panel'의 레이아웃을 FlowLayout으로 바꾸고 그것을 고치면 GroupLayout을 사용하기 시작했습니다. –

+0

이 머신에 Netbeans이 없거나 직접 시도 할 것입니다. 그것은 레이아웃 문제 였음에 틀림 없지만 왜 숨겨진 코드인지는 알 수 없습니다. –

답변

1

그런 식으로 그룹 레이아웃이 작동합니다. 화면 영역을 Groups으로 나눕니다. 레이아웃이 진행되는 동안 그룹을 순환하여 각 구성 요소의 경계를 결정합니다. 컨테이너에 패널을 추가 할 때 어떤 그룹에도 추가되지 않았으므로 크기 나 위치가 지정되지 않았습니다. 결과적으로 크기는 (0,0)이며 채색되지 않습니다.

크기를 설정하여 표시 할 수 있지만 레이아웃에서 고려되지 않았으므로 다른 구성 요소와 겹치기 쉽습니다.

원하는 것을 이루려면 panel의 레이아웃을 BorderLayout과 같은 다른 것으로 설정해야합니다. 예 :

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