3

プロパティファイルから情報を取得するコンボボックスを表示するJavaプログラムを作成しています。ユーザーがコンボボックスにあるフィールドの名前を更新できるようにする設定クラスがあります。私の問題は、設定クラスが呼び出されて変更されたときに、コンボボックスを新しい設定で更新する方法がわからないことです。パネル全体を再描画し、コンボボックスを再ロードする方法があります。しかし、設定クラスで「適用」ボタンが押されたときにそのメソッドをアクティブにする方法がわかりません。

これが私が達成しようとしていることの大まかな例です。

メインクラス:

package testing;

import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.util.Properties;

import javax.swing.*;

public class testConfigLoad extends JFrame
{
    JButton apply = new JButton("Apply");
JButton set   = new JButton("Settings");

    Properties          config      = new Properties();
    FileInputStream     fis         = null;
    FileOutputStream    fos         = null;
    final String        configFile  = "config.properties";

    OptPanel opt;

    public testConfigLoad() throws IOException
    {
        super("Test Program");
        setSize(200, 200);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLayout(new FlowLayout());

        config();
        opt = new OptPanel(config);
        buildFrame();
    }

    public void buildFrame()
    {
        set.addActionListener(new setListener());

        add(opt);
        add(apply);
        add(set);

        setVisible(true);
    }

    public void config() throws IOException
    {
        try
        {
            fis = new FileInputStream(configFile);
            config.load(fis);
        }
        catch (FileNotFoundException e)
        {
            System.out.println("File not found");
        }
        finally
        {
            if (fis != null)
            {
                fis.close();
            }
        }       
    }

    private class setListener implements ActionListener
    {
        public void actionPerformed(ActionEvent e)
        {
            settings set = new settings(config);
        }
    }

    public static void main(String[] args) throws IOException
    {
        new testConfigLoad();
    }
} 

更新が必要なパネル:

package testing;

import java.util.Properties;
import javax.swing.*;

public class OptPanel extends JPanel
{
    String[] opts;
    JLabel optLabel = new JLabel("Available Options");
    Properties config;

    public OptPanel(Properties p)
    {
        config = p;
        opts = new String[3];
        buildPanel();
    }

    public void buildPanel()
    {
        for (int i = 0; i < opts.length; i++)
        {
            opts[i] = config.getProperty("option." + i + ".name");
        }

        JComboBox optBox = new JComboBox(opts);

        add(optLabel);
        add(optBox);
    }

    public void refPanel()
    {
        removeAll();
        this.buildPanel();
        ((JPanel) this).revalidate();
        repaint();
    }
}

そして設定クラス:

package testing;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Properties;
import javax.swing.*;

public class settings 
{
    Properties config;
    final String        configFile  = "config.properties";

    JFrame setFrame = new JFrame("Settings");
    JLabel opt1 = new JLabel("Option 1");
    JLabel opt2 = new JLabel("Option 2");
    JLabel opt3 = new JLabel("Option 3");
    JTextField text1 = new JTextField(15);
    JTextField text2 = new JTextField(15);
    JTextField text3 = new JTextField(15);
    JButton apply = new JButton("Apply");

    public settings(Properties p)
    {
        config = p;
        setFrame.setSize(275, 200);
        setFrame.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
        setFrame.setLayout(new FlowLayout());

        buildSetFrame();
    }

    public void buildSetFrame()
    {
        text1.setText(config.getProperty("option.0.name"));
        text2.setText(config.getProperty("option.1.name"));
        text3.setText(config.getProperty("option.2.name"));

        apply.addActionListener(new applyListener());

        setFrame.add(opt1);
        setFrame.add(text1);
        setFrame.add(opt2);
        setFrame.add(text2);
        setFrame.add(opt3);
        setFrame.add(text3);
        setFrame.add(apply);

        setFrame.setVisible(true);
    }

    private class applyListener implements ActionListener
    {
        public void actionPerformed(ActionEvent e) 
        {
            config.setProperty("option.0.name", text1.getText());
            config.setProperty("option.1.name", text2.getText());
            config.setProperty("option.2.name", text3.getText());

            FileOutputStream fos = null;
            try
            {
                fos = new FileOutputStream(configFile);
                config.store(fos, null);
            }
            catch (IOException f)
            {
                System.out.println("Error");
            }
            finally
            {
                if (fos != null)
                {
                    try
                    {
                        fos.close();
                    }
                    catch (IOException g)
                    {
                        System.out.println("Problem");
                    }
                }
            }
            setFrame.setVisible(false);

            //  This is where I need to pass something back to the 
                    //  testConfigLoad class to tell it to 
            //  run the refPanel method in the OptPanel class.
        }
    }
}   

構成ファイルの名前はconfig.propertiesで、次のようになります。

option.2.name=two
option.1.name=one
option.0.name=zero
4

1 に答える 1

4

1 つのアプローチは、OptPanelsettingsクラスの間でコールバックを使用することです。JComboBoxプロパティに要素を独自のメソッドに追加する機能を抽出できます。

public void updateProperties(Properties p) {
    model.removeAllElements();
    for (String s: p.stringPropertyNames()) {
        model.addElement(p.getProperty(s));
    }
}

はどこmodelですかDefaultComboBoxModel。次に、単に呼び出すことができます

optPanel.updateProperties(config);

プロパティを正常に保存した後。


いくつかのポイント:

  • 複数の を使用しないことをお勧めしますJFrames。1 つのオプションはJFrame、モーダル ダイアログでシングルを使用することです。このディスカッションを参照してください。
  • JFrame を拡張しないで、インスタンスを直接使用してください。
  • Java命名規則は、クラス名が大文字で始まることを示しているため、次のようsettingsになります。Settings
于 2013-01-27T23:35:07.013 に答える