通过点击扩展JTextArea或JTextPane是可行的吗?

时间:2017-03-17 00:30:14

标签: java swing jtextarea jtextpane

我试图做一个应用,但我不知道是否可以这样做,例如:enter image description here

所以矩形是JTextArea(或JTextPane)并且它有一个固定的zise,这就是为什么悬挂点,但是当我像这样clikc:

enter image description here

我们得到了JTextArea(或JTextPane)的扩展,但是当焦点丢失时,它将在开始时回归:

enter image description here

文字可以是任何内容,因此当文字太长时,自动添加" ..."最后

3 个答案:

答案 0 :(得分:1)

另一种选择是使用CardLayout和可聚焦的JLabel代替JTextField,以便使用默认的JLabel截断功能:

screenshot

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class TextAreaExpandTest {
  private static final String TEXT =
    "The text can be anything, so when the text is too long," +
    " automatically add '...' at the end.";
  public JComponent makeUI() {
    CardLayout cardLayout = new CardLayout();
    JPanel cp = new JPanel(cardLayout);

    JTextArea textArea = new JTextArea(TEXT, 5, 10) {
      @Override public void updateUI() {
        super.updateUI();
        setLineWrap(true);
        setWrapStyleWord(true);
        setMargin(new Insets(1, 1, 1, 1));
      }
    };

    JLabel textField = new JLabel(" ") {
      @Override public void updateUI() {
        super.updateUI();
        setOpaque(true);
        setFocusable(true);
        setBackground(UIManager.getColor("TextField.background"));
        setForeground(UIManager.getColor("TextField.foreground"));
        setBorder(UIManager.getBorder("TextField.border"));
      }
    };

    textArea.addFocusListener(new FocusAdapter() {
      @Override public void focusLost(FocusEvent e) {
        String text = textArea.getText();
        textField.setText(text.isEmpty() ? " " : text);
        cardLayout.show(cp, "TextField");
      }
    });
    textField.addFocusListener(new FocusAdapter() {
      @Override public void focusGained(FocusEvent e) {
        cardLayout.show(cp, "TextArea");
        textArea.requestFocusInWindow();
      }
    });
    textField.addMouseListener(new MouseAdapter() {
      @Override public void mousePressed(MouseEvent e) {
        cardLayout.show(cp, "TextArea");
        textArea.requestFocusInWindow();
      }
    });
    JPanel panel = new JPanel(new BorderLayout());
    panel.add(textField, BorderLayout.NORTH);
    JScrollPane scroll = new JScrollPane(
      textArea,
      ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER,
      ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
    cp.add(panel, "TextField");
    cp.add(scroll, "TextArea");

    JPanel p = new JPanel(new BorderLayout());
    p.setBorder(BorderFactory.createEmptyBorder(32, 32, 32, 32));
    p.add(cp, BorderLayout.NORTH);
    p.add(new JButton("focus dummy"), BorderLayout.SOUTH);
    return p;
  }
//   //TEST: JTextArea"setRows(...)
//   public JComponent makeUI2() {
//     JPanel p = new JPanel(new BorderLayout());
//     JTextArea textArea = new JTextArea("", 1, 10);
//     textArea.setLineWrap(true);
//     textArea.addFocusListener(new FocusListener() {
//       @Override public void focusGained(FocusEvent e) {
//         JTextArea ta = (JTextArea) e.getComponent();
//         ta.setRows(8);
//         p.revalidate();
//       }
//       @Override public void focusLost(FocusEvent e) {
//         JTextArea ta = (JTextArea) e.getComponent();
//         ta.setRows(1);
//         p.revalidate();
//       }
//     });
//     JScrollPane scroll = new JScrollPane(
//       textArea,
//       ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER,
//       ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
//     p.add(scroll, BorderLayout.NORTH);
//     p.add(new JButton("focus dummy"), BorderLayout.SOUTH);
//     p.setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20));
//     return p;
//   }
  public static void main(String... args) {
    EventQueue.invokeLater(() -> {
      UIManager.put("swing.boldMetal", Boolean.FALSE);
      JFrame f = new JFrame();
      f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
      f.getContentPane().add(new TextAreaExpandTest().makeUI());
      f.setSize(320, 240);
      f.setLocationRelativeTo(null);
      f.setVisible(true);
    });
  }
}

答案 1 :(得分:0)

使用JPanel添加JTextFieldJTextArea以及FocusListener

enter image description here enter image description here

对于一行输入,使用JTextField并添加“...”,您需要实现KeyListener接口。

使用全局标志,无论何时在JTextField上使用GainFocus,都会设置该标志。线程将检查此标志,如果已设置,则它将从JPanel中删除JTextField对象,并添加带有已保存字符串的JTextArea。

OR

您可以将FocusListner实现为JPanel而不是更复杂的线程。

答案 2 :(得分:0)

一切都取决于您使用的布局。我会做的是使用布局尊重其组件的preferredSize。然后我会在给定布尔参数(展开或未展开)的情况下更改JTextPane的preferredSize。

当我说更改preferredSize时,我的意思是覆盖getPreferredSize方法。