【问题标题】:Displaying JPanels plus its components in a tab within a JFrame using each tab as a seperate class使用每个选项卡作为单独的类在 JFrame 内的选项卡中显示 JPanel 及其组件
【发布时间】:2012-02-08 00:52:13
【问题描述】:

我需要一些帮助。我正在尝试创建一个 JFrame 来包含选项卡,并且每个选项卡都将显示一个面板。每个面板都包含按钮和Textfields。面板应该在每个选项卡上显示一个单独的类,但面板显示时没有按钮和Textfields。任何帮助将不胜感激。

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("0123456789ABCDEF", 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("0123456789ABCDEF", 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();

   }
}

【问题讨论】:

  • 为什么有两个JFrames?你已经在扩展它了。
  • 几件事:1) 几乎总是使用 Swing 覆盖 paintComponent,而不是 paint。 2) 您正在循环中重新分配常量值(用于文本的前导、上升和高度)。 3) 您正在扩展组件,但不是使用this,而是创建新组件并将它们设置为可见而不是添加它们。我会发布一个答案。

标签: java swing jframe jpanel jtabbedpane


【解决方案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("0123456789ABCDEF", 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("0123456789ABCDEF", 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();
   }
 }
}

【讨论】:

  • 感谢 paranoid-android 它有效。谢谢。我是java新手,这就是为什么我不确定我是否可以使用我创建并从JFrame扩展的类的实例。我将尝试删除该 JFrame,看看如何在不重新定义 JFrame 的情况下管理它。在我读过的大多数 java 示例代码中,总是有 java.awt 和 javax.swing,所以我不知道为什么虽然我读过它们是不同的。如果我使用paintComponent 或只是绘制它有什么不同吗?跨度>
  • 1) 例如,如果您要扩展JFrame,那么该类就是JFrame,因此您可以像对待任何new JFrame() 一样对待它。 AWT 和 Swing 非常不同,可能需要一些时间来了解差异以及何时不将它们混合在一起。 2)我认为阅读本教程会让您更好地理解。 Java 教程:goo.gl/1zkR9
猜你喜欢
  • 2018-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-02
  • 2014-01-27
  • 2018-12-02
  • 1970-01-01
相关资源
最近更新 更多