你提的問題是Java編程的一個基本問題的一個具體的例子 - 如何類之間傳遞信息。有幾種方法可以做到這一點,其中最優雅的就是使用「模型」類來保存程序的邏輯代碼和關鍵數據,其中一個類通過更改其保存的文本字符串來更改模型的狀態。然後使用偵聽器或觀察者模式,讓模型通知其他類已更改,以便其他類可以從模型中提取新信息,即新的字符串。雖然這可能是最好的解決方案,但它可能有點矯枉過正,可能超過您當前的編碼水平,所以對於您,我不會推薦這一點。
相反,我會推薦一個更簡單的不太優雅的解決方案,而不是你有一個類調用另一個類的setter方法,以將推入新的String中。我們這裏有作爲志願者積極答覆
一個問題是,你的問題很難回答,因爲它缺乏關鍵的代碼,使得我們很難猜測爲什麼你的代碼是行爲不端,爲什麼特別你正在運行到一個NullPointerException (或NPE),當你嘗試運行它。所以我所能做的只是猜測,但猜想我會盡力。
爲了簡單起見,我們稱一個類爲持有JLabel的LabelClass
和另一個類ButtonTextFieldClass
。
一個可能的原因是,你有一個NullPointerException是因爲你ButtonTextFieldClass
可能有LabelClass
變量,但從來沒有初始化的變量,像這樣:
// this guy is null because it is never initialized
private LabelClass labelClass;
一個簡單的解決辦法是嘗試初始化像這樣:
private LabelClass labelClass = new LabelClass();
但是,這並不會因爲工作而它並創建和分配LabelClass情況下,很可能不是在運行GUI可視化LabelClass實例。
更好的解決方案是給ButtonTextFieldClass
一個setter方法,允許其他類使用正確的LabelClass實例設置ButtonTextFieldClass
。
例如,
public void setLabelClass(LabelClass labelClass) {
this.labelClass = labelClass;
}
這種方式,設置了兩個類可以通過可視化LabelClass到第一類的代碼,它可以在其上調用方法。
LabelClass的一個簡單的例子可能看起來像這樣:
class LabelClass extends JPanel {
private JLabel label = new JLabel("");
public LabelClass() {
setBorder(BorderFactory.createTitledBorder("Label Panel"));
add(label);
}
public void setLabelText(String text) {
label.setText(text);
}
}
我把它擴展JPanel,因爲這種方式讓我將它放到一個JFrame或JDialog的或其它的JPanel,因爲我認爲合適的自由。請注意,我已將JLabel設爲私人,併爲該課程提供了公開設置方法setLabelText(String text)
,該方法允許外部課程設置JLabel的文本。
的ButtonTextFieldClass可能看起來是這樣的:
class ButtonTextFieldClass extends JPanel {
private JTextField textField = new JTextField(10);
private JButton button = new JButton(new ButtonAction("Send Text"));
private LabelClass labelClass;
public ButtonTextFieldClass() {
setBorder(BorderFactory.createTitledBorder("Button TextField Panel"));
add(textField);
add(button);
}
// here we allow other classes to set instances of our LabelClass
public void setLabelClass(LabelClass labelClass) {
this.labelClass = labelClass;
}
// ....
我也給該按鈕的AbstractAction到位ActionListener的因爲它像類固醇一個超級的ActionListener。裏面的話,我會得到從JTextField中的文本,然後調用LabelClass的setter方法(如果變量不爲null)設置標籤的文本:
public void actionPerformed(ActionEvent e) {
String text = textField.getText();
if (labelClass != null) {
labelClass.setLabelText(text);
}
}
然後一切設置,另一類我想創建兩個LabelClass
和ButtonTextFieldClass
,然後實例「勾起來」通過調用setter方法:
LabelClass labelClass = new LabelClass();
ButtonTextFieldClass buttonTextFieldClass = new ButtonTextFieldClass();
buttonTextFieldClass.setLabelClass(labelClass); // set our reference
整個事情可能看起來像這樣:
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import javax.swing.*;
public class TransferData {
private static void createAndShowGui() {
LabelClass labelClass = new LabelClass();
ButtonTextFieldClass buttonTextFieldClass = new ButtonTextFieldClass();
buttonTextFieldClass.setLabelClass(labelClass); // set our reference
JPanel mainPanel = new JPanel(new GridLayout(0, 1));
mainPanel.add(buttonTextFieldClass);
mainPanel.add(labelClass);
JFrame frame = new JFrame("TransferData");
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.getContentPane().add(mainPanel);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGui();
}
});
}
}
class LabelClass extends JPanel {
private JLabel label = new JLabel("");
public LabelClass() {
setBorder(BorderFactory.createTitledBorder("Label Panel"));
add(label);
}
public void setLabelText(String text) {
label.setText(text);
}
}
class ButtonTextFieldClass extends JPanel {
private JTextField textField = new JTextField(10);
private JButton button = new JButton(new ButtonAction("Send Text"));
// one possible solution -- give this class a variable
// of the LabelClass -- but don't initialize the variable
// here, but rather do it in a setter
private LabelClass labelClass;
public ButtonTextFieldClass() {
setBorder(BorderFactory.createTitledBorder("Button TextField Panel"));
add(textField);
add(button);
}
// here we allow other classes to set instances of our LabelClass
public void setLabelClass(LabelClass labelClass) {
this.labelClass = labelClass;
}
// an AbstractAction is like a "super" ActionListener
private class ButtonAction extends AbstractAction {
public ButtonAction(String name) {
super(name); // set the button's text and actionCommand
int mnemonic = (int) name.charAt(0); // get first char
putValue(MNEMONIC_KEY, mnemonic); // set mnemonic
}
@Override
public void actionPerformed(ActionEvent e) {
String text = textField.getText();
if (labelClass != null) {
labelClass.setLabelText(text);
}
}
}
}
爲了簡單起見,我在同一個GUI中顯示了兩個JPanel,但是如果一個JPanel在一個JFrame中而另一個JPanel在JDialog中,它也可以工作。
'「如何在程序運行時更新它?我試着改變buttonAction在其他類中的JLabel,但它每次都會給我一個nullpointexception。」 - 那麼你必須調試你的NullPointerException(或NPE)。你應該仔細閱讀你的異常的堆棧跟蹤來找到有故障的代碼行,引發異常的代碼行,然後**仔細檢查那行代碼**,找出哪個變量爲空,然後追溯到代碼中以查看爲什麼。你會一次又一次遇到這些,相信我。 –
如果您需要我們的幫助,代碼會幫助很多**,最好是[最小示例程序](http://stackoverflow.com/help/mcve),這是一個小但完整的程序,只有必要的代碼展示你的問題,我們可以複製,粘貼,編譯和運行而不用修改。 –
我做了class1 Class1 c1的變量;我試着改變這一行:c1.labelname =「thevalue」; <---剛進入數據庫的值,但沒有任何事情發生,除了我得到一個nullpointexception ..:/ – Alexander