إنشاء نماذج بيانات متميزة ل جتابلز في إطارات داخلية مختلفة

StackOverflow https://stackoverflow.com//questions/12653309

سؤال

أولا ، اسمحوا لي أن أشير إلى أنني جديدة على برمجة جافا واجهة المستخدم الرسومية سطح المكتب.لقد قمت بإنشاء جزء سطح المكتب التي يمكن أن تعقد متعددة جينترنالفرامس.في الوقت الحالي ، يحتوي كل إطار جينترنالفريم على نفس مكونات واجهة المستخدم الرسومية ويمكن إنشاء إطار جينترنالفريم جديد (يشار إليه هنا باسم الإطار الداخلي) عن طريق النقر فوق عنصر القائمة.

العناصر الموجودة في كل إطار داخلي هي كما يلي:3 جلابيلز ، 3 جتكستفيلدس ، جبوتون و جتابل.بعد تقديم الإطار الداخلي الأول أنا ملء حقول النص 3 مع المعلومات ثم انقر فوق الزر ويتم إضافة صف جديد إلى الجدول.يحتوي الصف على المعلومات المستخدمة لملء حقول النص.

فتح الإطار الداخلي الثاني يعطيني ، بصريا ، واجهة بالضبط من الأول.أنا ملء هذا الإطار بنفس الطريقة ، انقر فوق الزر وفويلا ، يتم ملء الجدول في الإطار الثاني.

تنشأ المشكلة عندما أعود إلى الإطار الداخلي السابق.يمكنني الكتابة في حقول النص دون مشكلة ولكن النقر فوق الزر لملء الجدول يؤدي إلى ملء الجدول في الإطار الداخلي الثاني. وأظن أنني تقاسم داتاموديل ولكن أنا غير متأكد من كيفية إنشاء نماذج بيانات متميزة ل جينترنالفريم جتابلز عندما واجهة المستخدم الرسومية لكل إطار هو نفسه.

أدناه هو رمز (وأنا جديدة لتطوير واجهة المستخدم الرسومية سطح المكتب جافا تابعت واحدة من أوراكل كيف لتقديم الإطار الداخلي نفسه-مثال بسيط جدا):

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();
        }
    });

}
}

أي مساعدة سيكون موضع تقدير كبير.

هل كانت مفيدة؟

المحلول

في كل مرة تقوم فيها بإنشاء إطار جديد ، تقوم بتهيئة حقل واحد (table1) مع هذا الجدول الذي تم إنشاؤه حديثا.والمستمع من كل زر تقوم بإنشائه بملء الجدول المشار إليه من قبل هذا فريدة من نوعها table1 متغير.الشيء نفسه ينطبق على حقول النص ، إلخ.

إما استخدام المتغيرات المحلية فقط ، وتمريرها بين الأساليب (على سبيل المثال ، تحتاج إلى تمرير الجدول الذي أنشأته للتو إلى طريقة إنشاء الزر ، من أجل هذا الزر لملء هذا الجدول.أو يمكنك استخراج كافة التعليمات البرمجية إلى فئة جديدة, MyInternalFrame (اختيار اسم أفضل) ، وجعل الجدول ، تكستفيلدس وأزرار حقول المثال من هذه الفئة الجديدة ، وإنشاء مثيل جديد من هذه الفئة مينترنالفريم في كل مرة كنت في حاجة الى واحدة جديدة.

هذا الحل الثاني يبدو أفضل واحد بالنسبة لي.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top