JTextArea Tab Tuşu Kullanımı
20-10-14JTextArea'da Tab tuşuna basıldığında seçili satırların 4 birim ileri yönde hareket ettirilmesini ve Shift + Tab tuşuna basıldığında tersinil işlemin yapılmasını sağlamak için aşağıdaki kodları kullanabiliriz:
import javax.swing.*;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.DefaultStyledDocument;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
public class Test extends JFrame {
private JTextArea txtContent = new JTextArea(30, 150);
public Test() {
add(txtContent);
txtContent.setDocument(new TabDocument());
addKeyListener();
pack();
setLocationRelativeTo(null);
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
setVisible(true);
}
private static class TabDocument extends DefaultStyledDocument {
@Override
public void insertString(int offs, String str, AttributeSet a) throws BadLocationException {
str = str.replaceAll("\t", "");
super.insertString(offs, str, a);
}
}
private void addKeyListener() {
txtContent.addKeyListener(new KeyAdapter() {
private boolean isSelectedText = false;
private int selectionStart = 0;
@Override
public void keyPressed(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_TAB && e.isShiftDown()) {
selectionStart = txtContent.getSelectionStart();
new TabBackSpace(txtContent).actionPerformed(null);
isSelectedText = true;
} else if (e.getKeyCode() == KeyEvent.VK_TAB) {
if (txtContent.getSelectedText() != null) {
selectionStart = txtContent.getSelectionStart();
new TabSpace(txtContent).actionPerformed(null);
isSelectedText = true;
} else {
txtContent.insert(" ", txtContent.getCaretPosition());
}
}
}
public void keyReleased(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_TAB && isSelectedText) {
int caretPosition = txtContent.getCaretPosition();
txtContent.setSelectionStart(selectionStart);
txtContent.setSelectionEnd(caretPosition);
}
}
});
}
public static void main(String[] args) {
new Test();
}
}
Not: 36. satırdaki
e.isShiftDown() metodu, Shift tuşuna basıldığı zaman true değerini alır. TabSpace sınıfı
import javax.swing.*;
import java.awt.event.ActionEvent;
/**
* TabSpace
*/
public class TabSpace extends AbstractAction {
private JTextArea txtContent;
public TabSpace(JTextArea txtContent) {
this.txtContent = txtContent;
}
@Override
public void actionPerformed(ActionEvent e) {
String selectedText = txtContent.getSelectedText();
int selectionStart = txtContent.getSelectionStart();
int selectionEnd = txtContent.getSelectionEnd();
String[] lines = selectedText.split("\\n");
String result = "";
for (String line : lines) {
result += " " + line + "\n";
}
result=result.replaceAll("\\n$","");
txtContent.replaceRange(result, selectionStart, selectionEnd);
}
}
TabBack Sınıfı
import javax.swing.*;
import java.awt.event.ActionEvent;
/**
* TabBackSpace
*/
public class TabBackSpace extends AbstractAction {
private JTextArea txtContent;
public TabBackSpace(JTextArea txtContent) {
this.txtContent = txtContent;
}
@Override
public void actionPerformed(ActionEvent e) {
String selectedText = txtContent.getSelectedText();
int selectionStart = txtContent.getSelectionStart();
int selectionEnd = txtContent.getSelectionEnd();
String[] lines = selectedText.split("\\n");
String result = "";
for (String line : lines) {
result += line.replaceAll("^(\\s{4})", "") + "\n";
}
txtContent.replaceRange(result.replaceAll("(\\n)$",""), selectionStart, selectionEnd);
}
}