java - 我怎样才能将数据从一个 JPanel 传递到另一个...?

标签 java swing jframe jpanel

我有一个包含 3 个 JPanelsJFrame。我想将一个面板的 JTextField 值传递给其他面板。每个面板都使用 JTabbedPane 显示。当我访问其他文本字段的值时,我得到空值。我怎样才能访问?

最佳答案

您没有显示任何代码,因此不可能知道为什么会得到“空”值。如果您希望所有三个 JPanel 都包含具有相同内容的 JTextFields,则有两种可能的解决方案:

  • 将共享的 JTextField 放在 JTabbedPane 持有的 JPanel 之外,而是放在持有 JTabbedPane 的 JPanel 中,这样无论显示什么选项卡,该字段始终可见,或者
  • 使用多个 JTextField,但让它们共享同一个文档或“模型”。

例如,

import java.awt.Dimension;
import javax.swing.*;
import javax.swing.text.PlainDocument;

public class SharedField extends JTabbedPane {
   private static final int TAB_COUNT = 5;
   private static final int MY_WIDTH = 600;
   private static final int MY_HEIGHT = 300;
   PlainDocument doc = new PlainDocument();

   public SharedField() {
      for (int i = 0; i < TAB_COUNT; i++) {
         JTextField tField = new JTextField(10);
         tField.setDocument(doc);
         JPanel panel = new JPanel();
         panel.add(tField);
         add("Panel " + i, panel);

         // to demonstrate some of the JTextFields acting like 
         // a label
         if (i % 2 == 1) { // if i is odd
            tField.setEditable(false);
            tField.setBorder(null);
         }
      }
   }

   @Override
   public Dimension getPreferredSize() {
      return new Dimension(MY_WIDTH, MY_HEIGHT);
   }

   private static void createAndShowUI() {
      JFrame frame = new JFrame("SharedField");
      frame.getContentPane().add(new SharedField());
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.pack();
      frame.setLocationRelativeTo(null);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      java.awt.EventQueue.invokeLater(new Runnable() {
         public void run() {
            createAndShowUI();
         }
      });
   }
}

编辑 1
我看到你已经在 java-forums.org/ 上交叉发布了这个你在哪里显示你的一些代码:

pacage Demotool; Class:MainFrame This is the actionPerformed code of first panel both str and scrTxt is (public static)

   public void actionPerformed(ActionEvent e)
    {
        String act=e.getActionCommand();

        if(act.equals("ADD"))
        {
            str=scrnTxt.getText();
            System.out.println("Hi :"+str);
            Demotool.DemoTool.jtp.setSelectedIndex(1);   
        }
    }

using the belove code i tried to access the data but I am getting null String:

 System.out.println("Hello:"+Demotool.MainFrame.str);

问题:

  • 除非有充分的理由,否则不要使用静态变量或方法。在这里你没有。
  • 您可能试图在任何内容放入 MainFrame.str 变量之前访问它,使其为空,或者您正在第二个类中创建一个新的 MainFrame 对象,一个未显示,因此其 str 变量为空或 null 的人——很难说。

不管怎样,这个设计都不好。你最好向我们展示一个小的演示程序,用编译和运行的代码来展示你的问题,sscce ,这样我们就可以使用和修改您的代码,更好地向您展示一个不错的解决方案。

一个不错的解决方案是将 DocumentListener 添加到 JTextField 以便“推送”对 JTextField 保存的文本的更改进入正在监听变化的观察者(你的其他类)。

例如,使用 DocumentListeners:

import java.awt.Dimension;

import javax.swing.*;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.text.BadLocationException;

public class SharedField2 extends JTabbedPane {
   private static final int LABEL_PANEL_COUNT = 4;
   private static final int MY_WIDTH = 600;
   private static final int MY_HEIGHT = 300;

   public SharedField2() {
      TextFieldPanel tfPanel = new TextFieldPanel();
      LabelPanel[] labelPanels = new LabelPanel[LABEL_PANEL_COUNT];

      add("TextFieldPanel", tfPanel);
      for (int i = 0; i < labelPanels.length; i++) {
         labelPanels[i] = new LabelPanel();
         // add each label panel's listener to the text field
         tfPanel.addDocumentListenerToField(labelPanels[i].getDocumentListener());
         add("Label Panel " + i, labelPanels[i]);
      }
   }

   @Override
   public Dimension getPreferredSize() {
      return new Dimension(MY_WIDTH, MY_HEIGHT);
   }

   private static void createAndShowUI() {
      JFrame frame = new JFrame("SharedField2");
      frame.getContentPane().add(new SharedField2());
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.pack();
      frame.setLocationRelativeTo(null);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      java.awt.EventQueue.invokeLater(new Runnable() {
         public void run() {
            createAndShowUI();
         }
      });
   }
}

class TextFieldPanel extends JPanel {
   private JTextField tField = new JTextField(10);

   public TextFieldPanel() {
      add(tField);
   }

   public void addDocumentListenerToField(DocumentListener listener) {
      tField.getDocument().addDocumentListener(listener);
   }
}

class LabelPanel extends JPanel {
   private DocumentListener myListener;

   private JLabel label = new JLabel();

   public LabelPanel() {
      add(label);
      myListener = new DocumentListener() {

         @Override
         public void changedUpdate(DocumentEvent e) {
            updateLabel(e);
         }

         @Override
         public void insertUpdate(DocumentEvent e) {
            updateLabel(e);
         }

         @Override
         public void removeUpdate(DocumentEvent e) {
            updateLabel(e);
         }

         private void updateLabel(DocumentEvent e) {
            try {
               label.setText(e.getDocument().getText(0,
                        e.getDocument().getLength()));
            } catch (BadLocationException e1) {
               e1.printStackTrace();
            }
         }

      };
   }

   public DocumentListener getDocumentListener() {
      return myListener;
   }
}

关于java - 我怎样才能将数据从一个 JPanel 传递到另一个...?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6854688/

相关文章:

java - Java中的unicode换行符(\u000d)

java - 为不同的Jbutton编写 Action

java - 如何删除 Jtable 标题网格线

java - 为什么 JPanels 不显示?

JavaMoney : set CurrencyStyle without a compile-time dependency on moneta

java - BlobstoreService 的 HttpSession Null

java - 设置AsyncTask调用其他方法

Java Swing Mac OSX 标题栏

java - java中有没有一种方法可以绘制一个以双变量为中心的圆?

java - 从另一个类将 JFrame 添加到主 GUI 框架