[Android] 圖片要怎麼填滿layout/填滿螢幕?(How to make ImageView fill the layout/screen?)

若你的parent layout就是整個螢幕的話
在layout屬性裡面加入以下兩行

android:scaleType="centerCrop"
android:adjustViewBounds="true"

就會填滿螢幕了

繼續閱讀 [Android] 圖片要怎麼填滿layout/填滿螢幕?(How to make ImageView fill the layout/screen?)

[Java] 在Java中執行Apple Script (How to run apple script in Java?)

這兩行 Apple script

set volSettings to get volume settings
set volume output volume ((output volume of volSettings) + 7)

是讓 Mac 的系統音量提高一格

同理,要讓它降一格就改成 -7 就行了

 

ps. Mac 的系統音量是 16 格 而 apple script 的音量值大小是以百分比來看 所以就用 100/16 = 6.25 每一格,取整數為 7

這支 Demo 是在 java 中執行上述的兩行 Apple script

 

完整 Code:

class AppleScriptTesting{
	public static void main(String[] args){
		Runtime runtime = Runtime.getRuntime();
		String applescriptCommand =  "set volSettings to get volume settings\n" + 
                             "set volume output volume ((output volume of volSettings) + 7)\n";
		String[] script = { "osascript", "-e", applescriptCommand };

		try{
			Process process = runtime.exec(script);
		}catch(Exception e){
			e.printStackTrace();
		}
	}
}

 

參考:

Java AppleScript: How to run a multi-line Applescript command from a Java program: https://alvinalexander.com/blog/post/java/how-run-multi-multiple-line-applescript-java-program

[Java] 把 Java 的選單列改到 Mac 的選單列上(Put JMenuBar to Native Mac OS X menubar)

使用前:

使用後:

 


一開始我是找到這篇:

https://alvinalexander.com/apple/mac/java-mac-native-look/Putting_JMenuBar_on_Mac_men.shtml

把下面這行加入到程式碼裡:

System.setProperty("apple.laf.useScreenMenuBar", "true");

發現無效!

 

然後又看到別篇有人說要在main function的很早就要放 System.setProperty 這行了

我把它移到 main 的最上面了,還是不行!

 

 

後來是這篇成功了:

https://stackoverflow.com/questions/1654531/jmenubar-at-the-top-in-macosx

原來是我加入 JMenuBar 和原來的不一樣

要使用 setJMenuBar 的方式來加入選單列才可以用

System.setProperty("apple.laf.useScreenMenuBar", "true");

放到 Mac OS X的原生選單列上

 

我原來加入選單列的方式是:

Container contentPage = getContentPane();
contentPage.add(menubar, BorderLayout.NORTH);

 

 

[Mac] run a system notification in Java

Java 程式端可以呼叫終端機來執行 apple script

靠的是 runtime.exec(args); 這行,來執行 args 的參數們

 

而實際執行的指令是

osascript -e 'display notification "Take a break" with title "Time up!!!" sound name ""'
//可直接在終端機執行

 

我是放在 timer 倒數完結後(timeOut Override method),引發一個系統通知:

Runtime runtime = Runtime.getRuntime();
String[] args = { "osascript", "-e", "display notification \"Take a break\" with title \"Time's Up!!!\" sound name \"\"" };

try
{
    Process process = runtime.exec(args);
}
catch (IOException ioError)
{
    ioError.printStackTrace();
}

references:

https://alvinalexander.com/blog/post/java/how-run-execute-applescript-java-mac

https://apple.stackexchange.com/questions/57412/how-can-i-trigger-a-notification-center-notification-from-an-applescript-or-shel

[Mac App] A simple Menu Bar App in Java

import java.awt.AWTException;
import java.awt.Image;
import java.awt.MenuItem;
import java.awt.PopupMenu;
import java.awt.SystemTray;
import java.awt.Toolkit;
import java.awt.TrayIcon;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.net.MalformedURLException;
import java.net.URL;

public class MenuBarIconTest {
    public static void main(String[] args) throws MalformedURLException {
        TrayIcon trayIcon = null;
         if (SystemTray.isSupported()) {
             // get the SystemTray instance
             SystemTray tray = SystemTray.getSystemTray();
             // load an image
             Image image = Toolkit.getDefaultToolkit().getImage(new URL("http://cdn1.iconfinder.com/data/icons/Hypic_Icon_Pack_by_shlyapnikova/16/forum_16.png"));
             // create a action listener to listen for default action executed on the tray icon
             ActionListener listener = new ActionListener() {
                 public void actionPerformed(ActionEvent e) {
                     System.out.println("action");
                     // execute default action of the application
                     // ...
                 }
             };
             // create a popup menu
             PopupMenu popup = new PopupMenu();
             // create menu item for the default action
             MenuItem defaultItem = new MenuItem("Do the action");
             defaultItem.addActionListener(listener);
             popup.add(defaultItem);
             /// ... add other items
             // construct a TrayIcon
             trayIcon = new TrayIcon(image, "Tray Demo", popup);
             // set the TrayIcon properties
             trayIcon.addActionListener(listener);
             // ...
             // add the tray image
             try {
                 tray.add(trayIcon);
             } catch (AWTException e) {
                 System.err.println(e);
             }
             // ...
         } else {
             // disable tray option in your application or
             // perform other actions
             //...
         }
         // ...
         // some time later
         // the application state has changed - update the image
         if (trayIcon != null) {
             //trayIcon.setImage(updatedImage);
         }

    }
}

 

reference:

https://stackoverflow.com/questions/13481504/creating-an-nsstatusitem-menubar-app-in-java

[Mac App] 以Java檔從零打造Mac App

  1. 打包寫好的 Java 程式,製作成 Jar 檔
  2. 將 Jar 檔打包成可以在 Mac 點兩下就執行的 Mac App

 

將編譯好的Class 打包成Jar

除了class檔們之外,還要製作一個純文字檔: manifest.mf (副檔名也可以是txt)

裡面內容為:(主要是要指定我們的起始MainClass是哪一個檔案)

Main-Class: HelloWorld



// 注意: 1. Main-Class寫完後,要往下空兩行
//       2. Main-Class的冒號後面記得要加一個空白

(假設我們的起始class檔為 HelloWorld.class的話,完成MainClass設定後,存檔為 manifest.mf)

 

再來打開終端機,輸入

$ jar cvfm MyJar.jar manifest.mf HelloWorld.class HelloWorld$1.class
// cvfm 的順序,會影響到後面接的參數順序

如果有很多個 class 檔也可以寫成
$ jar cvfm MyJar.jar manifest.mf *.class

就成功打包成為 MyJar.jar 檔

 

將 Jar 打包成 Mac App

可以利用現成的程式來打包: jar2app

從名字就可以推斷出,就是要將 jar 轉為 app 檔

這支程式是以終端機指令來進行包裝

 

安裝方式:

$ git clone https://github.com/Jorl17/jar2app
$ cd jar2app
$ chmod +x install.sh uninstall.sh
$ sudo ./install.sh

 

安裝完後,

將終端機目錄切換到 Jar 檔的所在目錄

$ jar2app MyJar.jar -i icon.icns

( icns 檔為 Mac App 的 icon 樣子,需事先準備好)

隨即就產生 MyJar.app 的 Mac App 囉

 

 

[Java] 找因數、判斷質數

import java.util.*;


public class PrimeFactorJudger{
	public static void main(String[] args){

		//從執行時的輸入字串找出所有因數、判斷是否質數
		for(String inputString:args){
			if(isNumeric(inputString)){
				int inputNumber = Integer.parseInt(inputString);
				printAllFactor(inputNumber);
				isPrime(inputNumber);
			}else{
				System.out.println(inputString + " is not Numeric");
			}
		}

		//找出100以內的質數
		/*
		for(int i=1; i<=100; i++){
			isPrime(i);
		}
		*/

	}

	public static void isPrime(int inputNumber){
		try{
			Queue<Integer> factors = findFactors(inputNumber);
			//factors = findFactors(inputNumber);
			if(factors.size() == 2){
				System.out.println(inputNumber+ " is Prime");
			}else{
				System.out.println(inputNumber+ " is not Prime");
			}
		}catch(Exception e){
			System.out.println("Exception!");
		}
	}


	public static void printAllFactor(int inputNumber){

		System.out.print(inputNumber+ "的因數有: ");
		System.out.println(findFactors(inputNumber));
	}

	public static Queue findFactors(int inputNumber){
		Queue<Integer> factors = new LinkedList<>();
		for(int i=1; i<=inputNumber; i++){
			if(inputNumber%i == 0){
				factors.add(i);
			}
		}
		return factors;
	}

	public static boolean isNumeric(String str){
		return str.matches("-?\\d+(\\.\\d+)?");  //match a number with optional '-' and decimal.
	}

}

 

如何執行:

javac PrimeFactorJudger.java
java PrimeFactorJudger 參數們
e.g.
java PrimeFactorJudger 13 100 20 39 abc

Java編譯器的參數怎麼下

假設我們想要把程式java檔和編譯過的class檔分開在不同資料夾下

project資料夾底下放著 src 和 classes 兩個資料夾

src: 放java檔(原始碼),目前裡面有兩個檔案:Main.java, Console.java

classes: 放class檔(編譯後),目前裡面為空

 

開啟terminal,將目錄切換到project資料夾,輸入

javac -verbose -sourcepath src -d classes src/Main.java

-verbose:可以看到編譯的過程

-sourcepath:之後接的參數src,就是我們存放java檔的資料夾

-d:之後接的參數classes,就是我們想要放編譯後的class檔的資料夾(可以把d想成destination或directory)

最後接的參數就是我們想要編譯的檔案,放在src資料夾底下的Main.java檔

 

也可以再多下一個參數

-cp/ -classpath:之後接的參數,在這個情況是classes資料夾,也就是如果整個專案中,在classes裡,有些檔案沒有更改,就不會重新再編譯一次

Java – calculate the day of the date (給定日期算出星期幾)

Input:

08 05 2015

Output:

WEDNESDAY

 

非常陽春的解法:(且不考慮到很過去的年份)

public class Solution {
    public static String getDay(String day, String month, String year) {
        /*
        * Write your code here.
        */
        int y=0, m=0, d=0, c=0, w=0;
        String weekday="";
        
        d = Integer.parseInt(day);
        y = Integer.parseInt(year.substring(2,4));
        c = Integer.parseInt(year.substring(0,2));
        m = Integer.parseInt(month);
        if(m == 1){
            m = 11;
            y--;
        }else if(m == 2){
            m = 12;
            y--;
        }else{
            m = m-2;
        }
       
        w = (int)(d+(2.6*m -0.2)+(5*(y%4))+3*y+(5*(c%4)))%7;
       
        //System.out.println("y="+y+ ", d="+d+", m="+m+", c="+c+", w="+w);        
        
        switch(w){
            case 0:
                weekday= "SUNDAY";
                break;
            case 1:
                weekday= "MONDAY";
                break;
            case 2:
                weekday= "TUESDAY";
                break;
            case 3:
                weekday= "WEDNESDAY";
                break;
            case 4:
                weekday= "THURSDAY";
                break;
            case 5:
                weekday= "FRIDAY";
                break;
            case 6:
                weekday= "SATURDAY";
                break;
        }
        
        return weekday;
    }

public static void main(String[] args) {
 Scanner in = new Scanner(System.in);
 String month = in.next();
 String day = in.next();
 String year = in.next();
 
 System.out.println(getDay(day, month, year));
 }
}

 

參考:

  1. wiki 高斯公式: https://zh.wikipedia.org/wiki/星期的計算#.E7.AE.97.E6.B3.95