类没有创建JTextField的新实例

时间:2014-05-02 01:48:35

标签: java swing

我的目标是能够使用我的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);
    }
}

2 个答案:

答案 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,它显示具有周围标题边界的时钟的适当时间。