2017-03-17 2 views
1

Ich versuche, eine aplication zu tun, aber ich weiß nicht, ob posible ist, so etwas zu tun, zum Beispiel: enter image description hereEs ist möglich, eine JTextArea oder JTextPane zu erweitern, indem Sie darauf klicken?

Also das Rechteck ist die JTextArea (oder JTextPane), und es hat eine feste zise, ​​deshalb die Aufhängungspunkte sind, aber wenn ich clikc auf es wie folgt aus:

enter image description here

wir den Ausbau JTextArea bekam (oder JTextPane), aber wenn der Fokus Losted wird, wird es auf die zurückkommen Anfang:

enter image description here

Der Text kann alles sein, so dass, wenn der Text zu lang ist, automatisch hinzufügen "..." am Ende

+1

Ja, es ist möglich, vielleicht werfen Sie einen Blick auf die 'setRows' Methode von' JTextArea'. 'JTextPane' wäre komplizierter – MadProgrammer

Antwort

0

Verwenden Sie ein JPanel JTextField und JTextArea mit FocusListener

hinzufügen und entfernen enter image description here enter image description here

Für einen Line-Eingang verwenden JTextField und hinzufügen „...“ Sie müssen KeyListener Schnittstelle implementieren.

Verwenden Sie ein globales Flag, das immer dann gesetzt wird, wenn Sie GainFocus auf JTextField setzen. Ein Thread wird nach diesem Flag suchen und wenn es gesetzt ist, wird es das JTextField-Objekt aus JPanel entfernen und JTextArea mit dem gespeicherten String hinzufügen.

ODER

Sie können FocusListner implementieren statt komplizierter Faden, was zu JPanel.

1

Eine weitere Option ist CardLayout und die fokussierbare JLabel statt JTextField zu verwenden, um die Standard-JLabel truncate Funktion nutzen zu können:

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

Alles auf dem Layout ab, die Sie verwenden. Was ich tun würde wäre, ein Layout zu verwenden, das die preferredSize seiner Komponenten respektiert. Dann würde ich die preferredSize des JTextPane mit einem booleschen Parameter (erweitert oder nicht expandiert) ändern.

Wenn ich sage, ändern Sie preferredSize, ich meine die Methode getPreferredSize überschreiben.

Verwandte Themen