Swingでテキストを表示するダイアログを実装する方法メモ
JTextArea コンテナを使う (最も単純で簡単な方法)
JTextAreaは、単純にプレーンテキストを表示するコンテナ。一部分を着色したり、スタイルを変更したりする場合はJTextPaneを用いる。
public static void main(String[] args) {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setTitle("テキストファイルの表示");
frame.setSize(450, 350);
// 親コンテナ(この中に、子コンテナとしてpanel2つを上下配置する)
Container container = frame.getContentPane();
container.setLayout(new BorderLayout());
frame.setContentPane(container);
// ダイアログ上部のテキスト表示エリアの定義
JTextArea text = new JTextArea();
text.setLineWrap(true);
JScrollPane scroll = new JScrollPane();
scroll.getViewport().setView(text);
container.add(scroll, BorderLayout.CENTER);
// ダイアログ下部のボタン エリアの定義
JPanel panel_2 = new JPanel();
panel_2.setLayout(new FlowLayout(FlowLayout.RIGHT, 10, 5));
JButton buttonFileOpen = new JButton("ファイルを開く");
panel_2.add(buttonFileOpen);
JButton buttonClose = new JButton("終了");
panel_2.add(buttonClose);
container.add(panel_2, BorderLayout.PAGE_END);
// 「終了」ボタンの処理
buttonClose.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
frame.setVisible(false);
frame.dispose();
}
});
// 「ファイルを開く」ボタンの処理
buttonFileOpen.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
JFileChooser dialog = new JFileChooser();
dialog.setFileFilter(new FileNameExtensionFilter(
"HTMLファイル (*.html)", "html", "htm"));
dialog.setFileFilter(new FileNameExtensionFilter(
"テキストファイル (*.txt)", "txt"));
// dialog.setAcceptAllFileFilterUsed(false); // 「全てのファイル」のフィルタを除去
if (dialog.showOpenDialog(frame) == JFileChooser.APPROVE_OPTION) {
ReadFromTextFile(text, dialog.getSelectedFile().getPath());
}
}
});
// 実行環境OSにあったUIを適用する
try {
// UIManager.setLookAndFeel("com.sun.java.swing.plaf.gtk.GTKLookAndFeel");
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
// SwingUtilities.updateComponentTreeUI(panel);
SwingUtilities.updateComponentTreeUI(frame);
} catch (Exception e) {
}
// メイン ダイアログの表示
frame.setVisible(true);
}
private static void ReadFromTextFile(JTextArea t, String filename) {
try {
File file = new File(filename);
BufferedReader br = new BufferedReader(new FileReader(file));
// ファイル末端まで、各行をstrに読み込んでからJTextAreaコンテナに追加していく
String str = br.readLine();
t.setText("");
while (str != null) {
t.append(str + "\n");
str = br.readLine();
}
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
テキストエリア全てのテキスト色や、太字、斜体などの指定、フォントサイズを変更するには
〜 略 〜
// ダイアログ上部のテキスト表示エリアの定義
JTextArea text = new JTextArea();
text.setLineWrap(true);
Font font = new Font(Font.SANS_SERIF, Font.BOLD|Font.ITALIC, 16);
text.setFont(font);
text.setForeground(Color.BLUE);
〜 略 〜
JTextPaneコンテナを使う
public static void main(String[] args) {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setTitle("テキストファイルの表示");
frame.setSize(450, 350);
// 親コンテナ(この中に、子コンテナとしてpanel2つを上下配置する)
Container container = frame.getContentPane();
container.setLayout(new BorderLayout());
frame.setContentPane(container);
// ダイアログ上部のテキスト表示エリアの定義
JTextPane text = new JTextPane();
JScrollPane scroll = new JScrollPane();
scroll.getViewport().setView(text);
container.add(scroll, BorderLayout.CENTER);
// ダイアログ下部のボタン エリアの定義
JPanel panel_2 = new JPanel();
panel_2.setLayout(new FlowLayout(FlowLayout.RIGHT, 10, 5));
JButton buttonFileOpen = new JButton("ファイルを開く");
panel_2.add(buttonFileOpen);
JButton buttonClose = new JButton("終了");
panel_2.add(buttonClose);
container.add(panel_2, BorderLayout.PAGE_END);
// 「終了」ボタンの処理
buttonClose.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
frame.setVisible(false);
frame.dispose();
}
});
// 「ファイルを開く」ボタンの処理
buttonFileOpen.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
JFileChooser dialog = new JFileChooser();
dialog.setFileFilter(new FileNameExtensionFilter(
"HTMLファイル (*.html)", "html", "htm"));
dialog.setFileFilter(new FileNameExtensionFilter(
"テキストファイル (*.txt)", "txt"));
// dialog.setAcceptAllFileFilterUsed(false); // 「全てのファイル」のフィルタを除去
if (dialog.showOpenDialog(frame) == JFileChooser.APPROVE_OPTION) {
ReadFromTextFile(text, dialog.getSelectedFile()
.getPath());
}
}
});
private static void ReadFromTextFile(JTextPane t, String filename) {
StyleContext sc = new StyleContext();
DefaultStyledDocument doc = new DefaultStyledDocument(sc);
t.setDocument(doc);
try {
File file = new File(filename);
BufferedReader br = new BufferedReader(new FileReader(file));
// ファイル末端まで、各行をstrに読み込んでからdocコンテナに追加していく
String str = br.readLine();
doc.insertString(0, "", sc.getStyle(StyleContext.DEFAULT_STYLE));
while (str != null) {
doc.insertString(doc.getLength(), str + "\n",
sc.getStyle(StyleContext.DEFAULT_STYLE));
str = br.readLine();
}
br.close();
} catch (IOException | BadLocationException e) {
e.printStackTrace();
}
// 特定の文字に色を付けてみる
String strFind = "ダキア";
SimpleAttributeSet attr = new SimpleAttributeSet();
StyleConstants.setForeground(attr, new Color(0xff0000));
StyleConstants.setBold(attr, true);
StyleConstants.setItalic(attr, true);
int startAt = t.getText().indexOf(strFind);
while (startAt > 0) {
doc.setCharacterAttributes(startAt, strFind.length(), attr, true);
startAt = t.getText().indexOf(strFind, startAt + 1);
}
}
たとえば、テキスト全てに着色する場合は、insertStringメソッドを使うときに次のようにすればよい
doc.insertString(doc.getLength(), str + "\n", attr);

