1

最初に、私は Java デスクトップ GUI のプログラミングに不慣れであることを指摘させてください。複数の JInternalFrame を保持できるデスクトップ ペインを作成しました。今のところ、各 JinternalFrame には同じ GUI コンポーネントが含まれており、新しい jInternalFrame (ここでは内部フレームと呼びます) は、メニュー項目をクリックして作成できます。

各内部フレームの要素は次のとおりです。3 つの Jlabel、3 つの JTextField、Jbutton、および Jtable。最初の内部フレームをレンダリングした後、3 つのテキスト フィールドに情報を入力し、ボタンをクリックすると、テーブルに新しい行が追加されます。この行には、テキスト フィールドへの入力に使用される情報が含まれています。

2 番目の内部フレームを開くと、視覚的に最初のインターフェイスとまったく同じインターフェイスが表示されます。このフレームに同じ方法でデータを入力し、ボタンをクリックすると出来上がりです。2 番目のフレームのテーブルにデータが入力されます。

前の内部フレームに戻ると、問題が発生します。問題なくテキスト フィールドに入力できますが、ボタンをクリックしてテーブルにデータを入力すると、2 番目の内部フレームのテーブルにデータが入力されます。データモデルを共有していると思われますが、各フレームの GUI が同じ場合に jInternalFrame jTables の個別のデータモデルを作成する方法がわかりません

以下はコードです(私はJava Desktop GUI開発に慣れていないので、Oracle How-Toの1つに従って内部フレーム自体をレンダリングしました-非常に単純な例です):

public class InternalFrames extends JFrame 
                        implements ActionListener  {
private static final long serialVersionUID = 1L;
JDesktopPane desktop;

JLabel label1;
JLabel label2;
JLabel label3;
JLabel label4;

JTextField text1;
JTextField text2;
JTextField text3;

JTable table1;

public InternalFrames(){
    super("Practice Internal Frames");

    int inset = 50;
    Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
    setBounds(inset,inset,screenSize.width - (inset*2),screenSize.height - (inset*2));
    desktop = new JDesktopPane();

    createFrame();
    setContentPane(desktop);

    setJMenuBar(setMenuBar());


}

protected JMenuBar setMenuBar(){

    JMenuBar menuBar = new JMenuBar();
    JMenu menu = new JMenu("Document");
    menu.setMnemonic(KeyEvent.VK_D);
    menuBar.add(menu);

    JMenuItem menuItem = new JMenuItem("New");
    menuItem.setMnemonic(KeyEvent.VK_N);
    menuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_D, ActionEvent.ALT_MASK));
    menuItem.setActionCommand("New");
    menuItem.addActionListener(this);
    menu.add(menuItem);

    menuItem = new JMenuItem("Quit");
    menuItem.setMnemonic(KeyEvent.VK_Q);
    menuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Q, ActionEvent.ALT_MASK));
    menuItem.setActionCommand("Quit");
    menuItem.addActionListener(this);
    menu.add(menuItem);



    return menuBar;
}

public void actionPerformed(ActionEvent e){
    if ("New".equals(e.getActionCommand())){
        createFrame();
    } else if ("Quit".equals(e.getActionCommand())){

    }

}

protected void createFrame(){
    InternalFrame internalFrame = new InternalFrame();

    label1 = new JLabel("Name");
    label2 = new JLabel("Email Address:");
    label3 = new JLabel("Mobile Number:");
    label4 = new JLabel("Test Frames");

    label1.setSize(100,10);
    label2.setSize(100,10);
    label3.setSize(100,10);
    label4.setSize(200,10);

    text1 = new JTextField(40);
    text2 = new JTextField(40);
    text3 = new JTextField(40);

    internalFrame.setLayout(new MigLayout());
    internalFrame.getContentPane().add(label1);
    internalFrame.getContentPane().add(text1, "wrap");
    internalFrame.getContentPane().add(label2);
    internalFrame.getContentPane().add(text2, "wrap");
    internalFrame.getContentPane().add(label3);
    internalFrame.getContentPane().add(text3,"wrap");
    internalFrame.getContentPane().add(label4, "span 2, wrap");
    internalFrame.getContentPane().add(new JScrollPane(createTable()), "span 2 2, wrap");
    internalFrame.getContentPane().add(createButton());


    internalFrame.setVisible(true);
    desktop.add(internalFrame);

    try {

        internalFrame.setSelected(true);

    } catch (java.beans.PropertyVetoException pve){ }


}

protected JTable createTable(){
    DefaultTableModel dModel = new DefaultTableModel();
    table1 = new JTable(dModel);
    dModel.addColumn("Name");
    dModel.addColumn("Email Address");
    dModel.addColumn("Mobile Number");

    return table1;
}

protected JButton createButton(){
    JButton button1 = new JButton("Add New List Member");
    button1.addActionListener(new ActionListener() {

        public void actionPerformed(ActionEvent e)
        {
            //Execute when button is pressed
            System.out.println("You clicked the button");
            populateTable(table1);
        }
    });
    return button1;
}

protected void populateTable(JTable theTable){

    if (validateEntry() == 0)
    {
        ListMembers listMember = new ListMembers();
        listMember.setName(text1.getText());
        listMember.setEmailAddress(text2.getText());
        listMember.setMobilePhone(text3.getText());
        Object[] data = {listMember.getName(),listMember.getEmailAddress(),listMember.getMobilePhone()};
        DefaultTableModel dm = (DefaultTableModel) table1.getModel();
        dm.addRow(data);


    }

}

private static void createAndShowGUI(){
    JFrame.setDefaultLookAndFeelDecorated(true);
    InternalFrames internalFrame = new InternalFrames();
    internalFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    internalFrame.setVisible(true);

}


public static void main(String[] args) {
    javax.swing.SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            createAndShowGUI();
        }
    });

}
}

どんな助けでも大歓迎です。

4

1 に答える 1

1

新しいフレームを作成するたびにtable1、この新しく作成されたテーブルで 1 つのフィールド ( ) を初期化します。そして、作成したすべてのボタンのリスナーは、この一意のtable1変数によって参照されるテーブルにデータを入力します。同じことがテキストフィールドなどにも当てはまります。

ローカル変数のみを使用し、それらをメソッド間で渡します (たとえば、作成したばかりのテーブルを、ボタンを作成するメソッドに渡して、このボタンがこのテーブルにデータを入力できるようにする必要があります。または、すべてのコードを新しいクラス、MyInternalFrame(より適切な名前を選択してください)、この新しいクラスのテーブル、テキストフィールド、およびボタンのインスタンスフィールドを作成し、新しいインスタンスが必要になるたびに、この MyInternalFrame クラスの新しいインスタンスを作成します。

この 2 番目の解決策は、私にとって最良の解決策のように見えます。

于 2012-09-29T14:05:27.663 に答える