2013-09-07 1 views
2

누구도 도와 줄 수 있습니까? 아래의 코드를 실행할 때마다 항상 빈 프레임이 반환됩니다. 어디에서 잘못했는지는 알 수 없습니다. 이 디버깅을 도와 줄 수 있습니까? 이미 패널에 구성 요소를 추가하고 프레임에 패널을 추가했지만 여전히 빈 출력을 반환합니다. 이 필요한 것입니다 동안 enter image description here빈 JFrame 및 JPanel이 표시되지 않았지만 이미 추가되었습니다.

: 여기

는 내가 갖는 출력입니다.

Desired output

import javax.swing.JFrame; 
    import javax.swing.JPanel; 
    import javax.swing.JTextField; 
    import javax.swing.JLabel; 
    import javax.swing.JButton; 
    import javax.swing.ButtonGroup; 
    import javax.swing.BorderFactory; 
    import javax.swing.UIManager; 
    import javax.swing.BoxLayout; 
    import java.awt.GridLayout; 
    import java.awt.EventQueue; 
    import java.awt.event.ActionListener; 
    import java.awt.event.ActionEvent; 
    import java.awt.BorderLayout; 
    import java.awt.Color; 
    import javax.swing.JRadioButton; 
    /** 
    * 
    * @author Chareux 
    */ 

    //Declaring Variables 



    public class TestUI { 

     private JFrame frm_main; 
     private JPanel sr_pnl; 
     private JLabel sr_lbl; 
     private JLabel sr_lbl2; 
     private JLabel ret_optn_lbl; 
     private JLabel ret_rsn_lbl; 
     private ButtonGroup ret_ops; 
     private JTextField sr_txtnum; 
     private JTextField sr_ret_txtrsn; 
     private JButton sr_start; 
     private JRadioButton ret_optn_rdbn_y; 
     private JRadioButton ret_optn_rdbn_n; 


     public TestUI(){ 
      start(); 
     } 

     public void start(){ 

//Creating the JFrame 
      frm_main = new JFrame("Service Desk SR Tool"); 
      frm_main.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      frm_main.setSize(500,450); 
      frm_main.setLocationRelativeTo(null); 
      frm_main.setResizable(false); 
      frm_main.setVisible(true); 

      // the Panel 
      sr_pnl = new JPanel(); 

      //Components 
      sr_lbl = new JLabel("SERVICE DESK SR TIMER!"); 
      sr_lbl2 = new JLabel("SR number: "); 
      sr_txtnum = new JTextField("Enter SR number here..",20); 
      ret_optn_lbl = new JLabel("Returning Ticket?"); 
      ret_optn_rdbn_y = new JRadioButton("Yes"); 
      ret_optn_rdbn_n = new JRadioButton("No"); 
      ret_rsn_lbl = new JLabel("Reason: "); 
      sr_ret_txtrsn = new JTextField("Enter Reason number here..",20); 
      sr_start = new JButton("START!"); 

      //adding the Components to the panel 
      sr_pnl.add(sr_lbl); 
      sr_pnl.add(sr_lbl2); 
      sr_pnl.add(sr_txtnum); 
      sr_pnl.add(ret_optn_lbl); 
      sr_pnl.add(ret_optn_rdbn_y); 
      sr_pnl.add(ret_optn_rdbn_n); 
      sr_pnl.add(ret_rsn_lbl); 
      sr_pnl.add(sr_ret_txtrsn); 
      sr_pnl.add(sr_start); 



      frm_main.add(sr_pnl,BorderLayout.CENTER); 

      //ButtonGroup for the radio button 
      ret_ops = new ButtonGroup(); 
      ret_ops.add(ret_optn_rdbn_y); 
      ret_ops.add(ret_optn_rdbn_n); 
     } 

     public static void main(String[] args) { 

     new TestUI(); 

     } 
    } 
+1

,'ret_ops.add (ret_optn_rdbn_n)'이후,'. ** 모든 구성 요소를 추가 한 후에 항상 프레임을 ** 표시로 설정해야합니다. – BackSlash

+0

또는'frm_main.validate() 및 frm_main.repaint()'를'start()'메소드의 마지막 행으로 작성하십시오. 컨테이너에 컴포넌트를 추가 한 다음 컨테이너의 visible 속성을 true로 설정하는 것이 가장 좋습니다 :-) –

+0

해당 GUI에서 'Reason :'레이블과 'Reason number here'텍스트 필드 입력 끝 다른 줄에. 나는 그것이 의도하지 않은 걸릴까요? 이 코드에는 많은 문제점이 있습니다. 최상의 도움을 얻으려면 의도 한 레이아웃의 ASCII 아트 (또는 그림)를 게시하십시오. –

답변

3

의 말에 frm_main.validate()를 추가합니다. 소스의 주석에있는 추가 팁을 참조하십시오.

import java.awt.*; 
import javax.swing.*; 
import javax.swing.border.EmptyBorder; 

public class SRTool { 

    public static void main(String[] args) { 
     Runnable r = new Runnable() { 

      @Override 
      public void run() { 
       // the GUI as seen by the user (without frame) 
       JPanel gui = new JPanel(new GridLayout(0,1,6,6)); 
       gui.setBorder(new EmptyBorder(2, 3, 2, 3)); 

       // show the BG 
       gui.setBackground(Color.CYAN); 
       // center the label text 
       gui.add(new JLabel(
         "Service Desk SR Tool", SwingConstants.CENTER)); 
       // create a lyout that can center multiple components 
       FlowLayout layout = new FlowLayout(FlowLayout.CENTER,5,5); 
       JPanel srPanel = new JPanel(layout); 
       gui.add(srPanel); 
       srPanel.add(new JLabel("SR:")); 
       srPanel.add(new JTextField(8)); 

       JPanel returnTicketPanel = new JPanel(layout); 
       gui.add(returnTicketPanel); 
       returnTicketPanel.add(new JLabel("Returning Ticket?")); 
       returnTicketPanel.add(new JCheckBox()); 

       JPanel reasonPanel = new JPanel(layout); 
       gui.add(reasonPanel); 
       reasonPanel.add(new JLabel("Reason:")); 
       reasonPanel.add(new JTextField(14)); 

       JPanel buttonPanel = new JPanel(layout); 
       gui.add(buttonPanel); 
       buttonPanel.add(new JButton("Start!")); 

       JFrame f = new JFrame("Demo"); 
       f.add(gui); 
       // Ensures JVM closes after frame(s) closed and 
       // all non-daemon threads are finished 
       f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
       // See https://stackoverflow.com/a/7143398/418556 for demo. 
       f.setLocationByPlatform(true); 

       // ensures the frame is the minimum size it needs to be 
       // in order display the components within it 
       f.pack(); 
       // should be done last, to avoid flickering, moving, 
       // resizing artifacts. 
       f.setVisible(true); 
      } 
     }; 
     // Swing GUIs should be created and updated on the EDT 
     // http://docs.oracle.com/javase/tutorial/uiswing/concurrency/initial.html 
     SwingUtilities.invokeLater(r); 
    } 
} 

자바 GUI를

SRTool

다른 PLAFs를 사용하여 다른 화면 해상도 &에, 다수의 플랫폼에서 작동 할 수도 있습니다. 따라서 구성 요소의 정확한 배치에 도움이되지 않습니다. 견고한 GUI를 위해 구성 요소를 구성하려면 레이아웃 관리자를 사용하거나 , 레이아웃 패딩 & 테두리를 white space 과 함께 사용하십시오.

    1. 이동`(참) frm_main.setVisible

    +1

    대단히 감사합니다!,이 하나가 나를 도왔습니다. –

    +0

    다행 이군요. :) –

    1

    내가이 작업의 중첩 또는 복합 레이아웃을 사용하는 것이 좋습니다 것 start()

    public void start(){ 
    
        /* 
        ... 
        Same As Above 
        ... 
        */ 
    
         frm_main.add(sr_pnl,BorderLayout.CENTER); 
    
         //ButtonGroup for the radio button 
         ret_ops = new ButtonGroup(); 
         ret_ops.add(ret_optn_rdbn_y); 
         ret_ops.add(ret_optn_rdbn_n); 
    
         frm_main.validate(); // Add this line ****** 
        } 
    
    +0

    고마워요, 오, 그리고 btw, 어떻게 않습니다. 팩(); 해야 할 것? –

    +0

    [Window.pack()] (http://docs.oracle.com/javase/7/docs/api/java/awt/Window.html#pack()) – TheKojuEffect

    +0

    에 대한이 설명서를 참조하십시오. 계획대로 가겠습니까? .setSize(); ? –

    관련 문제