我的目的是使用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,它带有一个自定义渲染器,该渲染器以适当的标题边框显示时钟的适当时间。

09-25 22:24