2015-08-05 3 views
1

В настоящее время я пытаюсь создать JFrame, который должен содержать одну строку, за которой следует поле ввода текста для каждой записи в HashMap (longToShortNamesMap). В настоящее время я отображая записи, как follws в JOptionPane:создание JFrame с переменным количеством JLabels

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 (я)) "появляются в редактируемом текстовом поле. Я не совсем уверен, как это происходит, но это то, что у меня есть до сих пор, которое вытаскивает один 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); 
} 

EDIT: Как контекстное примечание стороны, я делаю это потому, что имена полей ограничены 10 символов в месте в моем приложении, поэтому я вынужден урезать имена полей вплоть до 10 символов. Когда я это делаю, я хочу уведомить пользователя о том, что каждое обрезанное поле было обрезано, и дополнительно дать им возможность изменить обрезанное имя

+0

BorderLayout - неправильный макет, который вы используете здесь - вы все равно ставите все предметы в одинаковое положение по умолчанию (CENTER). Вместо этого попробуйте создать сетку или сетку GridBag. – FredK

ответ

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); 
} 
+0

это очень полезно. Только проблема, которую я хотел бы получить, - это как получить значение данного JTextField? также как сделать прокручиваемым? Я должен был бы бросить JPanel в JScrollPane, нет? Однако это создает пустой JFrame – GregH

+0

@peggy, вы можете хранить ссылки JTextField в массиве или другой структуре данных. Например, другая карта с текстом меток в качестве ключей и JTextFields в качестве значений, если вам нужно получить доступ к определенным полям. Да, JScrollPane должен работать. Если вам нужна помощь, вам следует опубликовать новый вопрос. – BoDidely

+0

Да, вы уже более чем помогли. Я думаю, что удержусь на другом вопросе и сижу и борюсь какое-то время :) Спасибо за ваше время – GregH

Смежные вопросы