2012-02-08 2 views
1

도움이 필요하십니까? 탭이 포함되도록 JFrame을 만들려고하는데 각 탭마다 하나의 패널이 표시됩니다. 각 패널에는 버튼이 포함되어 있으며 Textfields입니다. 패널은 각 탭에 별도의 클래스를 표시해야하지만 패널은 버튼 및 Textfields없이 표시됩니다. 어떤 도움을 주시면 감사하겠습니다.각 탭을 별도 클래스로 사용하여 JFrame 내의 탭에 JPanels 및 해당 구성 요소 표시

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 
import javax.swing.JFrame; 

public class CELTool extends JFrame implements ActionListener { 

    JTabbedPane tab; 

    public CELTool() { 
     JFrame frame = new JFrame("CELTool"); 
     tab = new JTabbedPane(); 
     frame.add(tab, BorderLayout.CENTER); 

     Illustration etool = new Illustration(); 
     tab.add("Illustration", etool); 

     Encrypt crypt = new Encrypt(); 
     tab.add("Crypt", crypt); 

     Decrypt decrypt = new Decrypt(); 

     tab.add("Decrypt", decrypt); 

     frame.setSize(500, 750); 
     frame.pack(); 
     frame.setVisible(true); 
     frame.setDefaultCloseOperation(EXIT_ON_CLOSE); 

    } 

    public void actionPerformed(ActionEvent ae) { 
    } 

    public static void main(String[] args) { 
     CELTool clt = new CELTool();//   
     clt.setSize(400,500);  
     clt.setVisible(true); 
    } 
} 

class Illustration extends JPanel { 

    static String[] strPlaintext = {"Original Input", "InitialPermutation", "First RIound ", "Second Round", 
            "Third Round", "Fourth Round", "Fifth Round", "Sixth Round", "Seventh Round", 
            "Eight Round", "Ninth Round", "Tenth Round", "Eleventh Round", "Twelveth Round", 
            "Thirteenth Round", "Fourtheenth Round", "Fithteenth Round", "Sixtheenth Round", 
            "Final Round", "Ciphertext"}; 
    static String[] str2 = {"Key", "Round Sixteen", "Round Fithteen", "Round Fourteen", "Round Thirteen", "Round Twelve", 
          "Round Eleven", "Round Ten",}; 
    int leading, ascent, height, width; 
    int leading2, ascent2, height2, width2; 
    int xcoord = 40, ycoord = 100, xcoord2 = 600, ycoord2 = 60; 
    static final int BORDER = 5; 

    public void paint(Graphics gr) { 
     super.paint(gr); 
     int i = 0, xcoord = 40, ycoord = 100, xcoord2 = 600, ycoord2 = 60; 


     leading = gr.getFontMetrics().getLeading(); 
     ascent = gr.getFontMetrics().getAscent(); 
     height = gr.getFontMetrics().getHeight(); 
     width = gr.getFontMetrics().stringWidth(strPlaintext[i]); 

     for (i = 0; i < strPlaintext.length; i++) { 
     gr.drawString(strPlaintext[i], xcoord, ycoord); 
     leading = gr.getFontMetrics().getLeading(); 
     ascent = gr.getFontMetrics().getAscent(); 
     height = gr.getFontMetrics().getHeight(); 
     width = gr.getFontMetrics().stringWidth(strPlaintext[i]); 
     gr.drawRect(xcoord - BORDER, ycoord - (ascent + leading + BORDER), width + 2 * BORDER, height + 2 * BORDER); 
     ycoord += 40; 

     } 

    } 
} 

class Encrypt extends JPanel { 

    public Encrypt() { 
     JPanel panel5 = new JPanel(); 
     panel5.setLayout(new GridBagLayout()); //panel5.setLayout((LayoutManager) new GridBagConstraints()); 

     GridBagConstraints gbc = new GridBagConstraints(); 
     gbc.gridx = 0; 
     gbc.gridy = 0; 
     panel5.add(new JLabel("Input plaintext text"), gbc); 

     gbc.gridx = 1; 
     gbc.gridy = 0; 
     panel5.add(new JTextField("ABCDEF", 20), gbc); 

     gbc.gridx = 0; 
     gbc.gridy = 2; 
     panel5.add(new JLabel("Input text in Hex"), gbc); 

     gbc.gridx = 1; 
     gbc.gridy = 2; 
     panel5.add(new JTextField("ABCDEF", 20), gbc); 

     panel5.setSize(200, 300); 
     panel5.setVisible(true); 
    } 
} 

class Decrypt extends JPanel { 

    JPanel decPanel; 
    JTextField dectxt; 

    public Decrypt() { 
     decPanel = new JPanel(); 
     decPanel.add(new JLabel("Cipher")); 
     decPanel.add(new JTextField()); 
     decPanel.add(new JLabel("key")); 
     decPanel.add(new JTextField()); 
     decPanel.add(new JLabel("Plaintext")); 
     decPanel.add(new JTextField()); 
     decPanel.add(new JButton("Decrypt")); 
     decPanel.add(new JButton("Reset")); 
     decPanel.validate(); 

    } 
} 
+0

왜 두 개의 'JFrames'가 있습니까? 당신은 이미 그것을 확장하고 있습니다. – rtheunissen

+1

몇 가지 : 1) 거의 항상 'paint'가 아니라 Swing을 사용하여'paintComponent'를 오버라이드합니다. 2) 루프의 상수, 높이 및 높이에 대해 상수 값을 다시 할당합니다. 3) 컴포넌트를 확장하고 있지만,'this'를 사용하는 대신 새로운 컴포넌트를 생성하고이를 추가하는 대신 보이도록 설정합니다. 나는 대답을 게시 할 것이다. – rtheunissen

답변

1

이것은 완전한 수정이 아니지만 최소한 올바른 방향으로 나아갈 수있는 방법입니다. 코드를 신중하게 비교하여 차이점을 확인하십시오. 희망이 도움이됩니다.

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 
import javax.swing.JFrame; 

public class CELTool extends JFrame implements ActionListener { 

    JTabbedPane tab; 
    Illustration etool; 
    Encrypt encrypt; 
    Decrypt decrypt; 

    private CELTool() { 
     super("CELTool"); 

     tab = new JTabbedPane(); 
     etool = new Illustration(); 
     encrypt = new Encrypt(); 
     decrypt = new Decrypt(); 

     tab.add("Illustration", etool); 
     tab.add("Crypt", encrypt); 
     tab.add("Decrypt", decrypt); 
     this.add(tab, BorderLayout.CENTER); 

     this.setDefaultCloseOperation(EXIT_ON_CLOSE); 
     this.setSize(500, 750); 
     this.pack(); 
     this.setLocationRelativeTo(null); 
     this.setVisible(true); 
    } 

    public void actionPerformed(ActionEvent ae) { 
     // why blank? 
    } 

    public static void main(String[] args) { 
     new CELTool();  
    } 


private class Illustration extends JPanel { 

    public Illustration(){ 

    } 

    private final String[] strPlaintext = {"Original Input", "InitialPermutation", "First RIound ", "Second Round", 
            "Third Round", "Fourth Round", "Fifth Round", "Sixth Round", "Seventh Round", 
            "Eight Round", "Ninth Round", "Tenth Round", "Eleventh Round", "Twelveth Round", 
            "Thirteenth Round", "Fourtheenth Round", "Fithteenth Round", "Sixtheenth Round", 
            "Final Round", "Ciphertext"}; 
    private final String[] str2 = {"Key", "Round Sixteen", "Round Fithteen", "Round Fourteen", "Round Thirteen", "Round Twelve", 
          "Round Eleven", "Round Ten",}; 
    int leading, ascent, height, width; 
    int xcoord = 40, ycoord = 100, xcoord2 = 600, ycoord2 = 60; 
    private final int BORDER = 5; 

    public void paintComponent(Graphics gr) { 
     super.paintComponent(gr); 
     int i = 0, xcoord = 40, ycoord = 100, xcoord2 = 600, ycoord2 = 60; 

     leading = gr.getFontMetrics().getLeading(); 
     ascent = gr.getFontMetrics().getAscent(); 
     height = gr.getFontMetrics().getHeight(); 

     for (i = 0; i < strPlaintext.length; i++) { 
     gr.drawString(strPlaintext[i], xcoord, ycoord); 
     width = gr.getFontMetrics().stringWidth(strPlaintext[i]); 
     gr.drawRect(xcoord - BORDER, ycoord - (ascent + leading + BORDER), width + 2 * BORDER, height + 2 * BORDER); 
     ycoord += 40; 
     } 
    } 
} 

private class Encrypt extends JPanel { 

    public Encrypt() { 
     this.setLayout(new GridBagLayout()); 
     GridBagConstraints gbc = new GridBagConstraints(); 
     gbc.gridx = 0; 
     gbc.gridy = 0; 
     this.add(new JLabel("Input plaintext text"), gbc); 

     gbc.gridx = 1; 
     gbc.gridy = 0; 
     this.add(new JTextField("ABCDEF", 20), gbc); 

     gbc.gridx = 0; 
     gbc.gridy = 2; 
     this.add(new JLabel("Input text in Hex"), gbc); 

     gbc.gridx = 1; 
     gbc.gridy = 2; 
     this.add(new JTextField("ABCDEF", 20), gbc); 

     this.setPreferredSize(new Dimension(200, 300)); 
    } 
} 

private class Decrypt extends JPanel { 

    public Decrypt() { 
     this.setLayout(new GridLayout(0,1)); 
     this.add(new JLabel("Cipher")); 
     this.add(new JTextField()); 
     this.add(new JLabel("key")); 
     this.add(new JTextField()); 
     this.add(new JLabel("Plaintext")); 
     this.add(new JTextField()); 
     this.add(new JButton("Decrypt")); 
     this.add(new JButton("Reset")); 
     this.validate(); 
    } 
} 
} 
+0

감사합니다 편집증 - 안드로이드 작동합니다. 감사합니다. 나는 내가 만든 클래스의 인스턴스를 사용할 수 있는지 JFrame에서 확장 된 이유는 내가 새로운 자바입니다. 그 JFrame을 제거하고 JFrame을 재정의하지 않고 어떻게 관리 할 수 ​​있는지 보도록하겠습니다. 대부분의 자바 예제 코드에서는 항상 java.awt와 javax.swing을 읽었으므로 왜 그런지는 모르겠다. 비록 내가 paintComponent를 사용하거나 그냥 페인트하면 어떤 차이를 만들지는 않느냐? – Iyemwen

+0

1) 예를 들어'JFrame'을 확장한다면 그 클래스는'JFrame'이므로'new JFrame()'처럼 취급 할 수 있습니다. AWT와 Swing은 매우 다르므로 차이점을 배우거나 함께 섞어서 사용하지 않는 것이 좋습니다. 2) 튜토리얼을 읽는 것이 훨씬 더 나은 이해를 줄 것이라고 생각합니다. Java 자습서 : http://goo.gl/1zkR9 – rtheunissen