दिलचस्प पोस्ट
पायथन 2.7 में प्रिंट स्वैच्छिक में कोष्ठक क्यों है? आप एक बुनियादी ईवेंट-लूप कैसे लागू करेंगे? मैं ओवरराइड वर्चुअल पद्धति के 'आधार कार्यान्वयन' को कैसे कॉल कर सकता हूं? scanf getchar फ़ंक्शन छोड़ दिया है चेतावनी: तारीख () अपेक्षा करता है कि पैरामीटर 2 लंबे समय तक, स्ट्रिंग को इन्हें दिया जाता है स्थानांतरित होने वाले कुछ निश्चित डेटा के बाद क्रोम लटका हुआ है – उपलब्ध सॉकेट के लिए प्रतीक्षा कर रहा है आईओएस 10 नक्शे के नीचे शीट की नकल कैसे करें I CPU पर Tensorflow चलाएं मैं फ़ायरफ़ॉक्स या क्रोम के साथ HTTP POST अनुरोधों को मैन्युअल रूप से कैसे फंसा सकता हूं? Node.js – मैं यूआरएल से पोर्ट कैसे निकाल सकता हूं? 'रनटाइम लाइब्रेरी' के लिए बेमेल का पता चला इंस्टाल पर Greasemonkey स्क्रिप्ट में उपयोगकर्ता इनपुट संग्रहीत करना नाम 'डिफ़ॉल्ट' के साथ विन्यास नहीं मिला। एंड्रॉइड स्टूडियो डेटाफ्रेम सेल के अंदर एक सूची को अलग-अलग पंक्तियों में कैसे विस्फोट करना प्रदर्शन टैग पृष्ठ पर अंक लगाना समस्या

पंक्तियों की संख्या (और प्रत्येक पंक्ति में कॉलम) की गणना करने के लिए कैसे एक पाठ JTextArea में लेता है?

प्रश्न में प्रस्तुत समस्या में दिलचस्पी लेने के बाद मैंने उसे कुछ समय तक पहुंचने और विफल करने की कोशिश की, और मुझे वह पसंद नहीं है 🙂

मुझे लगता है कि यदि समस्या को उप मुद्दों में विभाजित किया गया था, तो इसे हल करने में मदद मिल सकती है।

सादगी के लिए, JTextArea अपने आकार को परिवर्तित नहीं करने की अनुमति देता है, इसलिए हमें पुनः मूल्यांकन आदि के बारे में चिंता करने की जरूरत नहीं है। मुझे लगता है कि महत्वपूर्ण मुद्दे हैं:

1. कैसे पंक्तियों की संख्या की गणना करने के लिए एक विशिष्ट पाठ JTextArea में लेता है?

2. JTextArea में कॉलम की संख्या और कई अक्षरों के बीच के संबंध क्या हैं जो यह पंक्ति में फिट हो सकते हैं? तो हम पंक्ति की लंबाई की गणना कर सकते हैं

कृपया प्रोसेस करने के लिए टेक्स्ट क्षेत्र को प्रस्तुत करने वाला नमूना कोड नीचे शामिल करें:

import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JTextArea; import javax.swing.SwingUtilities; public class TextAreaLines { public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { JPanel p = new JPanel(); JFrame f = new JFrame(); JTextArea ta = new JTextArea("dadsad sasdasdasdasdasd"); ta.setWrapStyleWord(true); ta.setLineWrap(true); ta.setRows(5); ta.setColumns(5); p.add(ta); f.setContentPane(p); f.setSize(400, 300); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.setVisible(true); //BTW the code below prints 1 System.out.println("ta.getLineCount()="+ta.getLineCount()); } }); } } 

EDIT1: तो मैं निम्नलिखित कोड के साथ आया हूं, लेकिन समस्या यह है कि आप जो देख रहे हैं वह उत्पादन नहीं है, अर्थात

 //for input //JTextArea ta = new JTextArea("alfred abcdefghijklmnoprstuwvxyz abcdefg"); //we have output //s=alfred abcdefghijk //s=lmnoprstuwvxyz a //s=bcdefg FontMetrics fm = ta.getFontMetrics(ta.getFont()); String text = ta.getText(); List<String> texts = new ArrayList<String>(); String line = ""; //no word wrap for(int i = 0;i < text.length(); i++) { char c = text.charAt(i); if(fm.stringWidth(line +c) <= ta.getPreferredSize().width) { //System.out.println("in; line+c ="+(line + c)); line += c; } else { texts.add(line);//store the text line = ""+c;//empty the line, add the last char } } texts.add(line); for(String s: texts) System.out.println("s="+s); 

मैं क्या कर रहा हूं, मैं क्या भूल रहा हूँ? पाठ क्षेत्र पर कोई शब्द लपेट नहीं है

EDIT2 : @trashgod यह मैं प्राप्त कर रहा हूँ आउटपुट है। इस बात से स्पष्ट है कि हमारे पास अलग-अलग डिफ़ॉल्ट फ़ॉन्ट हैं और वास्तव में समस्या या तो फ़ॉन्ट या यहां तक ​​कि सिस्टम निर्भर हो सकती है। (PS: मैं Win7 पर हूं)।

 line: Twas brillig and the slithy tovesD line: id gyre and gimble in the wabe; line count: 2 preferred: java.awt.Dimension[width=179,height=48] bounds1: java.awt.geom.Rectangle2D$Float[x=0.0,y=-12.064453,w=170.0,h=15.09375] layout1: java.awt.geom.Rectangle2D$Float[x=0.28125,y=-8.59375,w=168.25,h=11.125] bounds2: java.awt.geom.Rectangle2D$Float[x=0.0,y=-12.064453,w=179.0,h=15.09375] layout2: java.awt.geom.Rectangle2D$Float[x=0.921875,y=-8.59375,w=177.34375,h=11.125] 

मेरे सिर में संकलन आप सभी लोग क्या कह रहे हैं मुझे लगता है कि संभवतया विश्वसनीय समाधान उस तरीके को हैक करने के लिए हो सकता है जिसमें पाठ क्षेत्र उसके पाठ को सेट करता है, और उस पर पूरा नियंत्रण लेता है। एल्गोरिथ्म चलाकर (क्षेत्र के सेटटैक्ड में एक से ऊपर, कृपया ध्यान दें, जैसा कि @trashgod द्वारा सुझाव दिया गया है '<' को '<=' में बदल दिया गया था)।

मुझे इस तरह से सोचने के लिए क्या मिला … उदाहरण के लिए मैंने नमूना में उपलब्ध कराया है यदि आप टेक्स्टरेया के पाठ को JTextArea ta = new JTextArea("alfred abcdefghijkl\nmnoprstuwvxyz ab\ncdefg"); क्योंकि यह मेरे मामले में गणना की जाती है, यह टेक्स्टरेरिया में पूरी तरह फिट होगा।

EDIT3: यह एक प्रकार का समाधान है जिसे मैं जल्दी से हैक कर रहा हूं, कम से कम अब दिखाए गए अक्षर और गणना बिल्कुल समान हैं। क्या कोई और इसे जांच कर सकता है और मुझे बताए, संभवतः यह अन्य मशीन पर काम करता है तो Win7? नीचे दिए गए उदाहरण का उपयोग करने के लिए तैयार है, आपको विंडो का आकार बदलने में और लाइनों के प्रिंटआउट को उसी तरह मिलना चाहिए, जितनी आप देखते हैं।

 import java.awt.BorderLayout; import java.awt.FontMetrics; import java.awt.event.ComponentAdapter; import java.awt.event.ComponentEvent; import java.util.ArrayList; import java.util.List; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JTextArea; import javax.swing.SwingUtilities; public class TextAreaLines { public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { JPanel p = new JPanel(new BorderLayout()); JFrame f = new JFrame(); final JTextArea ta = new JTextArea("alfred abcdefghijklmnoprstuwvxyz abcdefg"); ta.addComponentListener(new ComponentAdapter() { @Override public void componentResized(ComponentEvent e) { super.componentResized(e); System.out.println("ta componentResized"); reformatTextAreaText(ta); } }); //ta.setWrapStyleWord(true); ta.setLineWrap(true); p.add(ta); f.setContentPane(p); f.setSize(200, 100); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.setVisible(true); } private void reformatTextAreaText(JTextArea ta) { String text = ta.getText(); //remove all new line characters since we want to control line braking text = text.replaceAll("\n", ""); FontMetrics fm = ta.getFontMetrics(ta.getFont()); List<String> texts = new ArrayList<String>(); String line = ""; //no word wrap for(int i = 0; i < text.length(); i++) { char c = text.charAt(i); if(fm.stringWidth(line + c) <= ta.getPreferredSize().width) { //System.out.println("in; line+c ="+(line + c)); line += c; } else { texts.add(line);//store the text line = "" + c;//empty the line, add the last char } } texts.add(line); //print out of the lines for(String s : texts) System.out.println("s=" + s); //build newText for the String newText = ""; for(String s : texts) newText += s + "\n"; ta.setText(newText); } }); } } 

अग्रिम में धन्यवाद।

Solutions Collecting From Web of "पंक्तियों की संख्या (और प्रत्येक पंक्ति में कॉलम) की गणना करने के लिए कैसे एक पाठ JTextArea में लेता है?"

मैं क्या कर रहा हूं, मैं क्या भूल रहा हूँ?

कुछ भी सच नहीं। मैंने आपके उदाहरण को चौड़ाई पर "<=" का उपयोग करने के लिए संशोधित किया है और कुछ विशेषताओं को उजागर किया है:

  1. FontMetrics नोट्स, " String का अग्रिम जरूरी नहीं है कि अलगाव में मापा गया इसके वर्णों के अग्रिमों का योग …"

  2. पाठ घटक का पसंदीदा आकार मीट्रिक सीमा से मेल खाता है जो कि व्यापक लाइन के लिए बहुत अच्छी तरह से मेल खाता है। यह आनुपातिक रिक्ति के कारण फ़ॉन्ट से भिन्न होता है।

  3. TextLayout भी कड़ी सीमा से पता चलता है, लेकिन ध्यान दें "आधार रेखा-सापेक्ष निर्देशांक।"

  4. getLineCount() विधि लाइन लाइन। line.separator सीमांकित लाइनें, लपेट नहीं लाइनें।

 लाइन: ट्विस ब्रिलिग और स्लथि टोवेस
 रेखा: वाइब में गियर और जीप;
 लाइन संख्या: 2
 पसंदीदा: java.awt.Demension [width = 207, ऊंचाई = 48]
 bounds1: java.awt.geom.Rectangle2D $ फ्लोट [x = 0.0, y = -12.568359, w = 205.0, h = 15.310547]
 लेआउट 1: java.awt.geom.Rectangle2D $ फ्लोट [x = 0.0, y = -10.0, w = 200.0, h = 13.0]
 bounds2: java.awt.geom.Rectangle2D $ फ्लोट [x = 0.0, y = -12.568359, w = 207.0, h = 15.310547]
 लेआउट 2: java.awt.geom.Rectangle2D $ फ्लोट [x = 1.0, y = -10.0, w = 205.0, h = 13.0]
 import java.awt.Dimension; import java.awt.FontMetrics; import java.awt.font.FontRenderContext; import java.awt.font.TextLayout; import java.util.ArrayList; import java.util.List; import javax.swing.JFrame; import javax.swing.JTextArea; import javax.swing.SwingUtilities; /** #see http://stackoverflow.com/questions/5979795 */ public class TextAreaLine { private static final String text1 = "Twas brillig and the slithy toves\n"; private static final String text2 = "Did gyre and gimble in the wabe;"; private static final JTextArea ta = new JTextArea(text1 + text2); public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { display(); } }); } static void display() { JFrame f = new JFrame(); ta.setWrapStyleWord(false); ta.setLineWrap(false); ta.setRows(3); f.add(ta); f.pack(); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.setLocationRelativeTo(null); f.setVisible(true); FontMetrics fm = ta.getFontMetrics(ta.getFont()); List<String> texts = new ArrayList<String>(); Dimension d = ta.getPreferredSize(); String text = ta.getText(); String line = ""; for (int i = 0; i < text.length(); i++) { char c = text.charAt(i); if (c != '\n') { if (fm.stringWidth(line + c) <= d.width) { line += c; } else { texts.add(line); line = "" + c; } } } texts.add(line); for (String s : texts) { System.out.println("line: " + s); } System.out.println("line count: " + ta.getLineCount()); System.out.println("preferred: " + d); System.out.println("bounds1: " + fm.getStringBounds(text1, null)); FontRenderContext frc = new FontRenderContext(null, false, false); TextLayout layout = new TextLayout(text1, ta.getFont(), frc); System.out.println("layout1: " + layout.getBounds()); System.out.println("bounds2: " + fm.getStringBounds(text2, null)); layout = new TextLayout(text2, ta.getFont(), frc); System.out.println("layout2: " + layout.getBounds()); } } 

एक बात जो आप कर सकते हैं, FontMetrics का उपयोग करें मैंने कुछ लाइन नंबरों पर JTextArea को विभाजित करने के लिए कुछ कोड लिखा था। सेटअप कोड ऐसा दिखता है:

 Graphics2D g = (Graphics2D) g2; FontMetrics m = g.getFontMetrics(); int lineHeight = m.getHeight(); 

यह आपको बताएगा कि पाठ की एक पंक्ति कितनी लंबी है

दुर्भाग्य से, अधिकांश फोंट में पत्रों की अलग-अलग चौड़ाई होती है लेकिन, आप स्ट्रिंग की चौड़ाई निर्धारित करने के लिए निम्न कोड का उपयोग कर सकते हैं।

 int width = m.getStringBounds("Some String", g).getWidth(); 

मुझे पता है कि यह आपके प्रश्न का पूरी तरह उत्तर नहीं दे रहा है, लेकिन मुझे उम्मीद है कि यह मदद करता है।

यदि आप वर्ड रैप का उपयोग नहीं कर रहे हैं, तो यहां आप सामान्य एल्गोरिदम का उपयोग कर सकते हैं: (रंग घटक विधि में)

 String text[] = getText().split("\n"); String newText = ""; for (String line: text) { newText = line + "| " + line.length() + "\n"; } setText(newText); 

यह सामान्य विचार है यह निश्चित नहीं है कि यह कितनी अच्छी तरह काम करेगा यदि आप इसे अजमातें हैं तो मुझे बताएं।

यह निश्चित नहीं है कि यह मदद करता है, लेकिन आपको पाठ क्षेत्र की चौड़ाई को सेट करने की आवश्यकता है ताकि दृश्य को पाठ लपेटे जाने पर पता हो। एक बार जब आप आकार सेट करते हैं तो आप पसंदीदा ऊंचाई निर्धारित कर सकते हैं। जब आप पसंदीदा ऊँचाई को जानते हैं तो आप लाइनों की कुल संख्या को निर्धारित करने के लिए फ़ॉन्ट मेट्रिस पंक्ति की ऊंचाई का उपयोग कर सकते हैं ताकि कोई भी लिपिड लाइनें हो।

 import java.awt.*; import javax.swing.*; public class TextAreaPreferredHeight extends JFrame { public TextAreaPreferredHeight() { JTextArea textArea = new JTextArea(); textArea.setText("one two three four five six seven eight nine ten"); textArea.setLineWrap( true ); textArea.setWrapStyleWord( true ); FontMetrics fm = textArea.getFontMetrics( textArea.getFont() ); int height = fm.getHeight(); System.out.println("000: " + textArea.getPreferredSize()); textArea.setSize(100, 1); System.out.println("100: " + textArea.getPreferredSize()); System.out.println("lines : " + textArea.getPreferredSize().height / height); textArea.setSize(200, 1); System.out.println("200: " + textArea.getPreferredSize()); System.out.println("lines : " + textArea.getPreferredSize().height / height); textArea.setSize(300, 1); System.out.println("300: " + textArea.getPreferredSize()); System.out.println("lines : " + textArea.getPreferredSize().height / height); add(textArea); pack(); setVisible(true); } public static void main(String[] args) { new TextAreaPreferredHeight(); } } 

मैंने लोगों को इस तरह से कुछ के लिए TextLayout का उपयोग करते हुए देखा है

ठीक है, मैंने एक प्रोग्राम लिखा था जिसे आप एक छवि में लोड कर सकते हैं, और यह इसे एस्की कला में परिवर्तित कर देगा। मैं चाहता हूं कि वह इनपुट क्षेत्र पर आधारित पाठ क्षेत्र को सही आकृति राशन के लिए स्वतः बना दे।

हालांकि, मैं इसे काफी सही काम करने के लिए कभी नहीं मिल सकता है। मैंने छोड़ दिया और मेरे प्रयासों की टिप्पणी की, यहां मैंने जो कोशिश की है, उसका स्निपेट है। मैंने जो समाप्त किया था वह सिर्फ एक टेक्सटेरा था जो कभी-कभी पूरी तरह से नहीं भरता था।

  //Graphics fontG = this.textBox4.CreateGraphics(); //fontG.PageUnit = GraphicsUnit.Point; //SizeF fontSize = fontG.MeasureString(RowData, this.textBox4.Font,(SizeF) this.textBox4.ClientSize); sb.AppendLine(); RowData = ""; //fontH += fontSize.Height + 1.2F; //fontW = (int) fontSize.Width; 

कल के लिए एंड्रॉइड के लिए एक समान सवाल था जिस तरीके से मैं देखता हूं उसे हल करने की जरूरत है एक पुनरावृत्ति दृष्टिकोण:

  • JTextArea चौड़ाई प्राप्त करें
  • स्ट्रिंग की चौड़ाई प्राप्त करने के लिए FontMetrics का उपयोग करें, जैसा कि jjnguy सुझाव दिया गया है
  • शब्दों में अपनी स्ट्रिंग विभाजित करें
  • जब तक आप क्षेत्र चौड़ाई तक नहीं पहुंच जाते, तब तक एक शब्द जोड़ते हुए स्ट्रिंग के witdh को मापना प्रारंभ करें वह नंबर सहेजें
  • एक बार जब आप इसे पहुंचे, तो एक बार फिर चलना शुरू करें, एक बार में एक शब्द जोड़कर (सहेजे गए नंबर से शुरुआत)।
  • लाइनों की संख्या पुनरावृत्तियों की संख्या होगी।

दुर्भाग्य से, पंक्ति की लंबाई फ़ॉन्ट और विशेष स्ट्रिंग पर निर्भर करती है (एक ही चौड़ाई के रूप में प्रत्येक वर्ण नहीं)। आप प्रत्येक चलना में शब्दों में वर्णों की संख्या की गणना कर सकते हैं, और लंबाई या लंबाई औसत की एक सरणी वापस कर सकते हैं।

यह संबंधित एंड्रॉइड क्वालिटी है : एंड्रॉइड टेक्स्टव्यूवर संख्याओं को प्रति लाइन में कैसे पाएं?

मुझे लगता है कि पाठ विश्लेषण द्वारा लाइनों की संख्या की गणना केवल कुछ नहीं करने के लिए प्रेरित किया इसके बजाय मेरा समाधान उस पाठ क्षेत्र के पसंदीदा आकार से गणना कर रहा था …

 import java.awt.Color; import java.awt.Dimension; import java.awt.Font; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.event.CaretEvent; import javax.swing.event.CaretListener; public class LineNumbering extends JFrame { private static final long serialVersionUID = 1L; private static final Font fixedFont = new Font("Monospaced", Font.PLAIN, 12); private static JTextArea jta; private static JTextArea lines; private static String lineSeparator = "\n"; private static int numRows = 10; private static int numCols = 30; public LineNumbering() { super("Line Numbering Example"); } public static void createAndShowGUI() { JFrame frame = new LineNumbering(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JScrollPane jsp = new JScrollPane(); jta = new JTextArea(numRows, numCols); jta.setFont(fixedFont); jta.setLineWrap(true); jta.setWrapStyleWord(true); lines = new JTextArea(numRows, 3); lines.setEditable(false); lines.setFocusable(false); lines.setEnabled(false); lines.setFont(fixedFont); lines.setBackground(Color.LIGHT_GRAY); lines.setDisabledTextColor(Color.BLACK); // do initial line numbering for (int i = 1; i <= lines.getRows(); i++) { lines.append(i + System.getProperty("line.separator")); } final class DebugCaretListener implements CaretListener { int rowHeight = jta.getFontMetrics(jta.getFont()).getHeight(); /** * @return total of lines showed in the text area */ private int getTotalLinesInView() { int insetsTotalHeight = jta.getInsets().top + jta.getInsets().bottom; return (jta.getPreferredSize().height - insetsTotalHeight) / rowHeight; } /** * @return text with line numbers */ public String getText() { StringBuffer text = new StringBuffer(); int totalLines = getTotalLinesInView(); System.out.println("totalLines : " + totalLines); for (int i = 1; i <= totalLines; i++) { text.append(i); if (i < totalLines) { text.append(lineSeparator); } } return text.toString(); } /** * <p> * Reset line numbers on caret event. Since the total number of * lines is calculated from preferred size of text area, we do this * on an event that occurred after repainting of the text area. * </p> * (non-Javadoc) * * @see javax.swing.event.CaretListener#caretUpdate(javax.swing.event.CaretEvent) */ @Override public void caretUpdate(CaretEvent e) { int totalLines = getTotalLinesInView(); System.out.println("totalLines : " + totalLines); if (totalLines >= numRows) { lines.setText(getText()); } } } jta.addCaretListener(new DebugCaretListener()); jsp.getViewport().add(jta); jsp.setRowHeaderView(lines); jsp.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_NEVER); jsp.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); JPanel textPanel = new JPanel(); textPanel.add(jsp); JPanel contentPanel = new JPanel(); contentPanel.add(textPanel); frame.setContentPane(contentPanel); contentPanel.setOpaque(true); frame.pack(); frame.setPreferredSize(new Dimension(500, 500)); frame.setVisible(true); } public static void main(String[] args) { javax.swing.SwingUtilities.invokeLater(new Runnable() { public void run() { createAndShowGUI(); } }); } }