以下是我的计划的内容,
我希望将数据附加到"文本编辑器" 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);
}
}
这是我的#34; 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);
}
}
答案 0 :(得分:1)
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));
}
}
答案 1 :(得分:0)
问题在于您将文本区域添加到框架的方式:
你这样做了:
this.add(BorderLayout.CENTER, textArea);
而不是通常的:
this.add(textArea, BorderLayout.CENTER);
代码仍将编译,但您刚刚使用了不推荐使用的add方法将组件添加到内容窗格。 根据此添加签名的文档
此方法更改与布局相关的信息,因此, 使组件层次结构无效。如果容器已经存在 显示后,必须在此后验证层次结构 显示添加的组件。
这解释了为什么你只是第二次显示文本。使用正确的方法签名,否则请确保在文本区域的框架上调用validate
以显示新文本
答案 2 :(得分:0)
你的问题在这里:
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));
}
}
您尝试从计算器对象中提取信息立即,然后 ,然后用户才有机会与之互动。
解决此问题的一种方法是让主GUI监听计算器的更改,比如将自己的ActionListener添加到计算器的按钮,或让计算器知道主GUI并让它推送当按下按钮时,将其信息输入主GUI的文本组件中。
请注意,Calculator窗口应该是一个对话窗口,例如JDialog而不是JFrame。
另外,这个代码在Program.java中:
Calculator calculator = new Calculator();
calculator.setVisible(false);
calculator.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
完全没必要,因为它创建了一个永远不会显示的Calculator实例,因为它没有任何用处。
例如,如果您给这个方法计算器:
public void addActionListener(ActionListener actionListener) {
fToCButton.addActionListener(actionListener);
}
允许外部类将ActionListener添加到其按钮
然后在TextEditor程序中添加ActionListener:
public TextEditor(){ 超级(" TextMe&#34); this.setLayout(new 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));
// }
}
代码应该有效。请注意,您不应该直接访问其他类的字段,并且所有字段都应该是私有的。