gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:55:55 25 4
gpt4 key购买 nike

我有一个包含 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com