ロゴ

プログラミング初心者がアプリ開発を目指すブログ

パネルの中身を書き換える- Javaでデスクトップトップアプリ(予定&ToDo管理)を作る-030

今回はパネルの中身を書き換える方法を紹介していきます。

パネルを書き換えるメソッド

パネルに入っているコンポーネントを取り除くには、
panel.remove(コンポーネント)
とします。

コンポーネントを全て取り除くには、
panel.removeAll()
とします。

コンポーネントのレイアウト等を変更した際に再描画したい場合は,
.revalidate()
を使います。(コンテナのサイズを変更した場合などは、.repaint()も併用する必要があるようです)

アプリへの実装

まず最初に、目標とするアプリの挙動を示しておきます。
アプリ実行
タスクtest1のチェックボックスが選択されている状態で、更新ボタンを押すと、、、
アプリ実行
タスクtest1が完了状態になり、タスク一覧に表示されなくなります。

MainFrameでTaskViewのリストを保持する

MainFramedeでTaskViewのリストを保持するために、MainFrameのフィールドに、
List todayTasks,tomorrowTasks,scheduleTasks,somedayTasks,doneTasks;
を追加します。

また前回作成したviewメソッドもListを返すように変更します。
更に、getterメソッドも作成します。

パネル書き換え部の実装

viewメソッドの引数に「”Today”」「”Tomorrow”」などのアクションコマンドを追加しておきます。
そして、受け取ったアクションコマンド cmdを更新ボタン updateのアクションに追加します。
update.setActionCommand(cmd);

更新ボタンにActionListenerを追加しましょう。今回は、DoneListenerというクラスを作成します。
update.addActionListener(new DoneListener());//DoneListnerの作成//第30回変更

パネルの中身を一旦削除するためにViewメソッドの最初にremoveAll()を書きます。
panel.removeAll();

パネルの更新を促すために、Viewメソッドの最後にrevalidate()を追加します。
panel.revalidate();


    public class MainFrame extends JFrame implements ActionListener{
      /*今までのコード*/
      List todayTasks,tomorrowTasks,scheduleTasks,somedayTasks,doneTasks;//第30回追加
      
      public MainFrame(String title){
       /* 今までのコード */
        }

        public void actionPerformed(ActionEvent e) {
          String cmd = e.getActionCommand();
          //System.out.println("MainFrame");
          if(cmd==null){
            return;
          }else{
            switch(cmd){
              case "Today" :
                Calendar calendar = Calendar.getInstance();
                Map mtProperty = new HashMap();
                mtProperty.put(PropertyName.STARTYEAR.toString(), calendar.get(Calendar.YEAR));
                mtProperty.put(PropertyName.STARTMONTH.toString(), calendar.get(Calendar.MONTH));
                mtProperty.put(PropertyName.STARTDATE.toString(), calendar.get(Calendar.DATE));
                mtProperty.put(PropertyName.STARTWEEK.toString(), calendar.get(Calendar.WEEK_OF_YEAR));
                mtProperty.put(PropertyName.FINISH.toString(), false);
                this.todayTasks=this.view(mtProperty,this.todayModePanel,cmd);//第30回変更
                calendar=null;
                mtProperty=null;
                break;
              case "Tomorrow" :
                Calendar tomorrow = Calendar.getInstance();
                tomorrow.add(Calendar.DATE, 1);
                Map mtProperty1 = new HashMap();
                mtProperty1.put(PropertyName.STARTYEAR.toString(), tomorrow.get(Calendar.YEAR));
                mtProperty1.put(PropertyName.STARTMONTH.toString(), tomorrow.get(Calendar.MONTH));
                mtProperty1.put(PropertyName.STARTDATE.toString(), tomorrow.get(Calendar.DATE));
                mtProperty1.put(PropertyName.STARTWEEK.toString(), tomorrow.get(Calendar.WEEK_OF_YEAR));
                mtProperty1.put(PropertyName.FINISH.toString(), false);
                this.tomorrowTasks=this.view(mtProperty1,this.tomorrowModePanel,cmd);//第30回変更
                tomorrow=null;
                mtProperty1=null;
                break;
              case "Schedule" :
                Map mtProperty2 = new HashMap();
                mtProperty2.put(PropertyName.WHETHER.toString(), true);
                mtProperty2.put(PropertyName.FINISH.toString(), false);
                this.scheduleTasks=this.view(mtProperty2,this.scheduleModePanel,cmd);//第30回変更
                mtProperty2=null;
                break;
              case "Someday" :
                Map mtProperty3 = new HashMap();
                mtProperty3.put(PropertyName.FINISH.toString(), false);
                this.somedayTasks=this.view(mtProperty3,this.somedayModePanel,cmd);//第30回変更
                mtProperty3=null;
                break;
              case "Done" :
                Map mtProperty4 = new HashMap();
                mtProperty4.put(PropertyName.FINISH.toString(), true);
                this.doneTasks=this.view(mtProperty4,this.doneModePanel,cmd);//第30回変更
                mtProperty4=null;
                break;
              default :
            }
          }
          layout.show(this.mainPanel,cmd);
        }
        public List view(Map pr,JPanel panel,String cmd){//第30回変更
          panel.removeAll();
          int n=0;//Taskを数える用の変数
          JPanel outer = new JPanel();//TaskViewを詰める用のパネル
          SpringLayout layout1 = new SpringLayout();//ScrollPaneを設定するためのレイアウト
          outer.setLayout(layout1);
          SpringLayout layout2 = new SpringLayout();//更新ボタンを設置するためのレイアウト
          panel.setLayout(layout2);
          JScrollPane scroll=new JScrollPane(outer) ;
          TaskProperty matching = new TaskProperty(pr);
          List matchingTasks = Main.box.search(matching);
          LinkedList taskView = new LinkedList(); 
          if(!matchingTasks.isEmpty()){
            for(Iterator i = matchingTasks.iterator(); i.hasNext();){
              Task task = (Task) i.next();
              taskView.add(new TaskView(task));
              if(n>0){
                layout1.putConstraint(SpringLayout.NORTH, taskView.get(n).getPanel(), 1, SpringLayout.SOUTH, taskView.get(n-1).getPanel());//前のタスクの1px下に配置
              }
              outer.add(taskView.get(n).getPanel());
              n=n+1;
            }
          }
          outer.setPreferredSize(new Dimension(700,61*(n)));//タスクの数に合わせてパネルのサイズを大きくする
          scroll.setPreferredSize(new Dimension(710,480));
          JButton update= new JButton("更新");
          update.setActionCommand(cmd);//第30回変更
          update.addActionListener(new DoneListener());//DoneListnerの作成//第30回変更
          layout2.putConstraint(SpringLayout.SOUTH, update, -10, SpringLayout.SOUTH, panel);//更新ボタンの位置設定
          layout2.putConstraint(SpringLayout.EAST, update, -10, SpringLayout.EAST, panel);
          panel.add(scroll);
          panel.add(update);
          panel.revalidate();//第30回変更
          return taskView;
        }
        public List getTaskViews(String cmd){//第30回追加
          switch(cmd){
          case "Today" : return this.todayTasks;
          case "Tomorrow" : return this.tomorrowTasks;
          case "Schedule" : return this.scheduleTasks;
          case "Someday" : return this.somedayTasks;
          case "Done" : return this.doneTasks;
          default : return null;
          }
        }
}

DoneListenerの作成

次に、DoneListenerを作成していきます。
アクションコマンド cmdに基づいて、TaskViewのリストを取得し、
チェックボタンが付いているタスクが未完了状態だったら、
そのタスクを完了状態にします。
properties.put(PropertyName.FINISH.toString(),true);

全てのTaskViewを捜査したら、mainFrame内のAcitonPerformedメソッドを呼び出して、パネルの更新を促します。
コードを見てみましょう。


import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Calendar;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
public class DoneListener implements ActionListener {
  public void actionPerformed(ActionEvent e) {
    String cmd = e.getActionCommand();
    List tasks=Main.mainFrame.getTaskViews(cmd);
    for(Iterator i = tasks.iterator(); i.hasNext();){
      TaskView taskView = (TaskView)i.next();
      if(taskView.getCheckBox().isSelected()){
        Task task=taskView.getTask();
        Calendar calendar = Calendar.getInstance();
        Map properties = task.getTaskProperty().getProperties();
        if(!(boolean)task.getTaskProperty().getProperty(PropertyName.FINISH.toString())){
          properties.put(PropertyName.FINISH.toString(),true);
          properties.put(PropertyName.WHETHER.toString(), false);
          properties.put(PropertyName.FINISHYEAR.toString(), calendar.YEAR);
          properties.put(PropertyName.FINISHMONTH.toString(), calendar.MONTH);
          properties.put(PropertyName.FINISHDATE.toString(), calendar.DATE);
          properties.put(PropertyName.FINISHWEEK.toString(), calendar.WEEK_OF_YEAR);
          properties.put(PropertyName.FINISHHOUR.toString(), calendar.HOUR_OF_DAY);
          properties.put(PropertyName.FINISHMINUTE.toString(), calendar.MINUTE);
        }
      } 
    }
  Main.mainFrame.actionPerformed(e);
  }
}

これで完成です。

アプリ開発記の次の記事はこちら => 第30回までの開発まとめ – Javaでデスクトップトップアプリ(予定&ToDo管理)を作る-まとめ編002

スポンサード リンク

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA