如何将数据从一个JPanel传递给其他...?

时间:2011-07-28 06:02:27

标签: java swing jframe jpanel

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

3 个答案:

答案 0 :(得分:4)

您没有显示任何代码,因此无法知道您为何获得“null”值。如果您希望所有三个JPanel都保存具有相同内容的JTextField,则有两种可能的解决方案:

  • 将共享的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;   类:大型机   这是第一个面板的actionPerformed代码   str和scrTxt都是(公共静态)

   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);   
        }
    }
  

使用belove代码我试图访问数据,但我得到null String:

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

问题:

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

无论哪种方式,这种设计并不好。你最好向我们展示一个小的演示程序,它可以显示编译和运行代码的问题,sscce,这样我们就可以使用和修改你的代码,并且能够向你展示一个不错的解决方案。< / p>

其中一个不错的解决方案是向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;
   }
}

答案 1 :(得分:1)

一个简单的解决方案是将JTextField设为全局,以便所有面板都可以访问它。

确保您的所有面板都可以访问textField可全局访问的JTextField。

以下代码演示了这一点:

JTextField textField = new JTextField(25);
JLabel labelForPanel2 = new JLabel(),labelForPanel3 = new JLabel();
private void panelDemo() {
    JFrame frame = new JFrame();
    frame.setSize(400, 400);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    JPanel panel1 = new JPanel();
    JPanel panel2 = new JPanel();
    JPanel panel3 = new JPanel();

    JTabbedPane tabbedPane = new JTabbedPane();
    tabbedPane.addTab("Tab 1", panel1);
    tabbedPane.addTab("Tab 2", panel2);
    tabbedPane.addTab("Tab 3", panel3);

    panel1.add(textField);
    panel2.add(labelForPanel2);
    panel3.add(labelForPanel3);

    textField.addKeyListener(new KeyAdapter() {
        @Override
        public void keyReleased(KeyEvent e) {
            labelForPanel2.setText(textField.getText());
            labelForPanel3.setText(textField.getText());
        }
    });

    frame.add(tabbedPane);
    frame.setVisible(true);
}

答案 2 :(得分:0)

我不知道你到底想要实现什么目标,但也许可以尝试数据绑定?

查看BetterBeansBinding库。