Skip to content

Zeroplex 生活隨筆

軟體開發和生活瑣事

小 縮小字型大小。 中 重設字型大小。 大 放大字型大小。

標籤: 程式設計

在 Java 中讓不同的按鍵有不同的動作

Posted on 2007 年 3 月 8 日2021 年 3 月 12 日 By 日落 在〈在 Java 中讓不同的按鍵有不同的動作〉中尚無留言

通常一個視窗中會有多個不同的按鈕,點下按鈕後,按鈕會分別有不同的動作。

假設我們寫了一個 JTextArea 讓使用者輸入資料,當按下「Add Line」按鈕時會自動換行,按下「Exit」按鈕時會結束程式。

程式碼:

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class panel0 {

JFrame frame = new JFrame();
JPanel panel = new JPanel();
JButton b1 = new JButton("Exit");
JButton b2 = new JButton("Add Line");
JTextArea text = new JTextArea(5,10);
JPanel panelControl = new JPanel();



public static void main(String[] arg){
panel0 gui = new panel0();
gui.go();
}

public void go(){

panel.setBackground(Color.gray);
panel.setLayout(new BoxLayout(panel,BoxLayout.Y_AXIS));

panelControl.setBackground(Color.gray);
panelControl.setLayout(new BoxLayout(panelControl,BoxLayout.X_AXIS) );

text.setLineWrap(true);
JScrollPane scroller = new JScrollPane(text);
scroller.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
scroller.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);

b1.addActionListener(this);
b2.addActionListener(this);

text.setText("Test string....n");
panel.add(scroller);
panelControl.add(b2);
panelControl.add(b1);

frame.getContentPane().add(BorderLayout.CENTER,panel);
frame.getContentPane().add(BorderLayout.SOUTH,panelControl);

frame.setSize(300,300);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}

public void actionPerformed(ActionEvent e){
if( e.getSource() == b1 )
System.exit(0);
else
text.append("new linen");
}

}

因為 JButton 所呼叫的 ActionListener 都會呼叫 actionPerfomed(),所以只好在此函式內判斷到底是哪個按鈕呼叫的,在依照不同的來源執行不同的動作。

public void actionPerformed(ActionEvent e){
if( e.getSource() == b1 )
System.exit(0);
else
text.append("new linen");
}

但是這樣寫一點會使的整個程式架構混亂,尤其是按鈕需要值型的動作很複雜時,以後要維護程式碼會變的很麻煩,因此要換一個方式來做。

Java 中有個東西叫做 inner class,也就是 class 中的 class。 Inner class 可以存取 outer class 中的變數和函式,但是要注意的是 inner class 是當 outer class 被建立時才會跟著一起被建立,不會單獨存在。

這時要為每個 JButton 建議一個 inner class:

class buttonListenerEXIT implements ActionListener{
public void actionPerformed(ActionEvent e){
System.exit(0);
}
}

class buttonListenerNewLine implements ActionListener {
public void actionPerformed(ActionEvent e){
text.append("new linen");
}
}

建立好 inner class 之後,要讓 JButton 的 ActionListener 會去呼叫寫好的函式:

b1.addActionListener(new buttonListenerEXIT());
b2.addActionListener(new buttonListenerNewLine());

改好之後,整個程式會變成這樣:

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class panel0 {

JFrame frame = new JFrame();
JPanel panel = new JPanel();
JButton b1 = new JButton("Exit");
JButton b2 = new JButton("Add Line");
JTextArea text = new JTextArea(5,10);
JPanel panelControl = new JPanel();



public static void main(String[] arg){
panel0 gui = new panel0();
gui.go();
}

public void go(){

panel.setBackground(Color.gray);
panel.setLayout(new BoxLayout(panel,BoxLayout.Y_AXIS));

panelControl.setBackground(Color.gray);
panelControl.setLayout(new BoxLayout(panelControl,BoxLayout.X_AXIS) );

text.setLineWrap(true);
JScrollPane scroller = new JScrollPane(text);
scroller.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
scroller.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);

b1.addActionListener(new buttonListenerEXIT());
b2.addActionListener(new buttonListenerNewLine());

text.setText("Test string....n");
panel.add(scroller);
panelControl.add(b2);
panelControl.add(b1);

frame.getContentPane().add(BorderLayout.CENTER,panel);
frame.getContentPane().add(BorderLayout.SOUTH,panelControl);

frame.setSize(300,300);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}

class buttonListenerEXIT implements ActionListener{
public void actionPerformed(ActionEvent e){
System.exit(0);
}
}

class buttonListenerNewLine implements ActionListener {
public void actionPerformed(ActionEvent e){
text.append("new linen");
}
}
}

Tags:Java, 程式設計

Compile and Execute Java Programs

Posted on 2007 年 2 月 26 日2021 年 3 月 12 日 By 日落 在〈Compile and Execute Java Programs〉中有 3 則留言

決定目前先不要偷懶用 Eclipse,還是用記事本慢慢 keyin 比較實在。

Java 是物件導向為主的語言,對語法上的要求也比 C++ 高出許多。首先來寫一個只有 5 行的 Hello World 程式。

public class test {
public static void main(){
System.out.println("Hello World");
}
}
存檔時記得要把檔名存成:test.java。在 Java 中,檔名是代表檔案中撰寫的 class 名稱,當檔名與程式中的 class 名稱不同時,編譯器便會出現錯誤訊息。

假設我把檔案存在 C:Java 底下,現在要編譯程式時,只要在命令提示字元中鍵入:

javac c:javatest.java

要打入絕對位址。編譯器編譯過會產生一個 test.class 檔,轉成 class 檔以後就可以執行看結果了:

java test

Tags:Java, 程式設計

C++ 輸入無限長度的字串

Posted on 2007 年 2 月 15 日2021 年 3 月 12 日 By 日落 在〈C++ 輸入無限長度的字串〉中有 6 則留言

通常我們都是把字串存在一個陣列當中,但是我們卻不知到使用者到底會輸入多長的字串,只能宣告成一個非常大的陣列,這樣不但沒有解決問題而且還浪廢掉不少空間。

下面程式碼,是使用動態記憶體配置來即時更改陣列大小,當陣列不夠大時,變會將陣列長度增加 10。

//編譯器:Dev-C++ 4.9.9.2

#include <iostream>
#include <cstdlib>
#include <conio.h>

using namespace std;

int main()
{
char *ch,*tmp;
char in;
int count=10,num=0;
// count紀錄陣列大小 num紀錄用掉的空間
int a;
ch = new char [count];
in = getch();
while( in != 'r' )
{
if( num >= count ) // 檢查陣列是否過小
{
tmp = new char [count+10]; //建立比原本大10的陣列
for(a=0;a<count;a++) //複製舊的陣列內容
tmp[a] = ch[a];
delete [] ch; // 刪除舊的資料
ch = tmp; // 繼承新的資料
count+=10;
}
num++;
ch[num-1] = in;
cout<<ch[num-1];

in = getch();
}
ch[num] = '';
cout<<endl<<endl<<ch<<endl<<endl;
system("pause");
return 0;
}

程式執行時,會先讀入字串直到使用者按下 Enter,接下來會把使用者輸入的字串重新再印出來。另外程式是使用 getch() 來讀取字串輸入,所以不必擔心作業系統給的暫存不夠大。

Tags:程式設計, 資訊學習

Get user IP in PHP

Posted on 2006 年 8 月 17 日2021 年 3 月 12 日 By 日落 在〈Get user IP in PHP〉中有 1 則留言

2012/09/30 更新:
以下內容不正確,請使用 $_SERVER[‘REMOTE_ADDR’] 取得使用者 IP 位址。

詳細請見:http://stackoverflow.com/questions/3003145/how-to-get-client-ip-address

CYJ 不要黑我啊 T口T


一般在取得使用者 IP 都是利用 $_SERVER[‘REMOTE_ADDR’] 這個環境變數,但是此變數只會紀錄最後一個主機 IP,所以當使用者瀏覽器有設定 Proxy 時,就無法取得他的真實 IP。

這時可以使用另一個環境變數 $_SERVER[‘HTTP_X_FORWARDED_FOR’] ,它會紀錄所經過的主機 IP,但是只有在使用者有透過 Proxy 時才會產生,所以可以像以下這樣寫來取得使用者真實 IP。

<?php
if (empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$myip = $_SERVER['REMOTE_ADDR'];
} else {
$myip = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
$myip = $myip[0];
}
echo $myip;
?>
Tags:PHP, 程式設計

PHP 中使用不同編碼連接 MySQL

Posted on 2006 年 7 月 23 日2021 年 3 月 12 日 By 日落 在〈PHP 中使用不同編碼連接 MySQL〉中尚無留言

MySQL 4 以後
似乎都會對所有欄位作編碼校對

不管你的 PHP 檔案編碼是 Big5 或是 UTF-8
使用 SQL 語法傳回來的中文資料都會變成亂碼

因此在資料庫連結成功以後
再加上一段語法

mysql_query("set names 'utf8' ");

namse 後面設定你使用的編碼
看是 big5 還是 utf8
這樣傳回來的資料就會和你網頁的編碼相符了

Tags:PHP, 程式設計, 資訊學習

文章分頁

上一頁 1 ... 13 14 15 下一頁

其他

關於我  (About me)

  文章 RSS Feed

  留言 RSS Feed

Apache AWS Bash C/C++ Docker FreeBSD GCP Git Google Java JavaScript Laravel Linux Microsoft MSSQL MySQL Nginx PHP PHPUnit PostgreSQL Python Qt Raspberry Pi Ubuntu Unix Vim Web Windows XD 作業系統 分享 好站推薦 專題 攝影 新奇搞笑 新聞 旅遊 生活雜記 程式設計 網路架站 網頁設計 資訊學習 資訊安全 遊戲 音樂


創用 CC 授權條款
本著作係採用創用 CC 姓名標示-相同方式分享 4.0 國際 授權條款授權.