我的目标是能够使用我的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);
}
}
答案 0 :(得分:3)
为什么纽约显示正确,但伦敦根本没有显示?
默认情况下,JFrame使用BorderLayout
。此外,默认情况下,当您向框架添加组件时,它将添加到BorderLayout的“CENTER”。但是,中心只能显示一个组件,因此仅显示添加的最后一个组件(纽约)。
我真的不明白你试图做什么,所以我不能建议一个完整的解决方案,但基本的解决方案是使用不同的布局管理器来管理组件。有关详细信息,请阅读Layout Managers上的Swing教程中的部分。
作为一个简单的示例,让您开始添加以下内容以查看差异:
clockFrame = new JFrame("World Clock");
clockFrame.setLayout( new FlowLayout() );
答案 1 :(得分:1)
正如我的评论中所指出的那样,你错误地使用了继承,因为ClockView类不应该扩展ClockBuilder。 ClockView将保存ClockBuilder实例,因此这里存在“has-a”关系,而不是“is-a”关系。一次又一次,你的ClockBuilder类有一个“伪构造函数”,一个与类同名的方法,包括大写,但它不是真正的构造函数,因为它返回一些东西。摆脱它。使用适当的方法名称或真正的构造函数。
此外,您正在以非JTextField方式使用JTextFields,您似乎在其中显示文本但不允许用户编辑它。在这种情况下,最好使用放置在GridLayout中的JLabel-使用JPanel。更好的是,如果你想要的只是显示一个时钟时间列表,那么我会使用一个JList,一个带有自定义渲染器的JList,它显示具有周围标题边界的时钟的适当时间。