« 2008年12月 | トップページ | 2009年2月 »

2009年1月

2009年1月30日 (金)

カルテ編集画面のスクロール

Prev1 Prev2 オリジナルの状態では,一応スクロールバーは表示されているのだが(左),テキストを入力して,画面の下端まで行ってもスクロールせずに,入力部分が見えなくなってしまう(右)。どちらかが画面の下端まで行ったら自動的にスクロールして欲しいのだが,TextPane が2列あって,どちらかが画面の下端を超えたら両方の TextPane をスクロールするという動作にするのはかなり面倒くさそうだった。
After1 After2 そこで,2列の TextPane それぞれを ScrollPane に入れて,必要に応じてそれぞれにスクロールバーを出すことにした。スクロールが必要ないうちはスクロールバーはでない(左)。入力が下端に達したら,自動スクロールしてスクロールバーが出現する。スクロールバーはそれぞれの TextPane で独立している。

 

client/KartePanel3.java の作成

Source1 KartePanel2.java を参考にして KartePanel3.java を作成する。JTextPane を JScrollPane に入れて,スクロールバーはここで出すようにする。デザインでは,各 Pane をボーダーなしにして,できるだけくっつけるようにした。TextPane はマージンを 7 とった。
Source2 コードでは,スクロール行数をセットしている以外は KartePanel2.java と同じ。

 

client/KarteEditor.java の編集

KartePanel2 の代わりに,上で作成した KartePanel3 を使用する。また,そのままだとキャレットの位置がテキストの最後になるので,先頭にリセットする。
private void initialize2() {

  stateMgr = new StateMgr();
        
////↓カルテ編集画面をカスタマイズ (KartePanel3.java を使用)
  KartePanel3 kp2 = new KartePanel3();
  //KartePanel2 kp2 = new KartePanel2();
////↑
  panel2 = kp2;
private void displayModel() {
 ・
 ・
  // 内容を表示する
  if (model.getModules() != null) {
    KarteRenderer_2 renderer = new KarteRenderer_2(soaPane, pPane);
    renderer.render(model);
////↓キャレット位置を先頭にリセット
     soaPane.getTextPane().setCaretPosition(0);
     pPane.getTextPane().setCaretPosition(0);
////↑
  }

2009年1月28日 (水)

カルテ表示画面のスクロール

インスペクタ画面でカルテが表示されている時,スクロールホイールを使ってスクロールしようとすると,スクロールが非常に遅く実用的でない。スクロール増分を増やして,早くスクロールできるようにする。
また,スクロールバーが表示される時に,カルテがその分伸びて正確な高さが計測できなくなり,KarteViewer2#getActualHeight が正しい値を返さなくなった結果,カルテが尻切れで表示されることがあるので,面倒くさいので最初からスクロールバーを表示しておくことにした。

 

client/DocumentBridgeImpl.java の編集

public void start() {
        
    scroller = new JScrollPane();
////↓   カルテのスクロールを増分を多くする
    scroller.getVerticalScrollBar().setUnitIncrement(15);
    scroller.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
////↑
    getUI().setLayout(new BorderLayout());

2009年1月26日 (月)

処置・検査スタンプにコメント

検査,処置にコメントを入力できるようにする。フリーコメント 810000001 は,「診療内容」を編集可能として,その内容を CLAIM 送信するようにした。84xxxxxxx コメントでは,パラメータを number として「01−24」のような形で送信することになっているので,その形式で「数量」欄にパラメータを入力することにした。

Commentexam1 Commentexam2 マスター検索に 810000001 を入力すると,リストに「コメント」がでてくるので,これをクリックすると,「コード」欄に「810000001」が入力される。すると「診療内容」のところにコメントが入力できるようになる。
Commenttreat1 Commenttreat2 マスター検索に 84xxxxxxx を入力し,これをクリックして選択する。パラメータは「数量」欄に数字を「-」で区切って入力する。1月20日を入力したければ「01-20」と入力する。

 

order/ItemTablePanel.java の編集

public ItemTablePanel(IStampModelEditor parent) {
 ・
 ・
 // セットテーブルのモデルを生成する
 tableModel = new ObjectReflectTableModel(COLUMN_NAMES, NUM_ROWS, METHOD_NAMES, null) {
     
  // NUMBER_COLUMN を編集可能にする
  @Override
  public boolean isCellEditable(int row, int col) {

////↓ コメントが付けられるようにする
   if (col == 1) { // 診療内容カラム
    // col=0 がコメントコード(810000001)なら,この cell を編集可能とする
    String code = (String) this.getValueAt(row, 0);
    if (code != null) return code.equals("810000001")? true : false;
   }
////↑
   return col == NUMBER_COLUMN ? true : false;
 ・
 ・
   // MasterItem に数量を設定する
   MasterItem mItem = (MasterItem) getObject(row);
   
   if (col == NUMBER_COLUMN && mItem != null) {
    mItem.setNumber((String) o);
    stateMgr.checkState();
   }
////↓ MasterItem に診療内容(入力したコメント)を設定する
   if (col == 1 && mItem != null) {
    mItem.setName((String) o);
    stateMgr.checkState();
////↑
 ・
 ・
   // 数量カラムにセルエディタを設定する
   JTextField tf = new JTextField();
   tf.addFocusListener(AutoRomanListener.getInstance());
   column = setTable.getColumnModel().getColumn(NUMBER_COLUMN);
   DefaultCellEditor de = new DefaultCellEditor(tf);
   int ccts = Project.getPreferences().getInt("order.table.clickCountToStart", 1);
   de.setClickCountToStart(ccts);
   column.setCellEditor(de);

////↓   診療内容カラム(column number = 1)にセルエディタを設定する
   JTextField tf2 = new JTextField();
   tf2.addFocusListener(AutoRomanListener.getInstance());
   column = setTable.getColumnModel().getColumn(1);
   DefaultCellEditor de2 = new DefaultCellEditor(tf2);
   de2.setClickCountToStart(ccts);
   column.setCellEditor(de2);
////↑

HasItemState.java の編集

private boolean isNumberOk() {
 ・
 ・
 // マスターアイテムを取り出す
 MasterItem mItem = (MasterItem) iter.next();

////↓ コードが 84xxxxxxx コメントの場合,number にパラメータを入れるので,number チェックしない
 if (mItem.getCode().substring(0,2).equals("84")) break;
////↑

 // 手技の場合
 if (mItem.getClassCode() == ClaimConst.SYUGI) {
 ・
 ・

2009年1月25日 (日)

細菌検査スタンプにコメント

細菌検査スタンプにフリーコメント(810000001)を記入できるようにする。入力したコメントは「810000001+入力コメント」の形で CLAIM 送信される。SqlMasterDao.java で 8 から始まるコメントコードを検索可能なように変更しておくことが必要。

Commentbact1 Commentbact2 マスター検索に 810000001 を入力すると,リストに「コメント」がでてくるので,これをクリックすると,「名称」欄に「コメント」と入力される。
Commentbact3 Commentbact4 「対象薬品」欄にフリーコメントを記入する。スタンプ箱に登録したりカルテに展開すると,入力したコメントは「名称」欄に移動する。

 

order/BacteriaStampEditor.java および LBacteriaStampEditor.java の編集

BacteriaStampEditor.java は「エディタから挿入」のエディタ,LBacteriaStampEditor.java はスタンプ箱のエディタで,同じ箇所に同じように修正を加える。
public void propertyChange(PropertyChangeEvent e) {
 ・
 ・
 if (prop.equals("selectedItemProp")) {

  if (itemCount < NUM_ROWS) {

   MasterItem item = (MasterItem) e.getNewValue();

////↓ コメント 810000001 が選択されたら,項目に「コメント」と入れる
   if (item.getCode().equals("810000001")) item.setName("コメント");
////↑
   medTable.setValueAt(item, itemCount, NAME_COLUMN);
  ・
  ・

public Object getValue() {
 ・
 ・
 // item memo に薬品名
 memo = (String) tableModel.getValueAt(i, MEDICINE_COLUMN);
 if ((memo != null) && (!memo.equals(""))) {
  item.setMemo(memo);

////↓ コメント 810000001 の場合,memo 内容を item.name に移動する
  if (item.getCode().equals("810000001")) {
   item.setName(memo);
   item.setMemo("");
  }
////↑
 }
 ・
 ・

病名登録の日付

レセプトチェックで病名追加する場合など,診療していない日に病名を付けると,病名の開始日が診療した日ではなく,作業日の日付になってしまう。これを,最終診療日が設定されるように変更する。

 

client/DiagnosisDocument.java の編集

import 部分
////
import javax.swing.JMenuItem;
import java.awt.event.ActionEvent;
import open.dolphin.dto.DocumentSearchSpec;
import open.dolphin.infomodel.DocInfoModel;

 

変数宣言部分
////↓ 病名修飾語リスト
private static String[] DIAGNOSIS_PREP = {"右","左","両"};
private static String[] DIAGNOSIS_PREP_CODE = {"2056","2049","2057"};
private static String[] DIAGNOSIS_POST = {"の急性増悪","の二次感染","の再発","の術後","の治療後"};
private static String[] DIAGNOSIS_POST_CODE = {"8061","8069","8065","8048","8075"};
////↑    
////↓ 最終受診日=今日受診している場合は今日,していないばあいは最後の受診日
private int lastVisit_year; //// 
private int lastVisit_month;
private int lastVisit_day;
////↑    

 

initialize() 部分
private void initialize() {

    // コマンドボタンパネルを生成する
    JPanel cmdPanel = createButtonPanel2();
    ・
    ・
    // Preference から昇順降順を設定する
    ascend = Project.getPreferences().getBoolean(Project.DIAGNOSIS_ASCENDING, false);

////↓   最終受診日を調べる
    String lastVisit;
    String pvt = getContext().getPatientVisit().getPvtDateTrimTime(); // 今日受診していたら今日の日付,受診していなければ null。PvgDateTrimはTimeが日付でDateが時間

    if (pvt == null) {
      //今日の受診がない場合,DocumentHistory の table から読んでくる
      DocumentHistoryView dhv = (DocumentHistoryView) getContext().getDocumentHistory().getPanel();
      lastVisit = (String) dhv.getTable().getModel().getValueAt(0, 0); // 表の左上スミをキメ打ち 
    } else {
      // 今日の受診がある場合は,今日をセット
      lastVisit = pvt;
    }
    lastVisit_year = Integer.valueOf(lastVisit.substring(0,4));
    lastVisit_month = Integer.valueOf(lastVisit.substring(5,7)) - 1; // gc では month は 0 から始まるので注意
    lastVisit_day = Integer.valueOf(lastVisit.substring(8));
////↑
}

 

createDiagnosisPanel() 部分
private JPanel createDignosisPanel() {
      ・
      ・
  public void setValueAt(Object value, int row, int col) {
      ・
      ・
    case OUTCOME_COL:
      // JComboBox から選択
      ・
      ・
      // 疾患終了日を入れる
      if (Project.getPreferences().getBoolean("autoOutcomeInput", false)) {
        String val = entry.getEndDate();
        if (val == null || val.equals("")) {
////↓    転帰日の自動入力の基準日を,lastVisit にする
          //GregorianCalendar gc = new GregorianCalendar();
          GregorianCalendar gc = new GregorianCalendar(lastVisit_year, lastVisit_month, lastVisit_day);
////↑
        ・
        ・
      // 疾患終了日を入れる
      if (Project.getPreferences().getBoolean("autoOutcomeInput", false)) {
        String val = entry.getEndDate();
        if (val == null || val.equals("")) {
////↓    転帰日の自動入力の基準日を,lastVisit にする
          //GregorianCalendar gc = new GregorianCalendar();
          GregorianCalendar gc = new GregorianCalendar(lastVisit_year, lastVisit_month, lastVisit_day);
////↑

 

insertStamp() 部分
private void insertStamp(StampModel sm, int row) {

  if (sm != null) {
    RegisteredDiagnosisModel module = (RegisteredDiagnosisModel) BeanUtils.xmlDecode(sm.getStampBytes());

      // 今日の日付を疾患開始日として設定する
////↓疾患開始日を lastVisit に設定
      //GregorianCalendar gc = new GregorianCalendar();
      GregorianCalendar gc = new GregorianCalendar(lastVisit_year, lastVisit_month, lastVisit_day);
////↑
・
・

2009年1月21日 (水)

NetBeans の ant の設定

NetBeans から build.xml で jarbundlar.jar を使ったところ,NoClassDefFoundError が出るようになった。調べてみたところ,デフォルトでは,NetBeans.app 内にある ant が使われるが,その ant のバージョンが古くなっているのが原因だった。システムの ant を使ったら解決した。

  • 「環境設定→その他(M)→Ant」と選択して,Ant ホームを /usr/share/ant に設定する。
  • jarbundler-1.9.jar は, /usr/share/ant/lib に入れる。

 

その後,NetBeans を version 6.5 にアップデートしてみたら,ant の設定をデフォルトに戻してもエラーは出なくなった。

« 2008年12月 | トップページ | 2009年2月 »