1

RMI でテーブルを使用すると、非常に奇妙な問題が発生します。クライアントは、テーブルとして実装したタイムスロット予約システムの実装です。

私は2つの問題に直面しています。最初のものは、変更が行われた後にテーブルを更新させていました。解決策のように見えた

private void cleanUp() { 

    panel.removeAll();
    panel.setVisible(false);
    panel.revalidate();
    showTable();
} 

そして、それは機能しているようです。(または、私の問題を引き起こしているのかもしれませんが、わかりません)

私が今抱えている問題は、実際の予約を呼び出すメソッド内の JTextField を処理することです。

private JTextField txtClientname;

txtClientname = new JTextField();
txtClientname.setText("ClientName");

そして、確認ボタンのリスナーで -

callBookingSlot(buttonAction, txtClientname.getText());

本当に奇妙なことは、これが最初に一度だけ機能することです。機能するとは、JTextField から抽出された正しい値をテーブルに入れることを意味します。最初のラウンドでは、ユーザーがフィールドに入力した値が入力されます。それ以降はすべて、文字列「ClientName」にのみ配置されます

誰にもアイデアはありますか?この問題は RMI 関連ではないようです。RMI なしで試してみましたが、テキスト フィールドから取得した値は同じように動作します。私はおそらくfireTableUpdatedなどを見なければならないことを知っていますが、これが簡単に修正できるものの1つである場合は素晴らしいでしょう.

編集 - 詳細情報

import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.ListSelectionModel;

public class StackOverFlowGUI {

private static JFrame frame;
private static JTable table;
private static JPanel panel;
private JTextField txtClientname;
private static JFrame bookingPopup = new JFrame();

public static void main(String[] args) {

    EventQueue.invokeLater(new Runnable() {
        public void run() {
            StackOverFlowGUI window = new StackOverFlowGUI();
            window.frame.setVisible(true);
        }
    });
}

public StackOverFlowGUI() {
    initialize();
}

private void initialize() {
    panel = new JPanel();
    frame = new JFrame();
    frame.setBounds(100, 100, 700, 751);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.getContentPane().setLayout(null);
    panel.setBounds(10, 11, 674, 576);

    frame.getContentPane().add(panel);
    showTable();
}

private void showTable() {

    table = new JTable();
    panel.add(table);
    panel.setVisible(true);
    table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
    table.setCellSelectionEnabled(true);
    showBookingPopup(2, 2);
}

private void showBookingPopup(int row, int col) {

    bookingPopup.setBounds(100, 100, 220, 185);
    bookingPopup.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    bookingPopup.getContentPane().setLayout(null);
    txtClientname = new JTextField();
    txtClientname.setText("ClientName");
    txtClientname.setBounds(10, 11, 184, 20);
    bookingPopup.getContentPane().add(txtClientname);
    txtClientname.setColumns(10);
    bookingPopup.setVisible(true);

    JPanel panel = new JPanel();
    panel.setBounds(10, 65, 184, 33);
    bookingPopup.getContentPane().add(panel);

    JButton btnSubmit = new JButton("Submit");
    btnSubmit.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {

            //Here - works first time 
            System.out.println(txtClientname.getText());
            //Continues to work if I don't call cleanUp - but then main window will not update
            cleanUp();
        }
    });
    btnSubmit.setBounds(10, 113, 89, 23);
    bookingPopup.getContentPane().add(btnSubmit);

}

private void cleanUp() {

    panel.removeAll();
    panel.setVisible(false);
    panel.revalidate();
    showTable();
}

}

4

1 に答える 1

1

投稿されたコードには、次のようないくつかの大きな問題があります。

  • インスタンスフィールドを使用する必要がある場所での静的フィールドの使用
  • null レイアウトのsetBounds(...)使用、および Swing レイアウト マネージャーの使用の回避
  • JDialogs を使用する必要がある複数の JFrames の使用
  • しかし、最も重要なことは、変数とコンポーネントを不必要に再作成することです。フィールドをクリアする必要がある場合は、フィールドをクリアしますが、単純に破棄しないでください。

例えば:

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;

import javax.swing.*;
import javax.swing.table.DefaultTableModel;

public class DataIntoTable extends JPanel {

   private static final String[] COL_NAMES = {"First Name", "LastName"};
   private DefaultTableModel model = new DefaultTableModel(COL_NAMES, 0);
   private JTable table = new JTable(model);
   private JTextField firstNameField = new JTextField(10);
   private JTextField lastNameField = new JTextField(10);
   private JPanel dialogPanel = new JPanel();

   public DataIntoTable(final JFrame frame) {
      setLayout(new BorderLayout());
      add(new JScrollPane(table));

      dialogPanel.add(new JLabel("First Name:"));
      dialogPanel.add(firstNameField);
      dialogPanel.add(new JLabel("Second Name:"));
      dialogPanel.add(lastNameField);

      dialogPanel.add(new JButton(new AbstractAction("Submit") {

         @Override
         public void actionPerformed(ActionEvent arg0) {
            String[] rowData = {firstNameField.getText(), lastNameField.getText()};
            model.addRow(rowData);
            firstNameField.setText("");
            lastNameField.setText("");
         }
      }));

      JDialog dialog = new JDialog(frame, "Enter Name", false);
      dialog.getContentPane().add(dialogPanel);
      dialog.pack();
      dialog.setLocationRelativeTo(null);
      dialog.setVisible(true);

   }

   private static void createAndShowGui() {
      JFrame frame = new JFrame("Data Into Table");
      DataIntoTable mainPanel = new DataIntoTable(frame);

      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.getContentPane().add(mainPanel);
      frame.pack();
      frame.setLocationByPlatform(true);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}
于 2013-04-06T00:29:42.037 に答える