我的目的是使用ClockBuilder类创建多个JTextField。我想知道您是否可以就如何实现这一目标提供一些建议。我已经包含了我的代码的SSCCE。
我的完整程序通过txt文件创建了145个城市的数组。我使用此数组填充jlist,然后+/-按钮应允许用户添加/删除显示的城市。我正处于JList和按钮正常运行的阶段。它将城市添加/删除到单独的阵列列表中。我一直在尝试使用此数组列表创建JTextField的多个实例,但是,我无法实现这一点,我在哪里出错?
我在SSCCE中对此进行了简化,在这里我手动创建了两个Clockbuilder类,为什么纽约显示正确,而伦敦却根本不显示?我对编程还很陌生,但仍会继续关注类,方法和构造函数,如果我对问题的某些部分措词有误,请原谅我,希望我能清楚地实现自己的目标。
ClockBuilder.java
import java.awt.*;
import javax.swing.*;
import javax.swing.border.*;
public class ClockBuilder extends JTextField{
ClockView view;
public ClockBuilder(){
super(8);
}
public JTextField ClockBuilder(String city){
Border lineBorder = BorderFactory.createLineBorder(Color.BLACK,1);
Font font = new Font("Bradley Hand ITC", Font.BOLD, 24);
setFont(font);
setEditable(false);
setFocusable(false);
setHorizontalAlignment(JTextField.CENTER);
setBorder(BorderFactory.createTitledBorder(lineBorder, city));
return this;
}
}
View.java
import java.io.*;
import java.util.*;
import java.awt.*;
import javax.swing.*;
import javax.swing.border.*;
public class ClockView{
JFrame clockFrame;
JPanel displayArea;
JPanel clockPanel;
String cities[] = {"London","New York","Barcelona", "Toronto"};
public ClockView() {
clockFrame = new JFrame("World Clock");
clockFrame.setSize(400,400);
clockFrame.setLocationRelativeTo(null);
clockFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container contentPane = clockFrame.getContentPane();
clockPanel = new JPanel();
clockPanel.setPreferredSize(new Dimension(400, 400));
ClockBuilder clock = new ClockBuilder();
clockPanel.add(clock.ClockBuilder("London"));
ClockBuilder clock2 = new CLockBuilder();
clockPanel.add(clock2.ClockBuilder("New York"));
contentPane.add(clockPanel);
clockFrame.setVisible(true);
}
}
最佳答案
如我的评论所述,您在滥用继承,因为ClockView类不应扩展ClockBuilder。 ClockView将保存ClockBuilder实例,因此此处存在“具有”关系,而不是“具有”关系。一次又一次,您的ClockBuilder类具有一个“伪构造函数”,该方法与该类具有相同的名称,包括大小写,但由于返回了某些内容,因此它不是真正的构造函数。摆脱它。请使用具有适当方法名称的适当方法或真实的构造函数。
另外,您以一种非常非JTextField的方式使用JTextFields,您似乎在其中显示文本,但不允许用户对其进行编辑。在这种情况下,最好使用JPanel使用放置在GridLayout中的JLabel。更好的是,如果您只想显示一个时钟时间列表,那么我将使用一个JList,它带有一个自定义渲染器,该渲染器以适当的标题边框显示时钟的适当时间。