使用可变数量的JLabels创建JFrame

时间:2015-08-05 20:32:37

标签: java swing jframe jpanel border-layout

我目前正在尝试创建一个JFrame,它应该包含一个String,后跟HashMap(longToShortNamesMap)中每个条目的文本输入字段。目前我在JOptionPane中显示条目:

 String paneMessage = "";
 List keys = new ArrayList(longToShortNameMap.keySet());
 for(int i = 0 ; i < keys.size();i++){
     paneMessage += "Field name " + keys.get(i) + " has been shortened to " + longToShortNameMap.get(keys.get(i)) + "\n";
 }
 JOptionPane.showMessageDialog (null, paneMessage, "Data Changed", JOptionPane.INFORMATION_MESSAGE);

相反,我想要一个框架出现,它将显示相同的消息,但将具有&#34; longToShortNameMap.get(keys.get(i))&#34;部分出现在可编辑的文本字段中。我不太清楚怎么回事,但这是我到目前为止用一个标签弹出一个JFrame(这不是一个可编辑的文本字段)。

private static void showFrames(Map<String,String> longToShortNameMap) {
    JFrame frame = new JFrame("Data Changed");
    frame.setVisible(true);
    frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    frame.setSize(400, 500);
    frame.setResizable(true);
    frame.setLocationRelativeTo(null);
    JPanel panel = new JPanel(new BorderLayout());
    List<String> keys = new ArrayList(longToShortNameMap.keySet());
    for (String key : keys) {
        JLabel label = new JLabel(longToShortNameMap.get(key));
        panel.add(label);
    }
    frame.add(panel);
}
编辑:作为上下文附注,我这样做是因为字段名称在我的应用程序中的某个位置限制为10个字符,因此我不得不将字段名称修剪为10个字符。当我这样做时,我想通知用户每个修剪过的字段已被修剪到什么位置,并且还为他们提供了更改修剪名称的选项

1 个答案:

答案 0 :(得分:2)

您的主要问题是您选择的布局管理器。 BorderLayout允许其5个区域中的每个区域中的一个组件。当您将标签添加到中心区域(默认)时,您将继续替换最后一个而不是附加它。我建议将每个标签和JTextField(您的可编辑字段)添加到GridLayout面板。

private static void showFrames(Map<String,String> longToShortNameMap) {
    JFrame frame = new JFrame("Data Changed");
    frame.setVisible(true);
    frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    frame.setSize(400, 500);
    frame.setResizable(true);
    frame.setLocationRelativeTo(null);
    JPanel panel = new JPanel(new GridLayout(0, 2)); //use gridlayout
    List<String> keys = new ArrayList(longToShortNameMap.keySet());
    for (String key : keys) {
        JLabel label = new JLabel(key); // your label is the key itself
        JTextField textField = new JTextField(longToShortNameMap.get(key));
        panel.add(label);                     // Populate textfield with the key's value
        panel.add(textField);
    }
    frame.add(panel);
}