2017-12-02 295 views
0

我想知道如何使我的JTextArea全局,以及如何使用它作为整数写入结果?Java如何使JTextArea从不同的类访问并写入整数

我正在尝试使用链接链接实现队列的程序,但实际上并没有使用LinkedList类。我的项目中有两个不同的类。有一类是deneme2。在那个类中我有队列方法。在第二节课中,我有JFrame,所以我想让我的入队和出球结果为JTextArea。到目前为止,我只能使用println,但无法设法进入JTextArea

这是我deneme4

public class Deneme4 extends JFrame { 
public static void main(String a[]) throws FileNotFoundException { 
    SecondFrame frame = new SecondFrame(); 

}} 

这是Queue类的GUI我试图让

public class Queue { 

public static interface MessageOutput { 

    void appendMessage(String message); 

    void appendHead(String message); 
} 

private MessageOutput msgOutput = new MessageOutput() { 
    @Override 
    public void appendMessage(String message) { 
     System.out.println(message); 
    } 

    @Override 
    public void appendHead(String head) { 
     System.out.println(head); 
    } 
}; 

public void setMessageOutput(MessageOutput value) { 
    msgOutput = value; 
} 

public void setHeadOutput(MessageOutput value) { 
    msgOutput = value; 
} 

private Node front, rear; 
private int currentSize; 

private class Node { 

    int data; 
    Node next; 
} 

public Queue() { 
    front = null; 
    rear = null; 
    currentSize = 0; 
} 

public boolean isEmpty() { 
    if (currentSize == 0) { 
     msgOutput.appendMessage("Que is Empty\n"); 
    } 
    return currentSize == 0; 
} 

public int dequeue() { 
    int data = front.data; 
    front = front.next; 
    if (isEmpty()) { 
     rear = null; 
    } 
    currentSize--; 
    msgOutput.appendMessage(data + " removed from the queue\n"); 

    return data; 
} 

public int enqueue(int data) throws FileNotFoundException { 
    Node oldRear = rear; 
    rear = new Node(); 
    rear.data = data; 
    rear.next = null; 
    if (isEmpty()) { 
     front = rear; 
    } else { 
     oldRear.next = rear; 
    } 
    currentSize++; 
    msgOutput.appendMessage(data + " added to the queue\n"); 
    return data; 
} 

public int queueSize() { 
    msgOutput.appendMessage("Size of the Que is" + currentSize + "\n"); 
    return currentSize; 
} 

public int getHead() { 
    int data = front.data; 
    msgOutput.appendHead("Head of the Que is " + data + "\n"); 
    return data; 
}} 

,这是我QueueFrame我希望当按钮点击它输出价值txt1,但似乎不能这样做

public class QueueFrame extends JFrame implements Queue.MessageOutput { 

private JTextArea txt1; 
private JTextArea txt2; 
private JTextArea txt3; 
private JButton b1; 
private JButton b2; 
private Queue queue = new Queue(); 

public static interface MessageOutput { 

    void appendMessage(String message); 

    void appendHead(String message); 
} 

private MessageOutput msgOutput = new MessageOutput() { 
    @Override 
    public void appendMessage(String message) { 
     System.out.println(message); 
    } 

    @Override 
    public void appendHead(String head) { 
     System.out.println(head); 
    } 
}; 

public void setMessageOutput(MessageOutput value) { 
    msgOutput = value; 
} 

public void setHeadOutput(MessageOutput value) { 
    msgOutput = value; 
} 

@Override 
public void appendHead(String head) { 
    txt2.append(head); 
} 

public QueueFrame() throws FileNotFoundException { 

    JFrame frame = new JFrame(); 
    b1 = new JButton("Load up the Que"); 
    b1.addActionListener(new ActionListener() { 
     @Override 
     public void actionPerformed(ActionEvent ae) { 
      try { 
       Scanner s = new Scanner(new File("list.txt")); 
       while (s.hasNext()) { 
        queue.setMessageOutput((Queue.MessageOutput) queue. 
        queue.enqueue(s.nextInt()); 
       } 
       s.close(); 
       queue.queueSize(); 
       queue.getHead(); 
      } catch (FileNotFoundException ex) { 
       Logger.getLogger(QueueFrame.class.getName()).log(Level.SEVERE, null, ex); 
      } 
     } 
    }); 
    b2 = new JButton("Head of the Que"); 
    b2.addActionListener(new ActionListener() { 
     @Override 
     public void actionPerformed(ActionEvent ae) { 
      queue.getHead(); 
     } 
    }); 

    txt1 = new JTextArea(); 
    txt2 = new JTextArea(); 
    txt3 = new JTextArea(); 

    txt1.setEditable(false); 
    txt2.setEditable(false); 
    txt3.setEditable(true); 

    b1.setBounds(50, 100, 180, 100); 
    b2.setBounds(50, 300, 180, 100); 
    txt1.setBounds(600, 100, 200, 600); 
    txt2.setBounds(300, 300, 180, 100); 
    txt3.setBounds(300, 100, 180, 100); 
    frame.add(b1); 
    frame.add(b2); 
    frame.add(txt1); 
    frame.add(txt2); 
    frame.add(txt3); 
    frame.setLayout(null); 
    frame.setSize(1000, 1500); 
    frame.setVisible(true); 
    frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 

}} 
+0

“*我可以让我的JTextArea全球”* - 尽可能避免使用任何时间的全局变量。您应该小心地暴露UI元素,因为它允许其他人以意想不到的方式修改它们(例如将其从容器中移除)。相反,关注“观察者模式”的使用,它允许您注册对某些状态发生变化时可以生成通知的类感兴趣 – MadProgrammer

回答

0

这个问题有很多可能的解决方案。这是我想接近它的方式:

创建一个名为MessageOutput类deneme2内像这样的接口:

public class deneme2 { 
    public static interface MessageOutput { 
     void appendMessage(String message); 
    } 
} 

而且在同一个班,你需要将MessageOutput的引用,以便您可以追加消息。让我们把它初始化为的情况下,一些默认实现无人设置后:

​​

所以你需要一个二传手的msgOutput领域:

public void setMessageOutput(MessageOutput value) { 
    msgOutput = value; 
} 

所以你现在可以改变所有的println代码使用MessageOutput的appendMessage()方法:

public int dequeue() { 
    . . . 

    msgOutput.appendMessage(data + " removed from the queue"); 
    return data; 
} 

然后让MainFrame实现deneme2.MessageOutput。请注意,您可以不再使用的JTextArea作为一个局部变量,你必须让主机的属性:

public class MainFrame implements deneme2.MessageOutput { 
    @override 
    public void appendMessage(String message) { 
     txt2.append(message); 
    } 
} 

最后,更新main()方法的主机传递到deneme2实例:

MainFrame frame = new MainFrame(); 
queue.setMessageOutput(frame); 

而且您应该在创建MainFrame后开始处理队列。

+0

以及如何将jtextarea作为MainFrame的属性? –

+0

我已经完成了所有事情,唯一的问题是当我排队。setMessageOutput(帧);这在主要方法,它给队列错误 –

+0

你可以显示错误信息? –

相关问题