Как динамически отображать данные в JLabel и Jext Boxes java из файла свойств, не зная данных в файле свойств

Я работаю над модулем Java Swing, в котором я хочу возвращать данные в текстовые поля и метки Java Swing.

Текстовые поля и JLabel должны динамически меняться в зависимости от извлечения данных, и я не знаю об имени свойств и их значениях... но мне нужно получить данные из файла свойств, не зная имя свойства и его значение в Jlabel и Jtextboxes .

... и они должны варьироваться в зависимости от данных... например, имя свойства должно входить в Jlabel, а его значение должно входить в Jtextboxes...

Я использовал заданный интерфейс структуры сбора, поэтому я получил все данные из файла свойств в его ключ и значения ключа... но я не знаю, как показать это в Jlabel и JTextBoxs

public class ConfigSwingDemo extends JFrame
 {



    private File configFile = new File("momark.properties");
    private Properties configProps;
    private JButton buttonSave = new JButton("Save");
    static List<JLabel> listOfLabels = new ArrayList<JLabel>();
    static List<JTextField> listOfTextFields = new ArrayList<JTextField>();

    public ConfigSwingDemo()
    {
        super("Properties Configuration Demo");

        setLayout(new GridBagLayout());


        GridBagConstraints constraints = new GridBagConstraints();
        constraints.gridx = 0;
        constraints.gridy = 0;
        constraints.insets = new Insets(10, 10, 5, 10);
        constraints.anchor = GridBagConstraints.WEST;
        constraints.gridy = 1;
        constraints.gridx = 0;
        constraints.gridwidth = 2;
        constraints.anchor = GridBagConstraints.CENTER;
        add(buttonSave, constraints);


        buttonSave.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent arg0) {
                try {
                    saveProperties();
                    JOptionPane.showMessageDialog(ConfigSwingDemo.this, 
                            "Properties were saved successfully!");     
                } catch (IOException ex) {
                    JOptionPane.showMessageDialog(ConfigSwingDemo.this, 
                            "Error saving properties file: " + ex.getMessage());        
                }
            }
        });

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        pack();
        setLocationRelativeTo(null);
        setVisible(true);

        try {
            loadProperties();
        } catch (IOException ex) {
            JOptionPane.showMessageDialog(this, "The momark.properties file does not exist, default properties loaded.");
        }

              Set<Object> keys = configProps.keySet();

            for(Object k:keys){
                String key = (String)k;
                System.out.println(key+": "+configProps.getProperty(key));    
            }
    }

    /////////////////
    private void loadProperties() throws IOException {
        Properties defaultProps = new Properties();
        // sets default properties

        configProps = new Properties(defaultProps);

        // loads properties from file
        InputStream inputStream = new FileInputStream(configFile);
        configProps.load(inputStream);

        inputStream.close();

    }

    private void saveProperties() throws IOException {
        //configProps.setProperty("server.url", textUrl.getText());

        OutputStream outputStream = new FileOutputStream(configFile);
        configProps.store(outputStream, "properties setttings");
        outputStream.close();
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new ConfigSwingDemo();

            }
        });

    }
}

/*консоль вывода:

          property1 : value1

          property2 : value2

          property3 : value3

          property4 : value4

я хочу динамически отображать выходные данные в полях Jlabel и Jtext, не зная данных о свойствах.. поэтому, если свойства увеличиваются, JLabels и текстовые поля также увеличиваются в соответствии со свойствами */


person kshitiz sharma    schedule 19.06.2015    source источник
comment
Итак, у вас есть Properties в парах ключ/значение, предполагая, что ключ представляет собой метку, а значение — текст, вы можете использовать propertyNames, чтобы получить Enumeration и выполнить итерацию по списку... что позволит вам создать метки /поля. Но вам, вероятно, понадобится еще один Map, который сопоставляет ключи/метки с полями...   -  person MadProgrammer    schedule 19.06.2015
comment
сэр, не могли бы вы написать код для этого, потому что я понятия не имею, как использовать это здесь, в моем коде .....   -  person kshitiz sharma    schedule 19.06.2015
comment
Вы умеете создавать и JLabel и JTextField? Вы, очевидно, знаете, как использовать GridBagLayout, у вас есть кнопка сохранения...   -  person MadProgrammer    schedule 19.06.2015
comment
я знаю, но статически не динамически. Я ищу в Интернете, но я не получил правильного ответа.... но все же возникла бы проблема, если бы я использовал цикл для создания Llables и Jtextfiled, тогда я не могу использовать ключ и значение в цикле   -  person kshitiz sharma    schedule 19.06.2015
comment
Какая разница? Вы создаете экземпляр, добавляете его в контейнер. Проблема заключается в поддержании связи между значением ключа и полем, что можно сделать просто с помощью некоторого типа Map.   -  person MadProgrammer    schedule 19.06.2015
comment
ок, спасибо, сэр, я пытаюсь использовать интерфейс карты...   -  person kshitiz sharma    schedule 19.06.2015
comment
JTextBox - В JSE такого нет. ДЫМ JTextField или JTextArea возможно?   -  person Andrew Thompson    schedule 19.06.2015


Ответы (1)


Итак, у вас есть свойства в парах ключ/значение, предполагая, что ключ представляет собой метку, а значение - текст, вы можете использовать свойства, чтобы получить перечисление и перебрать список... что позволит вам создать метки /поля.

    GridBagConstraints constraints = new GridBagConstraints();
    constraints.gridx = 0;
    constraints.gridy = 0;
    constraints.insets = new Insets(10, 10, 5, 10);
    constraints.anchor = GridBagConstraints.WEST;

    Set<Object> keys = configProps.keySet();
    for (Object k : keys) {
        JLabel label = new JLabel(k.toString());
        JTextField field = new JTextField(configProps.getProperty(k.toString()), 10);

        constraints.gridx = 0;
        add(label, constraints);
        constraints.gridx++;
        add(field, constraints);
        constraints.gridy++;
    }
    constraints.gridx = 0;
    constraints.gridwidth = 2;
    constraints.anchor = GridBagConstraints.CENTER;
    add(buttonSave, constraints);

Но вам, вероятно, понадобится другая карта, которая сопоставляет ключи/метки с полями, если вы хотите снова сохранить значения...

public class ConfigSwingDemo extends JFrame {

    private Map<String, JTextField> fieldsMap = new HashMap<>(25);
    //...

    for (Object k : keys) {
        JLabel label = new JLabel(k.toString());
        JTextField field = new JTextField(configProps.getProperty(k.toString()), 10);
        fieldsMap.put(k.toString(), field);

Затем, если вы хотите сохранить значения, вы можете использовать что-то вроде...

configProps.clear();
for (String key : fieldsMap.keySet()) {
    JTextField field = fieldsMap.get(key);
    configProps.setProperty(key, field.getText());
}

Чтобы скопировать значения обратно в файл Properties и сохранить его.

Теперь, сказав все это, я бы рекомендовал использовать JTable, поскольку у вас уже есть базовая модель (пары ключ/значение в Properties), это было бы намного проще.

Дополнительные сведения см. в разделе Как использовать таблицы.

person MadProgrammer    schedule 19.06.2015