我的节目是这样的,
我希望一旦我按下“华氏到摄氏”按钮,数据就被附加到“文本编辑器”( textArea )中。
我有四个不同的课程(这是我的教授希望我们的项目设置的方式) :/这是我的“主”班
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Program p = new Program();
}
}下面是我的“程序”课
import javax.swing.JFrame;
public class Program {
public Program(){
TextEditor textEditor = new TextEditor();
textEditor.setVisible(true);
textEditor.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Calculator calculator = new Calculator();
calculator.setVisible(false);
calculator.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
}
}下面是我的"TextEditor类“,我省略了一些按钮,因为这些按钮不会导致任何问题。
public class TextEditor extends JFrame implements ActionListener{
JTextArea textArea;
JButton calculatorButton;
Calculator c = new Calculator();
public TextEditor(){
super("TextMe");
this.setLayout(new BorderLayout());
loadMenuBar();
loadToolBar();
loadTextArea();
this.pack();
}
private void loadTextArea() {
// TODO Auto-generated method stub
textArea = new JTextArea();
textArea.setPreferredSize(new Dimension(800,600));
this.add(BorderLayout.CENTER, textArea);
}
private void loadToolBar() {
// TODO Auto-generated method stub
JToolBar toolBar;
// CALCULATOR BUTTON
calculatorButton = new JButton(new ImageIcon(this.getClass().getResource("/images/calculator.png")));
calculatorButton.addActionListener(this);
// TOOL BAR
toolBar = new JToolBar(JToolBar.HORIZONTAL);
toolBar.add(calculatorButton);
this.add(BorderLayout.PAGE_START, toolBar);
}
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
if(e.getSource() == calculatorButton){
loadCalculator ();
}
}
private void loadCalculator() {
// TODO Auto-generated method stub
{
c.setVisible(true);
c.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
this.setLayout(new FlowLayout());
}
if(!c.fToC.getText().isEmpty()){
textArea.setText(String.valueOf(c.fahrenheit));
}
}}
最后,这是我的“计算器”类。再次,很抱歉这里有这么多代码。
public class Calculator extends JFrame implements ActionListener{
JButton fToCButton;
JTextField fToC;
double fahrenheit;
public Calculator(){
super("Unit Converter");
this.setLayout(new FlowLayout());
fToC = new JTextField(5);
fToCButton = new JButton("Ferenheit To Celcius");
fToCButton.addActionListener(this);
add(fToCButton, BorderLayout.WEST);
add(fToC);
this.pack();
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
if(e.getSource() == fToCButton){
degreeConversion();
}
}
public void degreeConversion() {
// TODO Auto-generated method stub
double conversion = Double.parseDouble(fToC.getText());
fahrenheit = (((conversion -32) * 5) / 9);
}
}发布于 2014-11-24 05:17:16
Calculator类独立于TextArea类。我在您的代码中看到的问题如下:
对于第4点,应该如下所示:
public class TextArea extends JFrame {
...
private JTextArea textArea;
private void loadCalculator() {
Calculator c = new Calculator(this)
c.setVisible(true);
}
public void updateValue(String str) {
textArea.setText(str);
}
}
public class Calculator extends JDialog() {
private TextArea parent;
public Calculator(TextArea parent) {
super(parent, true); //or something like this to make it dialog I dont remember the exact syntax
this.parent = parent;
...
}
...
private void degreeConversion() {
double f = ...
parent.updateValue(String.valueOf(f));
}
}发布于 2014-11-24 05:05:06
问题在于将文本区域添加到框架中的方式:
是你干的:
this.add(BorderLayout.CENTER, textArea);而不是通常的:
this.add(textArea, BorderLayout.CENTER);代码仍然会编译,但是您刚刚使用了一个不推荐的add方法将组件添加到内容窗格中。根据此文档添加签名
此方法更改与布局相关的信息,从而使组件层次结构无效。如果容器已经显示,则必须在其后验证层次结构,以显示添加的组件。
这就解释了为什么你--这仅仅是第二次--显示文本。使用正确的方法签名,否则请确保在文本区域的框架上调用validate以显示新文本。
发布于 2014-11-24 05:13:54
你的问题是:
private void loadCalculator() {
c.setVisible(true);
c.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
this.setLayout(new FlowLayout());
if (!c.fToC.getText().isEmpty()) {
textArea.setText(String.valueOf(c.fahrenheit));
}
}您正在尝试从Calculator对象中立即提取信息,在对象显示之前,用户还没有机会与其交互。
解决这一问题的一种方法是让您的主GUI侦听对计算器的更改,比如将自己的ActionListener添加到计算器的按钮中,或者让计算器知道主GUI,并在按下其按钮时将其信息推到主GUI的文本组件中。
注意,计算器窗口应该是一个对话框窗口,比如一个JDialog,而不是一个JFrame。
顺便提一下,Program.java中的这段代码:
Calculator calculator = new Calculator();
calculator.setVisible(false);
calculator.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);完全没有必要,因为它没有任何用处,因为它创建了一个从不显示的Calculator实例。
例如,如果您给Calculator此方法:
public void addActionListener(ActionListener actionListener) {
fToCButton.addActionListener(actionListener);
}允许外部类向其按钮添加ActionListener
然后在TextEditor程序中添加ActionListener:
公共TextEditor() {超级(“TextMe”);this.setLayout(新的BorderLayout());loadMenuBar();loadToolBar();loadTextArea();this.pack();
c.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (!c.fToC.getText().isEmpty()) {
textArea.setText(String.valueOf(c.fahrenheit));
}
}
});并摆脱:
private void loadCalculator() {
c.setVisible(true);
c.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
this.setLayout(new FlowLayout());
// if (!c.fToC.getText().isEmpty()) {
// textArea.setText(String.valueOf(c.fahrenheit));
// }
}密码应该能用。请注意,您不应该直接访问其他类的字段,所有字段都应该是私有的。
https://stackoverflow.com/questions/27098054
复制相似问题