![](/img/trans.png)
[英]Error: Non-static variable super cannot be referenced from a static context >>but i use static keyword
[英]Can I somehow use a non-static variable in a static context?
我是Java的新手,我的代碼有些麻煩。
是否可以在我的靜態類Displaying中使用 JTextArea類的非靜態方法displayText.setText ?
非常感謝您的任何幫助!
這是我的代碼:
public class GUI extends javax.swing.JFrame {
Thread send, receive, abc;
public String x;
private String response, nonStaticString;
public GUI() {
initComponents();
abc = new Thread(new Displaying());
abc.start();
receive = new Thread(new Receiving(this));
receive.start();
}
private static class Displaying implements Runnable {
private final ArrayList<String> myArray = new ArrayList();
static BlockingQueue<String> queue = new LinkedBlockingQueue();
String s;
@Override
public void run() {
while (true) {
try {
s = queue.take();
myArray.add(s);
for (String myArray1 : myArray) {
//System.out.println(myArray1);
displayText.setText(myArray);
}
} catch (InterruptedException ex) {
Logger.getLogger(GUI.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
}
public void setStringToShow(String stringToShow) throws InterruptedException {
this.response = stringToShow;
//displayText.setText(response);
Displaying.queue.put(stringToShow);
}
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {
jPanel1 = new javax.swing.JPanel();
sendButton = new javax.swing.JButton();
getTheText = new javax.swing.JTextField();
jLabel1 = new javax.swing.JLabel();
jScrollPane2 = new javax.swing.JScrollPane();
displayText = new javax.swing.JTextArea();
jLabel2 = new javax.swing.JLabel();
exitButtom = new javax.swing.JButton();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
sendButton.setText("Send The Message!");
sendButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
sendButtonActionPerformed(evt);
}
});
getTheText.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
getTheTextActionPerformed(evt);
}
});
jLabel1.setText("Witam w komunikatorze kliencie 2");
displayText.setEditable(false);
displayText.setColumns(20);
displayText.setRows(5);
jScrollPane2.setViewportView(displayText);
displayText.getAccessibleContext().setAccessibleParent(this);
jLabel2.setText("Write something to your Friend");
exitButtom.setText("Wyjscie");
exitButtom.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
exitButtomActionPerformed(evt);
}
});
javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
jPanel1.setLayout(jPanel1Layout);
jPanel1Layout.setHorizontalGroup(
jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel1Layout.createSequentialGroup()
.addContainerGap()
.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel1Layout.createSequentialGroup()
.addGap(0, 182, Short.MAX_VALUE)
.addComponent(jLabel1)
.addGap(85, 85, 85)
.addComponent(exitButtom))
.addGroup(jPanel1Layout.createSequentialGroup()
.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(getTheText)
.addComponent(jScrollPane2)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel1Layout.createSequentialGroup()
.addGap(0, 0, Short.MAX_VALUE)
.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(sendButton, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, 215, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(jLabel2, javax.swing.GroupLayout.Alignment.TRAILING))))
.addContainerGap())))
);
jPanel1Layout.setVerticalGroup(
jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel1Layout.createSequentialGroup()
.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(exitButtom)
.addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE))
.addGap(47, 47, 47)
.addComponent(jLabel2)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addComponent(jScrollPane2, javax.swing.GroupLayout.DEFAULT_SIZE, 176, Short.MAX_VALUE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addComponent(getTheText, javax.swing.GroupLayout.PREFERRED_SIZE, 38, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(sendButton)
.addContainerGap())
);
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
);
pack();
}// </editor-fold>
private void sendButtonActionPerformed(java.awt.event.ActionEvent evt) {
x = getTheText.getText();
System.out.println("String: " + x);
send = new Thread(new Sending(x));
send.start();
getTheText.setText("");
}
private void getTheTextActionPerformed(java.awt.event.ActionEvent evt) {
getTheText.getText();
}
private void exitButtomActionPerformed(java.awt.event.ActionEvent evt) {
System.exit(0);
}
// Variables declaration - do not modify
public javax.swing.JTextArea displayText;
private javax.swing.JButton exitButtom;
public javax.swing.JTextField getTheText;
private javax.swing.JLabel jLabel1;
private javax.swing.JLabel jLabel2;
private javax.swing.JPanel jPanel1;
private javax.swing.JScrollPane jScrollPane2;
public javax.swing.JButton sendButton;
// End of variables declaration
使displayText
成為GUI類的成員,並將其傳遞給Displaying
類的構造函數。
但是還有另一個問題。 您不得從非Swing線程調用SWING代碼。 查看有關如何解決此問題的SwingUtilities.invokeLater() 。
不,你不能。 該代碼將無法編譯。 靜態方法“屬於”該類,而非靜態變量則屬於該類的每個實例。 當您處於類的上下文中時,您仍然不知道變量值是什么,並且在某些實例中可能有所不同。
不,非靜態變量/方法不能在靜態引用中使用。 因此,非靜態變量取決於對象的狀態,而靜態引用則不然。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.