1. 程式人生 > 其它 >Java 搭建一個可互動的窗體程式

Java 搭建一個可互動的窗體程式

技術標籤:Java

簡單地顯示一個視窗所需的最少程式碼

import javax.swing.JFrame;

public class main {

	static class Win extends JFrame{//static不能少
		Win()
		{
			setVisible(true);//setv
		}
	}
	
	public static void main(String[] args) {
		// TODO 
		new Win();
	}
}

報錯:No enclosing instance of typeis accessible. Must qualify the allocation with an enclosing

解決方案一:

主程式是public static class main

在Java中,類中的靜態方法不能直接呼叫動態方法。

靜態main方法中只能呼叫靜態類

在呼叫類前加static可解決

解決方案二(本質):不小心把窗體類寫成了主類的內部類,應該寫成外部類才對,這樣就不用static了

import javax.swing.JFrame;

class Win extends JFrame{
		Win()
		{
			setVisible(true);//setv
		}
	}

public class main {
	public static void main(String[] args) {
		// TODO 
		new Win();
	}
}

顯示一個單行文字框

類中

JTextArea path=new JTextArea();//JTA

建構函式中

add(path);

不可以使用path.add();

當有兩個控制元件的時候,必須使用中間容器裝載,不然有一個看不見

類中

JPanel top=new JPanel();//JPA

建構函式中

add(top);
top.setLayout(new GridLayout(2,1));//setl+gri
top.add(path);
top.add(text);

優化佈局

一、將容器top放置於整個窗體的北區

add(top,BorderLayout.NORTH);//bord

二、將Text放置於容器Centre內部,Centre使用網格佈局,僅有一行一列

類中

JPanel centre= new JPanel();

建構函式中

centre.setLayout(new GridLayout(1,1));

centre.add(text);

三、在容器top內部相對文字框的下方增加一個按鈕欄bp,欄中存放按鈕R

類中

JPanel bp=new JPanel();

建構函式中

top.add(bp,BorderLayout.CENTER);//若文字框指定了位置NORTH,按鈕欄則不必指定位置Centre
bp.setLayout(new GridLayout(1,2));//一行兩列
bp.add(R);

四、設定窗體位置、大小、標題和關閉方式

setLocation(400, 100);//setl

setTitle("檔案讀寫");//sett

setSize(300, 200);//sets
setDefaultCloseOperation(EXIT_ON_CLOSE);//setd

這樣,一個簡易的窗體介面就佈置好了

但是,這個介面目前只能看,沒有互動

為窗體新增動作監聽

在類名後宣告介面

implements ActionListener //im act

為按鍵新增監聽器

R.addActionListener(this);//adda this

在報錯處自動新增動作實施函式

public void actionPerformed(ActionEvent e) {
// TODO 自動新增

}

在函式內部新增按鈕分支

Object s=e.getSource();//Object e.gets

if(s==R)
{
System.out.println("按下了讀入鍵");
}

執行效果:

這樣,一個可互動的窗體就建立好了~

import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JTextField;

class Win extends JFrame implements ActionListener//im act
{
	JTextArea path=new JTextArea();//JTA
	JTextField text=new JTextField();//JTF
	JPanel top=new JPanel();//JPA
	JPanel centre= new JPanel();
	JPanel bp=new JPanel();
	JButton R=new JButton("讀入");//JB
	Win()
	{
		add(top,BorderLayout.NORTH);//bord
		add(centre,BorderLayout.CENTER);
		top.setLayout(new GridLayout(2,1));//setl+gri
		centre.setLayout(new GridLayout(1,1));
		top.add(path,BorderLayout.NORTH);
		top.add(bp,BorderLayout.CENTER);
		bp.setLayout(new GridLayout(1,2));
		bp.add(R);
		centre.add(text);
		
		R.addActionListener(this);//adda this
		
		setLocation(400, 100);//setl
		setSize(300, 200);//sets
		setTitle("檔案讀寫");//sett
		setDefaultCloseOperation(EXIT_ON_CLOSE);//setd
		setVisible(true);//setv
	}
	public void actionPerformed(ActionEvent e) {
		// TODO 自動新增
		Object s=e.getSource();
		if(s==R)
		{
			System.out.println("按下了讀入鍵");
		}
	}
}


public class main {

	public static void main(String[] args) {
		// TODO 
		new Win();
	}
}

讀寫檔案

獲取路徑

String pathString=path.getText();//gett

獲取檔案

File file=new File(pathString);

自動新增

讀取檔案

FileReader fileReader=new FileReader(file);//filer

有如下提示,則在動作實施函式中新增trycatch、將所有if語句丟進去

緩衝器內容讀取(考試的時候、變數命名可以用自動的,節省時間)

BufferedReader bufferedReader=new BufferedReader(fileReader);//bu

文字讀取

String line="";
String textString="";
while((line=bufferedReader.readLine())!=null)
{
textString=textString+line+"\n";
}

文字顯示

text.setText(textString);//sett

效果:

寫入

FileWriter fileWriter=new FileWriter(file);//filew

fileWriter.write(text.getText());
fileWriter.close();

效果:

成功更改了文字內容

import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JTextField;

class Win extends JFrame implements ActionListener//im act
{
	JTextArea path=new JTextArea();//JTA
	JTextField text=new JTextField();//JTF
	JPanel top=new JPanel();//JPA
	JPanel centre= new JPanel();
	JPanel bp=new JPanel();
	JButton R=new JButton("讀入");//JB
	JButton W=new JButton("寫入");
	Win()
	{
		add(top,BorderLayout.NORTH);//bord
		top.setLayout(new GridLayout(2,1));//setl+gri
		top.add(path,BorderLayout.NORTH);
		top.add(bp);
		bp.setLayout(new GridLayout(1,2));
		bp.add(R);
		bp.add(W);
		
		add(centre,BorderLayout.CENTER);
		centre.setLayout(new GridLayout(1,1));
		centre.add(text);
		
		R.addActionListener(this);//adda this
		W.addActionListener(this);//adda this
		
		setLocation(400, 100);//setl
		setSize(300, 200);//sets
		setTitle("檔案讀寫");//sett
		setDefaultCloseOperation(EXIT_ON_CLOSE);//setd
		setVisible(true);//setv
	}
	public void actionPerformed(ActionEvent e) {
		// TODO 自動新增
		Object s=e.getSource();
		try {
			if(s==R)
			{
				System.out.println("按下了讀入鍵");
				String pathString=path.getText();//gett
				File file=new File(pathString);
				FileReader fileReader=new FileReader(file);//filer
				BufferedReader bufferedReader=new BufferedReader(fileReader);//bu
				String line="";
				String textString="";
				while((line=bufferedReader.readLine())!=null)
				{
					textString=textString+line+"\n";
				}
				text.setText(textString);//sett
			}
			if(s==W)
			{
				String pathString=path.getText();//gett
				File file=new File(pathString);
				FileWriter fileWriter=new FileWriter(file);//filew
				fileWriter.write(text.getText());
				fileWriter.close();
			}
		} catch (Exception e2) {
			// TODO: handle exception
		}
	}
}


public class main {

	public static void main(String[] args) {
		// TODO 
		new Win();
	}
}