2012-09-29 2 views
1

먼저 Java Desktop GUI를 프로그래밍하는 것이 처음이라고 지적하겠습니다. 여러 개의 JInternalFrames를 보유 할 수있는 데스크톱 창을 만들었습니다. 현재 각 JinternalFrame에는 동일한 GUI 구성 요소가 포함되어 있으며 메뉴 항목 클릭을 통해 새 jInternalFrame (내부 프레임이라고 함)을 만들 수 있습니다.다른 내부 프레임의 jTables에 대한 고유 한 데이터 모델 만들기

각 내부 프레임의 요소는 3 개의 Jlabels, 3 개의 JTextFields, Jbutton 및 Jtable입니다. 첫 번째 내부 프레임을 렌더링 한 후 3 개의 텍스트 필드에 정보를 채운 다음 버튼을 클릭하면 새 행이 테이블에 추가됩니다. 이 행에는 텍스트 필드를 채우는 데 사용되는 정보가 들어 있습니다.

두 번째 내부 프레임을 열면 첫 번째 인터페이스의 정확한 인터페이스가 시각적으로 나에게 표시됩니다. 같은 방식으로이 프레임을 채우고 단추를 클릭 한 다음 두 번째 프레임의 표가 채워집니다.

이전 내부 프레임으로 돌아갈 때 문제가 발생합니다. 난 텍스트 필드에 문제없이 입력 할 수 있지만 테이블을 채우려면 단추를 클릭하면 두 번째 내부 프레임의 테이블이 채워집니다. 나는 데이터 모델을 공유하고 있다고 생각하지만 각 프레임의 GUI가 동일 할 경우 jInternalFrame jTables에 대해 고유 한 데이터 모델을 만드는 방법에 대해서는 확신이 없습니다..

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

} 
} 

상관 도움이 될 것이다 : - (매우 간단한 예를 들어 나는 내부 프레임 자체를 렌더링하는 오라클 어떻게에의 중 하나를 따라 자바 데스크탑 GUI 개발에 새로운 오전으로) 아래

코드입니다 대단히 감사합니다.

답변

1

새 프레임을 만들 때마다이 새로 만든 테이블을 사용하여 단일 필드 (table1)를 초기화합니다. 그리고 생성 한 모든 버튼의 청취자는이 고유 한 table1 변수가 참조하는 테이블을 채 웁니다. 텍스트 필드에도 마찬가지입니다.

로컬 변수 만 사용하고 메소드간에 전달합니다 (예 : 방금 만든 테이블을이 버튼에 대한 순서로 전달하여 버튼을 생성해야 함). 또는이 코드를 새로운 클래스 인 MyInternalFrame (더 나은 이름 선택)에 추출하고이 새로운 클래스의 테이블, 텍스트 필드 및 버튼 인스턴스 필드를 만들고이 MyInternalFrame 클래스의 인스턴스를 만들 때마다 새로운 하나를해야합니다.

이 두 번째 솔루션은 나에게 최고의 한 것 같습니다.

+0

감사 등 빠른 응답. 내가 현지화 고려와 만난 사이에 모든 변수를 전달했다 hods 그러나 그것은 단지 틀리게 보였다. 나는 새로운 수업의 창작이 아마도 최선의 방법 일 것임에 동의한다. 나는 그것을 그렇게 구현할 것이다. 다시 한번 감사드립니다. – EastCanShan