Swing] JLabelの説明と使用例
JLabelオブジェクトは、テキスト、画像、またはその両方を表示することができます。垂直方向と水平方向のアライメントを設定することによって、ラベル表示領域内のラベル内容をどこに配置するかを指定することができます。デフォルトでは、ラベルはその表示領域内で垂直方向に中央配置されます。デフォルトでは、テキストのみのラベルは先頭でエッジアライメントされ、画像のみのラベルは水平方向でセンタリングされます。また、画像に対するテキストの位置を指定することができます。デフォルトでは、テキストは画像の終端にあり、テキストと画像は共に垂直方向に配置されます。
コンストラクトメソッドの説明です。
JLabel() は、画像なし、タイトルとして空の文字列を持つ JLabel を作成します。
JLabel(Icon image) 指定された画像を持つJLabelのインスタンスを作成します。
JLabel(Icon image, int horizontalAlignment) 指定された画像と水平アライメントを持つ JLabel のインスタンスを作成します。
JLabel(String text) 指定されたテキストを持つ JLabel インスタンスを作成します。
JLabel(String text, Icon icon, int horizontalAlignment) 指定されたテキスト、画像、および水平アライメントを持つ JLabel インスタンスを作成します。
JLabel(String text, int horizontalAlignment) 指定されたテキストと水平方向のアライメントを持つ JLabel インスタンスを作成します。
共通のメソッドです。
getHorizontalAlignment() X 軸に沿ったラベルコンテンツのアライメントを返します。
getHorizontalTextPosition() ラベルのテキストと画像の水平方向の相対位置を返します。
getIcon()は、このタグが表示するグラフィックイメージ(グリフ、アイコン)を返します。 getText()は、このタグが表示するテキスト文字列を返します。
setHorizontalAlignment(int alignment) X 軸に沿ったラベルコンテンツのアライメントを設定します。
setHorizontalTextPosition(int textPosition) 画像に対するラベルのテキストの水平位置を設定します。
setIcon(Icon icon) このコンポーネントによって表示されるアイコンを定義します。
setText(String text) このコンポーネントに表示される一行のテキストを定義します。 setUI(LabelUI ui) このコンポーネントをレンダリングする L&F オブジェクトを設定します。
setVerticalAlignment(int alignment) Y 軸に沿ったラベル内容のアライメントを設定します。
setVerticalTextPosition(int textPosition) 画像に対するラベルのテキストの垂直位置を設定します。
JLabelに画像とテキストを追加する
package test;
import java.awt.FlowLayout;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing;
/* Found in the interface for writing swing with
JFrame.setDefaultLookAndFeelDecorated(true), the display of the dialog window will use the appearance of Java style than the original beautiful.
Later, I found out that using the change method has no effect
It turns out that this method has to be written before the new JFrame() object.
The error.
JFrame f = new JFrame("Demo");
JFrame.setDefaultLookAndFeelDecorated(true);
Correct.
JFrame.setDefaultLookAndFeelDecorated(true);
JFrame f = new JFrame("Demo");
In addition, when writing the interface must be careful to write a method to close the window
I practiced writing a lot of interfaces today, and then I found that my computer was getting slower and slower, and the memory was running out. I checked carefully to find that after running an interface without writing a method to close it, it was still running in the background.
1.
JFrame f = new JFrame();
f.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
});
2.
After closing the window in JTable, let the background application close as well
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
*/
public class WorldClock {
public static void main(String[] args) {
JFrame.setDefaultLookAndFeelDecorated(true);
JFrame frame = new JFrame();
frame.setTitle("JLabel Test");
frame.setLayout(new FlowLayout());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
ImageIcon imageIcon = new ImageIcon("001.jpg");
// LEFT, RIGHT, CENTER, LEADING, TRAILING and other parameters indicate the content alignment in the label: left-aligned, right-aligned, centered, top-aligned, bottom-aligned
/* The first initial value, the second alignment B: Label() constructs an empty label.
Label(String text)
Constructs a new label with the specified text string, whose text alignment is left-aligned.
Label(String text, int alignment)
Constructs a new label displaying the specified text string with the specified text alignment.
C: label1.setHorizontalAlignment(SwingConstants.CENTER);
label1.setVerticalAlignment(SwingConstants.TOP);
The Label class provides two methods to set its alignment.
#setHorizontalAlignment: sets the horizontal alignment.
Its valid parameters are.
¨ SwingConstants.LEFT: left alignment; (default value, i.e. left alignment if not set)
¨ SwingConstants.CENTER: center alignment.
RIGHT: right-aligned; */
JLabel label = new JLabel("Mixed", imageIcon, SwingConstants.RIGHT);
frame.add(label);
/* What the Pack() method does: resizes this window to fit the preferred size and layout of its child components. If the window and/or its owner are not yet available for display, the
it will become displayable until the preferred size is calculated. After the preferred size is calculated, the window will be validated. */
frame.pack();
frame.setVisible(true);
}
}
Adding HTML text to a JLabel
package test;
import javax.swing.JFrame;
import javax.swing;
public class WorldClock {
public static void main(String[] a) {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JLabel label = new JLabel("bold
plain");
frame.add(label);
frame.setSize(300, 200);
frame.setVisible(true);
}
}
package test;
import java.awt;
import java.awt;
import java.awt;
import java.awt.event.MouseAdapter;
import java.awt.event;
import java.io;
import javax.swing.JLabel;
public class WorldClock extends JLabel implements Serializable {
transient private Color color; // not persistent
private boolean rectangular; // is persistent
public WorldClock() {
addMouseListener(new MouseAdapter() {
public void mousePressed(MouseEvent me) {
change();
}
});
rectangular = false;
setSize(200, 100);
change();
}
public boolean getRectangular() {
return rectangular;
}
public void setRectangular(boolean flag) {
this.rectangular = flag;
repaint();
}
public void change() {
color = randomColor();
repaint();
}
private Color randomColor() {
int r = (int) (255 * Math.random());
int g = (int) (255 * Math.random());
int b = (int) (255 * Math.random());
return new Color(r, g, b);
}
public void paint(Graphics g) {
Dimension d = getSize();
int h = d.height;
int w = d.width;
g.setColor(color);
if (rectangular) {
g.fillRect(0, 0, w - 1, h - 1);
} else {
g.fillOval(0, 0, w - 1, h - 1);
}
}
}
JLabelを書き換える
package test;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing;
JScrollPane; import javax.swing;
public class WorldClock{
public static void main(String[] args) {
JFrame frame = new JFrame();
JLabel image = new JLabel(new ImageIcon("001.jpg"));
// Add content to the frame, first get the content panel, and keep adding elements on top of that. There are two methods for getting the content pane
frame.getContentPane().add(new JScrollPane(image));
frame.setSize(300, 300);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}
JScrollPaneにJLabelを追加して大きな画像を表示する方法
package test;
import java.awt.GridLayout;
import javax.swing.JFrame;
import javax.swing;
public class WorldClock {
public static void main(String args[]) {
UnicodeJFrame unicodeJFrame = new UnicodeJFrame();
unicodeJFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
unicodeJFrame.setSize(350, 250);
unicodeJFrame.setVisible(true);
}
}
/* What does setToolTipText do?
* Used to set the hint message to be displayed when the mouse hovers over the Label.
For example, after you set lbl.setToolTipText("This is a tip");;
Then when you run the program and pause the mouse over the lbl, the screen will show This is a tip.
*/
// After inheriting JFrame, you can just add(element);
class UnicodeJFrame extends JFrame {
public UnicodeJFrame() {
// call the parent class constructor, where the element inside represents the name
super("Demonstrating Unicode");
setLayout(new GridLayout(8, 1));
JLabel englishJLabel = new JLabel("/u0057/u0065/u006C/u0063"
+ "/u006F/u006D/u0065/u0020/u0074/u006F/u0020Unicode/u0021");
englishJLabel.setToolTipText("This is English");
add(englishJLabel);
JLabel chineseJLabel = new JLabel("/u6B22/u8FCE/u4F7F/u7528" + "/u0020/u0020Unicode/u0021");
chineseJLabel.setToolTipText("This is Traditional Chinese");
add(chineseJLabel);
JLabel cyrillicJLabel = new JLabel("/u0414/u043E/u0431/u0440"
+ "/u043E/u0020/u043F/u043E/u0436/u0430/u043B/u043E/u0432"
+ "/u0430/u0422/u044A/u0020/u0432/u0020Unicode/u0021");
cyrillicJLabel.setToolTipText("This is Russian");
add(cyrillicJLabel);
JLabel frenchJLabel = new JLabel("/u0042/u0069/u0065/u006E/u0076"
+ "/u0065/u006E/u0075/u0065/u0020/u0061/u0075/u0020Unicode/u0021");
frenchJLabel.setToolTipText("This is French");
add(frenchJLabel);
JLabel germanJLabel = new JLabel("/u0057/u0069/u006C/u006B/u006F"
+ "/u006D/u006D/u0065/u006E/u0020/u007A/u0075/u0020Unicode/u0021");
germanJLabel.setToolTipText("This is German");
add(germanJLabel);
JLabel japaneseJLabel = new JLabel("Unicode/u3078/u3087/u3045" + "/u3053/u305D/u0021");
japaneseJLabel.setToolTipText("This is Japanese");
add(japaneseJLabel);
JLabel portugueseJLabel = new JLabel("/u0053/u00E9/u006A/u0061"
+ "/u0020/u0042/u0065/u006D/u0076/u0069/u006E/u0064/u006F/u0020" + "Unicode/u0021");
portugueseJLabel.setToolTipText("This is Portuguese");
add(portugueseJLabel);
JLabel spanishJLabel = new JLabel("/u0042/u0069/u0065/u006E"
+ "/u0076/u0065/u006E/u0069/u0064/u0061/u0020/u0061/u0020" + "Unicode/u0021");
spanishJLabel.setToolTipText("This is Spanish");
add(spanishJLabel);
}
}
JLabelにunicodeエンコーディングを追加する
package test;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io;
import java.net.ServerSocket;
import java.net;
//define serializable(object)
class Student implements Serializable {
private int sno;
private String sname;
public Student(int sno, String sname) {
this.sno = sno;
this.sname = sname;
}
public int getSno() {
return sno;
}
public void setSno(int sno) {
this.sno = sno;
}
public String getSname() {
return sname;
}
public void setSname(String sname) {
this.sname = sname;
}
@Override
public String toString() {
return "Student number:" + sno + ";Name:" + sname;
}
}
// The deserialization process of (object)
class MyClient extends Thread {
@Override
public void run() {
try {
Socket s = new Socket("localhost", 9999);
ObjectInputStream ois = new ObjectInputStream(s.getInputStream());
Student stu = (Student) ois.readObject();
System.out.println("Client program received the student object transferred from the server-side program>> " + stu);
ois.close();
s.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
// Serialization process for (object)
class MyServer extends Thread {
@Override
public void run() {
try {
ServerSocket ss = new ServerSocket(9999);
Socket s = ss.accept();
ObjectOutputStream ops = new ObjectOutputStream(s.getOutputStream());
Student stu = new Student(1, "趙本山");
ops.writeObject(stu);
ops.close();
ss.close();
ss.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
// Test
public class TestTransfer {
public static void main(String[] args) {
new MyServer().start();
new MyClient().start();
}
}
その他の知識
1. イメージアイコン
I. 課題
ImageIcon icon = new ImageIcon("a.gif");
実装の結果、アイコンを表示することができない
II. 解決方法
クラスを以下のように呼び出します。
ImageIcon icon = new ImageIcon("a.gif");
現在のクラスファイルと画像は同じパスにあると考えるのが自然です。
実は、いわゆる相対パスの起点は、プロジェクトのルート、つまりprojectなのです。
この行は、プロジェクトディレクトリの中にあるa.gifというファイルを探すのですが、当然ながら見つかりません。
プロジェクトのルートディレクトリがproject1である場合
画像ファイルは、project1/src/images/a.gif に置かれます。
したがって、正しい呼び出しは
ImageIcon icon = new ImageIcon("src/images/a.gif");
この行は、実行時にプロジェクトディレクトリ内のファイルを探しますが、もちろん、次のように書くこともできます。
ImageIcon icon = new ImageIcon(". /src/images/a.gif");
両者の違いに注意してください。srcはproject下のディレクトリにあることを思い出してください。
要約すると、いわゆる相対パスはプロジェクトのルートディレクトリの位置からの相対的なものである、という文章です^_^。
III. その他
ImageIconのコンストラクタをチェックアウトしました。
Public ImageIcon(String filename)//The parameter can be an absolute path or relative path.
パブリック ImageIcon(URL url)
URLで画像を取得する2つ目の方法
URL url = getClass().getResource("a.gif"); // 現在のコンパイル済みクラスファイルがあるディレクトリを検索します。
ImageIcon icon = new ImageIcon(url)。
質問討論。
この問題の原因の多くはパスの問題で、プロジェクト内では問題なく動作していても、Jarとしてパッケージ化されると正しく表示されないことがよくありますが、そのような問題を解決する方法を以下にまとめました。
I. 外部リソースファイルを使って解決する
プロジェクトをJarにパッケージングした後、新しいフォルダを作成し、プロジェクトで使用するすべての画像ファイルとJarファイルをそのディレクトリに置きます。コードは、画像ファイルを正しいパスで参照する限り、次のようにします。イメージアイコン
image=new ImageIcon(SwingResourceManager.getImage ("icons/logo.gif")); で完了です。
このように、画像ファイルとクラスファイルを一緒にパッケージ内に置くのではなく、クラスファイルはパッケージ内に、画像ファイルはプロジェクトのルートディレクトリに置くようにします。
II. 内部リソースファイルの使用により解決
プロジェクトで使用するパッケージに、使用する画像ファイルを入れ、パッケージング時に同時にJarファイルに打ち込む。この方法は、具体的なコードで以下のいずれかを使用する必要があります。
ImageIcon image = new ImageIcon(this.class.getResource("icons/logo.gif")));
この方法については、以下で詳しく説明します。
問題解決を図る。
グラフィカルなインターフェイスを持つプログラムを書くと、必ずいろいろな画像リソースを使わなければならない。では、アプリケーションを公開するとき、これらのイメージリソースをどのように公開するのでしょうか?最もクリーンな方法は、これらの画像リソースをクラスファイルと一緒に実行可能なJarファイルにパッケージすることです。そうすれば、すべてを包含する一つのJarファイルを公開するだけで、ユーザーはJarファイルをダブルクリックするだけでプログラムを実行することができるようになります。Jarファイルに画像をパッケージングした場合、プログラムを書くときに、どのように画像にアクセスするのですか?また、その画像へのパスはどうなっているのでしょうか?この問題を解決するには、getResource()メソッドを使用することができます。それでは、よくある2つのケースを詳しく分析してみましょう。
1. 画像リソースはすべて images フォルダに配置され、images フォルダも andycpp パッケージに配置されます。この場合、最終的なパスは次のように表されます。
アンディ.jar
|__andycpp
|__ GUITest.class
|__ 画像
|__ Snap1.jpg
imagesフォルダは、それを参照するクラスと同じレベルにあるため、相対パス:getResource()メソッドでアクセスすることができますが、単にそれを使うことはできません。例えば、上の画像では、GUITestクラスはimagesと同じ階層にあるので、そのクラスのgetResource()メソッドを使う必要があります。
2. また、多くのクラスがあり、パッケージ構造が複雑な場合、画像とクラスを同じレベルに置くことは考えにくく、代わりに画像を一番外側のレベルに置き、すべてのクラスが絶対パスで画像にアクセスできるようにする必要があります。
アンディ.jar
|__andycpp
|__ GUITest.class
|__ 画像
|__ Snap1.jpg
コードは以下の通りです。
java.net.URL imgURL = GUITest.class.getResource("/images/Snap1.jpg") とします。
ImageIcon img1 = new ImageIcon(imgURL);
上のコードとの違いがわかりますか?違いは非常に微妙で、"images"の前にバックスラッシュ "/" があるだけです。このバックスラッシュはルートディレクトリ、バックスラッシュなしは相対パスという意味です。
java.net.URL imgURL = GUITest.class.getResource("images/Snap1.jpg") とします。
ImageIcon img1 = new ImageIcon(imgURL);
2. Serializableの実装は何をするのか
http://blog.csdn.net/ukouryou/article/details/4132443
Serializableを実装しないと、rmi(ejbを含む)経由のリモートコールを提供できません。
シリアライゼーションは、Serializable インターフェースを実装したオブジェクトを、後で元のオブジェクトを再生するために完全に保存できるバイトシーケンスに変換することを可能にします。
シリアライゼーションはローカルだけでなく、ネットワーク経由でも可能です(ネコのフィクションのRMIですね)。これは大きなメリットで、OSの違いやバイトオーダーなどを自動的にマスクしてくれるからです。例えば、Windowプラットフォームでオブジェクトを生成してシリアライズし、それをネットワーク経由でUnixマシンに渡すと、Unixマシンで適切に再構築することができます。
オブジェクトのシリアライゼーションは、主に2つの機能をサポートするために使用されます。
Java の RMI (remote method invocation).RMI は、リモートマシンにあるオブジェクトをローカルマシンにあるかのように操作できるようにするものです。リモートオブジェクトにメッセージを送信する場合、シリアライゼーション機構を利用して、パラメータを送信し、リターンを直接受信することができます。
Beanの状態情報は,通常,設計時に設定される。Beanの状態情報は,プログラム実行時に復元できるように保存されなければならない。これにはシリアライゼーション機構も必要である。
ネットワーク環境でのクラス転送であり、やはりSerializableを実装する必要があります。
package test;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
Serializable; import java.io;
/**
* @description Use the transient keyword to not serialize a variable
* Note that when reading, the order in which the data is read must be consistent with the order in which it is stored
*
*/
public class TranSientTest {
public static void main(String[] args) {
User user = new User();
user.setUsername("Alexia");
user.setPasswd("123456");
System.out.println("read before Serializable: ");
System.out.println("username: " + user.getUsername());
System.err.println("password: " + user.getPasswd());
try {
ObjectOutputStream os = new ObjectOutputStream(
new FileOutputStream("C:/user.txt"));
os.writeObject(user); // Write the User object to the file
os.flush();
os.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
try {
ObjectInputStream is = new ObjectInputStream(new FileInputStream(
"C:/user.txt"));
user = (User) is.readObject(); // read User's data from the stream
is.close();
System.out.println("\nread after Serializable: ");
System.out.println("username: " + user.getUsername());
System.err.println("password: " + user.getPasswd());
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
class User implements Serializable {
private static final long serialVersionUID = 8294180014912103005L;
private String username;
private transient String passwd;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPasswd() {
return passwd;
}
public void setPasswd(String passwd) {
this.passwd = passwd;
}
}
3.transientキーワード
-
transientの役割と使い方
Serilizableインタフェースを実装している限り、オブジェクトをシリアライズできることは周知の事実です。クラスが Serilizable インターフェースを実装している限り、そのクラスのすべてのプロパティとメソッドは自動的にシリアライズされるため、特定のシリアライズプロセスに関連付ける必要がありません。
しかし、実際には、クラスのプロパティの中には、シリアライズする必要があるものと、シリアライズする必要がないものがあるという問題によくぶつかります。この情報に対応する変数をtransientキーワードで追加することができます。つまり、そのフィールドの寿命は呼び出し元のメモリに保存され、ディスクには書き込まれず永続化されるのです。
まとめると、javaのtransientキーワードは、Serilizableインターフェースを実装し、シリアライズする必要のないプロパティにtransientキーワードを前置きするだけで、オブジェクトをシリアライズする際に、そのプロパティが指定した先にシリアライズされないという利便性を提供してくれているのです。
package test;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
Serializable; import java.io;
/**
* @description Use the transient keyword to not serialize a variable
* Note that when reading, the order in which the data is read must be consistent with the order in which it is stored
*
* @date 2013-10-15
*/
public class TranSientTest {
public static void main(String[] args) {
User user = new User();
user.setUsername("Alexia");
user.setPasswd("123456");
System.out.println("read before Serializable: ");
System.out.println("username: " + user.getUsername());
System.err.println("password: " + user.getPasswd());
try {
ObjectOutputStream os = new ObjectOutputStream(
new FileOutputStream("C:/user.txt"));
os.writeObject(user); // Write the User object to the file
os.flush();
os.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
try {
// Change the value of username before deserialization
User.username = "jmwang";
ObjectInputStream is = new ObjectInputStream(new FileInputStream(
"C:/user.txt"));
user = (User) is.readObject(); // read User's data from the stream
is.close();
System.out.println("\nread after Serializable: ");
System.out.println("username: " + user.getUsername());
System.err.println("password: " + user.getPasswd());
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
class User implements Serializable {
private static final long serialVersionUID = 8294180014912103005L;
public static String username;
private transient String passwd;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPasswd() {
return passwd;
}
public void setPasswd(String passwd) {
this.passwd = passwd;
}
}
説明
パスワードフィールドがNULLであり、デシリアライズがファイルから情報を全く取得しなかったことを示します。
2. トランジェント使用法概要
1) transientによって変数が変更されると、その変数はオブジェクトの永続化の一部ではなくなり、シリアライズ後にその変数の内容にアクセスできなくなります。
2) transient キーワードは変数だけを変更でき、メソッドやクラスは変更できません。ローカル変数は、transient キーワードでは変更できないことに注意してください。変数がユーザー定義のクラス変数の場合、そのクラスは Serializable インターフェースを実装する必要があります。
3) transientキーワードで変更された変数は直列化できなくなり、transientで変更されたかどうかに関わらず、静的変数は直列化できなくなりました。
Userクラスのusernameフィールドにstaticキーワードを追加しても、プログラムは同じ結果、つまりusernameのstatic型も"Alexia"と読めるので、3点目が矛盾していると混乱する人もいるのではないでしょうか?実際、3番目のポイントは真実です(静的変数は、それが過渡的に変更されるかどうかにかかわらず、シリアライズすることはできません)、デシリアライズ後のクラスの静的変数usernameの値は、現在のJVMの対応する静的変数の値であり、それはデシリアライズではなくJVMの値である。
import java.io.Externalizable;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectInputStream;
import java.io.ObjectOutput;
ObjectOutputStream; import java.io;
/**
* @descripiton Externalizable interface usage
*
* @author Alexia
* @date 2013-10-15
*
*/
public class ExternalizableTest implements Externalizable {
private transient String content = "Yes, I will be serialized whether or not I am modified by the transient keyword ";
@Override
public void writeExternal(ObjectOutput out) throws IOException {
out.writeObject(content);
}
@Override
public void readExternal(ObjectInput in) throws IOException,
ClassNotFoundException {
content = (String) in.readObject();
}
public static void main(String[] args) throws Exception {
ExternalizableTest et = new ExternalizableTest();
ObjectOutput out = new ObjectOutputStream(new FileOutputStream(
new File("test")));
out.writeObject(et);
ObjectInput in = new ObjectInputStream(new FileInputStream(new File(
"test")));
et = (ExternalizableTest) in.readObject();
System.out.println(et.content);
out.close();
in.close();
}
}
これは、デシリアライズ後のクラス内の静的型変数usernameの値が、シリアライズ時の値Alexiaではなく、変更後のjmwangの現在のJVM内の対応する静的変数の値であることを示します。
- transientの使い方の詳細 - transientキーワードで変更された変数はシリアライズできないって本当ですか?
We know that in Java, the serialization of objects can be achieved by implementing two interfaces, if the Serializable interface is implemented, all serialization will be done automatically, if the Externalizable interface is implemented, nothing can be serialized automatically, you need to manually specify the variables to be serialized in the writeExternal method. It is necessary to manually specify the variable to be serialized in the writeExternal method, regardless of whether it is modified by the transient modifier. So the second example outputs the contents of the initialized variable content, not null.
なぜかというと、transientキーワードで変更された後のクラス変数はシリアライズされないと書いてあるのではないでしょうか?
import java.awt;
import javax.swing;
public class RectDemo extends JLabel {
int x;
int y;
int w;
int h;
public void setSize(int w,int h){
this.w=w;
this.h=h;
this.repaint();
}
public void
public void paint(Graphics g){
g.fillRect(x, y, w, h);
}
}
4. JLabel クラスの継承
質問です。javaでJLabelクラスを継承した新しいクラスを作成し、そのpaintメソッドをオーバーライドして長方形を描きました。クラスのインスタンス化後、オブジェクトのサイズが定義されている場合、長方形を定義されたサイズに合わせてリサイズさせるにはどうすればいいですか?例えば、以下のようなコードをどのように修正すればよいでしょうか。
インポート java.awt;
javax.swing.JLabelをインポートします。
public class RectDemo extends JLabel {.
public void paint(グラフィックスg){。
g.fillRect(0, 0, 50, 50)を実行します。
}
}
import java.awt;
import javax.swing;
public class RectDemo extends JLabel {
int x;
int y;
int w;
int h;
public void setSize(int w,int h){
this.w=w;
this.h=h;
this.repaint();
}
public void
public void paint(Graphics g){
g.fillRect(x, y, w, h);
}
}
Paint() - このメソッドは、このコンポーネントをペイントするための指示を保持します。実はSwingでは、paintはpaintBorder()、paintComponent()、paintChildren()を呼び出すので、paint()の代わりにpaintComponent()を変更する必要があるのです。このメソッドを直接呼び出すのではなく、repaint()を呼び出す必要があります。
repaint() - このメソッドはオーバーライドできません。update() -> paint() のサイクルを制御します。もし、コンポーネントのサイズではなく、外観を変更した場合(色の変更、アニメーションなど)、このメソッドを呼び出してください。
validate() - これは、コンポーネント自身を再度レイアウトし、再描画するように指示します。もし、コンポーネントやその子のサイズを変更するようなこと(子の追加、削除、サイズ変更)をした場合は、このメソッドを呼び出す必要があります...。Swingではvalidate()よりもrevalidate()を呼び出した方がいいと思うのですが...。
public void validate() は、このコンテナとそのすべての子のバリデーションを行います。
validate メソッドを使用すると、コンテナはその子を再びレイアウトすることになります。コンテナがレイアウトされた後、このコンテナの子オブジェクトを変更する際には、上記のメソッドを呼び出す必要があります。これは、リフレッシュ操作に似ています。
update() - このメソッドは、コンポーネントをクリアし、paint()を呼び出すことを担当します。繰り返しますが、このメソッドを直接呼び出すのではなく、repaint()を呼び出す必要があります... もし、アニメーションで高速な更新を行う必要がある場合は、このメソッドをオーバーライドして、paint()メソッドを呼び出すだけにしておくとよいでしょう。
animation: アニメーション
updateUI() - コンポーネントが表示された後に、プラグイン可能なルック&アンプ;フィールを変更した場合に、このメソッドを呼び出します。
pluggable: プラグイン可能
参考にしてください。java 2 AWTにおけるpaint()およびrepaint()メソッドの適切な使用法
関連
-
Java のエラーです。未解決のコンパイル問題 解決方法
-
Javaクラスローダーにソースコードから潜り込む
-
JDKの設定時にjava.dllが見つからない、java SE Runtime Environmentが見つからない問題が発生しました。
-
JQuery DataTable 详解
-
xxx:jarのアーティファクトディスクリプタの読み込みに失敗した問題は解決しました。
-
javaでよく使われる英単語
-
スレッド "main" で例外発生 java.net.BindException: アドレスは既に使用中です。NET_Bind
-
ブラウザでの大容量ファイルスライスアップロード(Javaサーバサイド実装)
-
ローカルリソースのロードが許可されていない場合の解決策
-
「リソースリーク:'scanner'が閉じない」警告、Scannerステートメントでの解決法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
springboot project MIMEタイプ text/htmlで転送された静的ファイルを読み込む。
-
この行に複数のマーカーがある - HttpServletResponseが型エラーに解決できない
-
プロローグでのコンテンツは禁止されています
-
テストが見つかりませんでした
-
プラグインの実行は、ライフサイクル構成によってカバーされていません: org.codehaus.mojo:aspectj-maven-plugin:1.3.
-
無効なカラム名、エラーは完全に解決
-
Java-Myeclipse エラー解決 構文エラー、TryStatem を完了するために "Finally" を挿入する。
-
dao インターフェースがメソッドを定義し、エラーを報告した。 xxx 型のメソッド xxx は未定義である。
-
Java静的コード解析 - 仕様チェック - checkstyle
-
Spring MVC アノテーションエラーです。引数型[java.lang.String]の名前が利用できません。