20200820のJavaに関する記事は9件です。

jsf.ajax.request: Method must be called within a formとなった時の対応方法

  • 環境
    • CentOS Linux release 7.8.2003 (Core)
    • Eclipse IDE for Enterprise Java Developers.Version: 2020-03 (4.15.0)
    • openjdk version "11.0.7" 2020-04-14 LTS
    • JSF 2.3.9

事象 : f:ajaxを使った処理を実行したら怒られた

なんか動かないと思ったら、Chromeの開発ツールのConsoleにエラーが出ていた

Chromeの開発ツールのConsoleに出たエラー
jsf.js.jsf?ln=javax.faces:1 Uncaught Error: jsf.ajax.request: Method must be called within a form
    at Object.request (jsf.js.jsf?ln=javax.faces:1)
    at Object.ab (jsf.js.jsf?ln=javax.faces:1)
    at HTMLInputElement.onclick (upload.jsf:12)

原因 : formタグがないから

うっかりformタグを忘れていた。

xhtml
<body>
<!--省略-->
    <h:commandButton value="閉じる" action="#{uploadBean.close}">
      <f:ajax onevent="windowClose" />
    </h:commandButton>
  </div>
</body>
出力されたhtml
<input id="j_idt11:j_idt14" type="submit" name="j_idt11:j_idt14" value="閉じる" onclick="mojarra.ab(this,event,'action',0,0,{'onevent':windowClose});return false">

対応 : formタグの中にf:ajaxを配置する

xhtml
<body>
  <h:form>
<!--省略-->
      <h:commandButton value="閉じる" action="#{uploadBean.close}">
        <f:ajax onevent="windowClose" />
      </h:commandButton>
    </div>
  </h:form>
</body>
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

kotlinとjavaで前の画面に戻りたい!

はじめに…

この記事は5個前の記事で書いた、

7日間毎日記事投稿の6日目

になってます

使うコードは下に貼りますが、このアプリの詳しい機能はその5個前の記事をご覧ください!

↓ここからが今回の記事の本題です↓

それぞれの言語で前の画面に戻るには…

※これはツールバーの戻るボタンから一つ前の画面に戻るための方法です

ツールバーの実装方法

  • javaの場合
Toolbar 変数名 = findViewById(R.id.ツールバーのid);
setSupportActionBar(変数);

例)

WhoActiity.java
Toolbar whoTb = findViewById(R.id.who_tb);  // 30行目
setSupportActionBar(whoTb);
  • kotlinの場合
setSupportActionBar(ルバid)

例)

WhoActivity.kt
setSupportActionBar(who_tb)  // 21行目

javaはToolBar型の変数を作る必要があるが、kotlinは作る必要がない

ツールバーに戻るボタンをつけて戻る方法

  • javaの場合

(onCreate関数内)

getSupportActionBar().setDisplayShowHomeEnabled(true);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);

(onCreate関数外)

@Override
public boolean onSupportNavigateUp() {
    finish();
    return super.onSupportNavigateUp();
}

例)
(onCreate関数内)

WhoActivity.java
getSupportActionBar().setDisplayShowHomeEnabled(true);  // 32行目
getSupportActionBar().setDisplayHomeAsUpEnabled(true);

(onCreate関数外)

WhoActivity.java
@Override  // 69行目
public boolean onSupportNavigateUp() {
    finish();
    return super.onSupportNavigateUp();
}
  • kotlinの場合
supportActionBar?.let {  // 22行目
    it.setDisplayHomeAsUpEnabled(true)
    it.setHomeButtonEnabled(true)
} ?: IllegalAccessException("Toolbar cannot be null")
AndroidManifest.xml
<activity
    android:name=".WhoActivity"
    android:parentActivityName=".MainActivity" />  // ←ここを追加

例)

WhoActivity.kt
supportActionBar?.let {  // 22行目
    it.setDisplayHomeAsUpEnabled(true)
    it.setHomeButtonEnabled(true)
} ?: IllegalAccessException("Toolbar cannot be null")
AndroidManifest.xml
<activity  // 20行目
    android:name=".WhoActivity"
    android:parentActivityName=".MainActivity" />

javaはコードと新しく関数を定義する必要があり、kotlinはコードとAndroidManifest.xmlを編集する必要がある

最後に…

今回はjavaとkotlinでツールバーを使って前の画面に戻りました。
どちらの言語でも画面遷移よりも複雑なコードが必要だと感じました。

明日も記事を投稿するので、引き続き温かく見守ってください。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【JAVA】拡張子を除いて、ファイル名のみを取得する

目的

拡張子を除いて、ファイル名のみを取得する

実装例

example.java
import java.io.File;
String fullPathString = "/home/hoge/abc.txt";

public static String getFileName(final String fullPathString) {
        File file = new File(fullPathString);
        String basename = file.getName();
        String woext = basename.substring(0,basename.lastIndexOf('.'));
        System.out.println(woext);
    }
String basename = file.getName();

getName()メソッドでファイル名を取得する

String woext = basename.substring(0,basename.lastIndexOf('.'));

substring()メソッドで第一引数から第二引数文字目までを取得
lastINdexOf()メソッドで末尾から数えて何番目に引数(’.’)があるのか調べる

これでabcが表示されるはず

参考文献

https://java-code.jp/187
https://java-code.jp/795
http://simplesandsamples.com/basename-rmext.java.html

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Javaの標準出力を利用し配列から最大値を出力する

某サイトのJavaの練習問題。標準入力で整数nを入力した後、n個の任意の数値を入力してその中から最大値を出力するプログラムのメモ。

import java.util.Scanner;

public class Main{
   public static void main(String[] args){
      Scanner sc = new Scanner(System.in);
      //整数nを入力
      int num = sc.nextInt();
      int max = 0;
      int[] array = new int[num];

      //n回任意の数値の入力を行う
      for(int i = 0; i < num; i++){
         array[i] = sc.nextInt();
         if(max < array[i]){
            max = array[i];
         }
      }
      System.out.println(max);
   }
}
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

java8でOpenCVを使えるようにする。(自分用)

コマンドラインでJavaを実行する原始人

大学の卒研でOpenCVを使わざるをえないので導入した
その道しるべ
今検索してもほとんどがPythonやC++での話でjavaの話が少ないので苦労した。

参考サイト

基本的に以下のサイトに従順してやりました。基本的にこっちのほうが丁寧です。ただ、今の最新のVer(4.4.0)だとテストコードがうまく実行できないのでそこは書きます。
JavaでOpenCVを使う | JProgramer

イソストール

ダウンロードした.exeファイルを実行、Cドライブに展開するのが良いとのことで私はOpenCVなるフォルダを作成しそこに展開。
7-Zip self-extracting archive 2020_08_20 15_43_43.png

パスを通す

参考サイトではユーザ変数ですが私はシステム変数に追加しました。
「Path」を選択し、[編集]をクリック。一番下に
C:\OpenCV\opencv\build\java\x86
を追加、OpenCVをjavaで使うだけならこれだけの追加でいい、Pythonで使うとか、VisualStudioで利用するとかならこれだけじゃダメです。
私は一応VS2017が入っているんでそれ用にもパスを通してます。
クラスパス.PNG

最後の部分はjavaが32bitなら[x86]、64bitなら[x64]
私はマシンが64bitなので、64bitだと思ってテストコード(後述)を実行したら「俺は32bitだ!64bitのプログラムなんてムリ!」みたいなエラーがでたんで、必ずしもマシンとjavaのbitが同じとは限らないみたいです。

テストコード

参考サイトのテストコードはVer.4.4.0ではエラーが出ます。
具体的には画像の出力するクラスがhighguiではなく、imgcodecsに移っています。

Test.java
import org.opencv.core.Core;
import org.opencv.core.CvType;
import org.opencv.core.Mat;
import org.opencv.core.Scalar;
import org.opencv.imgcodecs.Imgcodecs;

public class Test{
    public static void main(String[] args){
        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
        Mat redImg=new Mat(100,200,CvType.CV_8UC3,new Scalar(0,0,255));
        Imgcodecs.imwrite("test.jpg",redImg);
    }
}

コンパイルコマンドは以下↓

javac -classpath “C:\保存したフォルダ\opencv\build\java\opencv-バージョン.jar” Test.java

これを

java -cp .;C:\保存したフォルダ\opencv\build\java\opencv-バージョン.jar Test

で実行すると同じフォルダに真っ赤なJPG画像が出力(保存)されました。

クラスパスを設定すると

javac Test.java
java Test

で実行できます。詳しくは参考サイトを見てくだちい。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

51歳(現52)からのプログラミング  備忘 VScode javadoc

VScodeでjavadocするには拡張が必要です

[ Javadoc Tools ]

これで大丈夫ですね!

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

javaにelse-ifは存在しないらしい

検証すること

私はある日、else ifについて、javaでは

if (flag) {
    System.out.println("Hi!");
}

を波括弧を省略して(三項演算子を使ったほうがいいですが、ここでは考えないこととします)

if (flag)
    System.out.println("Hello!");

とすることができる。もしかしたら、else-ifは、

if (flag) {
    System.out.println("Hello!");
} else {
    if (flag2) {
        System.out.println("Hello World");
    } else {
        System.out.println("hi");
    }
}

の波括弧を省略したものではないかと考えました。

判定方法

波括弧を省略したものとそうでないもののバイトコード(classファイル)が合致するかどうかを調べます。

結果

fcコマンドで比較したところ同じらしい。

参考

https://arakik10.hatenadiary.org/entry/20161206/p1
https://www.k-tanaka.net/cmd/fc.php

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

javaとpythonの違いを列挙してみた

※注意 気づいたものを順次追記する

java屋さんがpythonを使いだして、違いにびっくりしたものを列挙する。
またその対処方法を残す。

switch文

pythonにはswitchにあたる構文がない。
switchがなければifでやればいいじゃないという発想らしい。
もしくは辞書を使った方法もある。

Python に switch や case 文がないのはなぜですか?(公式サイト)

辞書で使った方法
def function_1():
    print('function_1')
def function_2():
    print('function_2')

functions = {'a': function_1, 'b': function_2}

func = functions['b']
func()

↓実行結果↓
function_1

定数

pythonには厳密な定数はなく、
全部大文字に命名することで運用的に定数のように扱う。
単なる変数なので当然その気になれば変更できる。

インターフェイス

pythonにはインターフェイスが存在しない。
ABC(Abstract Base Classes)という抽象クラスの概念はあるので特に困らないかな。
全部抽象メソッドにすればいいだけ。

抽象クラスの書き方(abctest.py)
from abc import ABC, abstractmethod

class Animal(ABC):
    @abstractmethod
    def sound(self):
        pass

class Cow(Animal):
    def sound(self):
        print("moo")

class Penguin(Animal):
    pass  # 抽象メソッドを実装していない

if __name__ == "__main__":
    hanako = Cow()
    hanako.sound()

    taro = Penguin()  # 抽象メソッドを実装していないのでインスタンス化時にエラーになる
実行結果
moo
Traceback (most recent call last):
  File "abctest.py", line 19, in <module>
    taro = Penguin()
TypeError: Can't instantiate abstract class Penguin with abstract methods sound

オーバーロード

pythonにはオーバーロードという概念がない。
オーバーロードのようなことをするには引数のデフォルト設定や可変長引数を使う。

オーバーロードしようとするとエラーになる例

これはダメ
class Farm:
    def add(self, animal):
        print(animal)
    def add(self, animal1, animal2):
        print(animal1)
        print(animal2)

if __name__ == "__main__":
    farm = Farm()
    farm.add('Dog')
    farm.add('Jersey','Holstein')

↓実行結果↓
Traceback (most recent call last):
  File "farmtest.py", line 13, in <module>
    farm.add()
TypeError: add() missing 2 required positional arguments: 'animal1' and 'animal2'

これはOK

class Farm:
    def add(self, animal='Chicken'):
        print(animal)

if __name__ == "__main__":
    farm = Farm()
    farm.add()
    farm.add('Dog')

↓実行結果↓
Chicken
Dog
class Farm:
    def add(self, *args):
        if len(args) == 0:
            print('blank')
        for i in args:
            print(i)

if __name__ == "__main__":
    farm = Farm()
    farm.add()
    farm.add('Dog')
    farm.add('Jersey','Holstein')

↓実行結果↓
blank
Dog
Jersey
Holstein

ApplicationContext

JavaのServletやspringframeworkでSessionスコープより広範囲のApplicationContextに該当するものはdjangoにはない。
djangoを使っているから?

ラベル付きbreak

javaで2重ループから一気に抜け出すようなときに使うラベル付きbreakはpythonにない。
javaでもあまり使わないから、まいいか。

ローカル変数の有効範囲(スコープ)

pythonは関数内有効。
javaはブロック内有効。

これは、、java屋さんからすると扱いづらい・・・。

フィールド定義位置

javaのインスタンス変数のような書き方をするとpythonではクラス変数の意味になってしまうので注意!
最初うっかり書き間違えたら動きが想定外になってびっくりした。

class Cow:
    type = 'Holstein'  # クラス変数
    def __init__(self, name):
        self.name = name  # インスタンス変数
    def walk(self):
        print(self.name + 'が歩く')

hanako = Cow('はなこ')
hanako.walk()

↓実行結果↓
はなこが歩く
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Java覚え書き

java

Oracleから対象のJDKインストーラをダウンロード
2019/4/19からダウンロードにアカウントらしきものが必要になった。
めんどい、プロファイルは作ったら削除するには18か月一切いじらず個人情報を消されるのを待つか、自分で問い合わせフォームから削除依頼をしなくてはならない、めんどい

インストール後環境変数の指定をする
こういうの(プログラム関係)は、PCのシステムにインストールしてあることを教えなくてはならない、それをする(じゃあ果たしてこれはインストールといえるのか?)

検索で「システム環境変数の編集」より編集する。
(コントロールパネル→システム→システムの詳細設定)

システム環境変数
変数名 JAVA_HOME
値 C:~~\Java\jdk1.8.0_261

変数名「Path」の値に
%JAVA_HOME%\bin
を追加

とりあえずこれで定番の
Hello_World
はできるはず、メモ帳かなんかで

Hallo_World.java
public class Hallo_World{
    public static void main(String[] args){
        System.out.println("Hello World");
    }
}

を保存して、
コマンドプロンプト上で

D:\ダウンロード\University\java>javac Hallo_World.java

D:\ダウンロード\University\java>java Hallo_World
Hello World

D:\ダウンロード\University\java>

とりあえずこれでJavaが使えるようになったぜ。

いちいちコンパイル時や実行時にjarファイル指定するのがめんどいから
CLASSPATHを設定するといちいち書かなくて済むらしい。
これはユーザー環境変数でもいいらしい。(まぁこのパソコン使うの私だけだし関係ないか)

ユーザー環境変数
 

変数名 CLASSPATH
変数値 .;C:\OpenCV\opencv\build\java\opencv-440.jar

初めて設定するときは変数値の「.;」を忘れずに、
あくまでコマンドラインで実行するときの話、統合開発環境で必要かは知らない。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む