0

如何创建一个 JTextArea,您可以在其中复制设置的文本?

很简单,Cntl-C 或者右键复制就可以了。

代码适用于我正在开发的瓷砖游戏,它将信息打印到 TextArea。它的作品很棒,除了我无法复制任何文本。

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);
    }
}
4

4 回答 4

3

否则,您可以使用以下代码中的类似内容。

Keymap km = area.getKeymap();
KeyStroke ks = KeyStroke.getKeyStroke(KeyEvent.VK_C, InputEvent.CTRL_DOWN_MASK);
km.addActionForKeyStroke(ks, TransferHandler.getCopyAction());
于 2013-06-14T06:34:27.460 回答
1

JTextArea 有一个默认行为,您可以使用 ctrl + c 将文本复制到剪贴板。

以下是我刚刚从您的上述问题中复制并运行的代码。Ctrl + C 仍然可以正常工作。

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();
}
}
于 2013-06-14T03:47:51.620 回答
0

尝试:

字符串 str;

str =TTextarea.getText();

看到这个有趣的链接 http://java-program-sample.blogspot.com/2011/08/copy-selected-text-from-jtextarea-to.html

于 2013-09-13T07:48:05.193 回答
0

这对我有用(与 Raghav 的答案相同,但它将副本映射到 Command-C 而不是 Control-C,这是大多数 Mac 用户所期望的)。

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());
}
于 2018-12-27T21:55:35.690 回答