문제

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

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

두 번째 내부 프레임을 열면 첫 번째 내부 프레임의 정확한 인터페이스를 시각적으로 볼 수 있습니다.동일한 방식으로 이 프레임을 채우고 버튼을 클릭하면 짜잔, 두 번째 프레임의 테이블이 채워집니다.

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

다음은 코드입니다(저는 Java Desktop GUI 개발을 처음 접했기 때문에 내부 프레임 자체를 렌더링하기 위해 Oracle How-To 중 하나를 따랐습니다. 매우 간단한 예입니다).

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 (더 나은 이름 선택) 이 새 클래스의 테이블, 텍스트 필드 및 버튼 인스턴스 필드를 만들고 새 클래스가 필요할 때마다 이 MyInternalFrame 클래스의 새 인스턴스를 만듭니다.

이 두 번째 솔루션이 나에게 가장 좋은 솔루션인 것 같습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top