Reputation: 4878
How would one go about creating a JTextArea in which you can copy the text that is set?
Simple, Cntl-C or right-click copy is fine.
Code is for a tile game I am working on and it prints information to the TextArea. Its works great, except I cannot copy any of the text.
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class TileHelper{
static JFrame frame;
static JButton getTile, end, start;
static JTextField field;
static JTextArea area;
static JScrollPane scroller;
static Container pane;
static JCheckBox manual;
static JComboBox numList;
static Insets insets;
static String newTile;
static boolean startLoop, firstTime = true;
static int numTiles;
public Tile previous, current;
static final String[] intString = {"4","5","6","7","8","9","10"};
public void buildGUI() {
//build our test gui & components
frame = new JFrame("TileHelper");
frame.setSize(680, 240);
manual = new JCheckBox("Get Manually");
getTile = new JButton("Get Tile");
end = new JButton("End");
start = new JButton("Start");
numList = new JComboBox(intString);
numList.setSelectedIndex(0);
field = new JTextField(10);
field.setText("Enter Name");
area = new JTextArea(670, 175);
area.setEditable(true);
area.setText("Press Start below after selection.");
//set font
area.setFont(new Font("Serif", Font.PLAIN, 16));
scroller = new JScrollPane(area);
scroller.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
scroller.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
pane = frame.getContentPane();
pane.setLayout(null);
pane.add(manual);
pane.add(getTile);
pane.add(end);
pane.add(field);
pane.add(start);
pane.add(scroller);
pane.add(numList);
insets = pane.getInsets();
scroller.setBounds(insets.left + 5, insets.top + 5, 670, 175);
start.setBounds(insets.left + 5, scroller.getY() + scroller.getHeight() + 5, getTile.getPreferredSize().width, getTile.getPreferredSize().height);
getTile.setBounds(insets.left + start.getX() + start.getWidth() + 5, scroller.getY() + scroller.getHeight() + 5, getTile.getPreferredSize().width, getTile.getPreferredSize().height);
end.setBounds(insets.left + getTile.getX() + getTile.getWidth() + 5, scroller.getY() + scroller.getHeight() + 5, end.getPreferredSize().width, end.getPreferredSize().height);
numList.setBounds(insets.left + end.getX() + end.getWidth() + 5, scroller.getY() + scroller.getHeight() + 6, numList.getPreferredSize().width + 6, numList.getPreferredSize().height);
field.setBounds(insets.left + numList.getX() + numList.getWidth() + 5, scroller.getY() + scroller.getHeight() + 6, field.getPreferredSize().width, field.getPreferredSize().height);
manual.setBounds(insets.left + 550, scroller.getY() + scroller.getHeight() + 6, manual.getPreferredSize().width, manual.getPreferredSize().height);
getTile.addActionListener(new getListener());
end.addActionListener(new endListener());
start.addActionListener((new startListener()));
frame.setResizable(false);
frame.setVisible(true);
}
public static class startListener implements ActionListener{
public void actionPerformed(ActionEvent e) {
if (!manual.isSelected()) {
startLoop = true;
}
if (field.getText().equals("Enter Name")) {
area.setText("You must name your array");
} else area.setText("Tile " + field.getText() ");
}
}
public static class endListener implements ActionListener{
public void actionPerformed(ActionEvent event) {
area.append(" };");
area.selectAll();
area.copy();
}
}
public static class getListener implements ActionListener{
public void actionPerformed(ActionEvent event) {
if (firstTime) {
newTile = String.format("new Tile" );
numTiles++;
firstTime = false;
} else {
if (++numTiles % 3 == 0){
newTile = String.format(",\n\t new Tile" );
} else newTile = String.format(", new Tile" );
}
area.append(newTile);
}
}
Upvotes: 0
Views: 4011
Reputation: 1
This worked for me (same as Raghav's answer, but it maps copy to Command-C instead of Control-C, which is what most Mac users expect).
String osName = System.getProperties().getProperty("os.name");
if (osName.startsWith("Mac OS X")) {
Keymap km = area.getKeymap();
KeyStroke ks = KeyStroke.getKeyStroke(KeyEvent.VK_C,
InputEvent.META_DOWN_MASK);
km.addActionForKeyStroke(ks, TransferHandler.getCopyAction());
}
Upvotes: 0
Reputation: 160
Try:
String str;
str =TTextarea.getText();
See this interesting link http://java-program-sample.blogspot.com/2011/08/copy-selected-text-from-jtextarea-to.html!
Upvotes: 0
Reputation: 7523
Or else you could use something like the one in the below code.
Keymap km = area.getKeymap();
KeyStroke ks = KeyStroke.getKeyStroke(KeyEvent.VK_C, InputEvent.CTRL_DOWN_MASK);
km.addActionForKeyStroke(ks, TransferHandler.getCopyAction());
Upvotes: 3
Reputation: 7523
JTextArea has a default behavior where you could do ctrl + c to copy the text to the clip board.
Below is the code that I just copied from your above question and I ran it. Ctrl + C still works fine.
import java.awt.Container;
import java.awt.Font;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.ScrollPaneConstants;
public class TileHelper
{
static JFrame frame;
static JButton getTile, end, start;
static JTextField field;
static JTextArea area;
static JScrollPane scroller;
static Container pane;
static JCheckBox manual;
static JComboBox numList;
static Insets insets;
static String newTile;
static boolean startLoop, firstTime = true;
static int numTiles;
static final String[] intString = { "4", "5", "6", "7", "8", "9", "10" };
public void buildGUI()
{
// build our test gui & components
frame = new JFrame( "TileHelper" );
frame.setSize( 680, 240 );
manual = new JCheckBox( "Get Manually" );
getTile = new JButton( "Get Tile" );
end = new JButton( "End" );
start = new JButton( "Start" );
numList = new JComboBox( intString );
numList.setSelectedIndex( 0 );
field = new JTextField( 10 );
field.setText( "Enter Name" );
area = new JTextArea( 670, 175 );
area.setEditable( true );
area.setText( "Press Start below after selection." );
// set font
area.setFont( new Font( "Serif", Font.PLAIN, 16 ) );
scroller = new JScrollPane( area );
scroller.setHorizontalScrollBarPolicy( ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER );
scroller.setVerticalScrollBarPolicy( ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS );
pane = frame.getContentPane();
pane.setLayout( null );
pane.add( manual );
pane.add( getTile );
pane.add( end );
pane.add( field );
pane.add( start );
pane.add( scroller );
pane.add( numList );
insets = pane.getInsets();
scroller.setBounds( insets.left + 5, insets.top + 5, 670, 175 );
start.setBounds( insets.left + 5, scroller.getY() + scroller.getHeight() + 5, getTile.getPreferredSize().width,
getTile.getPreferredSize().height );
getTile.setBounds( insets.left + start.getX() + start.getWidth() + 5, scroller.getY() + scroller.getHeight() + 5,
getTile.getPreferredSize().width, getTile.getPreferredSize().height );
end.setBounds( insets.left + getTile.getX() + getTile.getWidth() + 5, scroller.getY() + scroller.getHeight() + 5,
end.getPreferredSize().width, end.getPreferredSize().height );
numList.setBounds( insets.left + end.getX() + end.getWidth() + 5, scroller.getY() + scroller.getHeight() + 6,
numList.getPreferredSize().width + 6, numList.getPreferredSize().height );
field.setBounds( insets.left + numList.getX() + numList.getWidth() + 5, scroller.getY() + scroller.getHeight() + 6,
field.getPreferredSize().width, field.getPreferredSize().height );
manual.setBounds( insets.left + 550, scroller.getY() + scroller.getHeight() + 6, manual.getPreferredSize().width,
manual.getPreferredSize().height );
getTile.addActionListener( new getListener() );
end.addActionListener( new endListener() );
start.addActionListener( ( new startListener() ) );
frame.setResizable( false );
frame.setVisible( true );
}
public static class startListener implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
if (!manual.isSelected())
{
startLoop = true;
}
if (field.getText().equals("Enter Name"))
{
area.setText("You must name your array");
}
else
{
area.setText( "Tile" + field.getText() );
}
}
}
public static class endListener implements ActionListener
{
public void actionPerformed( ActionEvent event )
{
area.append( " };" );
area.selectAll();
area.copy();
}
}
public static class getListener implements ActionListener
{
public void actionPerformed( ActionEvent event )
{
if( firstTime )
{
newTile = String.format( "new Tile" );
numTiles++;
firstTime = false;
}
else
{
if( ++numTiles % 3 == 0 )
{
newTile = String.format( ",\n\t new Tile" );
}
else
newTile = String.format( ", new Tile" );
}
area.append( newTile );
}
}
public static void main( String[] args )
{
TileHelper helper = new TileHelper();
helper.buildGUI();
}
}
Upvotes: 1