使用可变数量的 JLabel 创建 JFrame
creating JFrame with variable amount of JLabels
我目前正在尝试制作一个 JFrame,它应该包含一个字符串,后跟一个文本输入字段,用于 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);
相反,我希望出现一个框架,该框架将显示相同的消息,但 "longToShortNameMap.get(keys.get(i))" 部分将出现在可编辑的文本字段中。我不太确定该怎么做,但这是我目前所拥有的,它弹出一个带有一个标签的 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 个字符,所以我被迫 trim 字段名称减少到 10 个字符。当我这样做时,我想通知用户每个 trimmed 字段已经 trimmed 并且另外让他们选择更改名为
的 trimmed
您的主要问题是布局管理器的选择。 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);
}
我目前正在尝试制作一个 JFrame,它应该包含一个字符串,后跟一个文本输入字段,用于 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);
相反,我希望出现一个框架,该框架将显示相同的消息,但 "longToShortNameMap.get(keys.get(i))" 部分将出现在可编辑的文本字段中。我不太确定该怎么做,但这是我目前所拥有的,它弹出一个带有一个标签的 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 个字符,所以我被迫 trim 字段名称减少到 10 个字符。当我这样做时,我想通知用户每个 trimmed 字段已经 trimmed 并且另外让他们选择更改名为
的 trimmed您的主要问题是布局管理器的选择。 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);
}