2012-12-23 83 views
1

你们在这个论坛上一直是一个很好的帮助,并且我学到了很多东西,但是我确实有一个希望)最后一个问题,我的代码无法编译,我得到一个错误:当我得到上述错误是亮点下面的代码行找不到合适的构造函数为AttributedString(java.util.List <java.lang.String>)

no suitable constructor found for AttributedString(java.util.List<java.lang.String>) 
constructor java.text.ArributedString(java.text.AttributedCharacterator,int,int,java.text.AttributedCharacterator.Attribute[]) is not applicable (actual and formal argument lists differ in length 

AttributedString mStyledText = new AttributedString(list); 

与帮助,从另一个线程有人建议这是因为我传递的是整个字符串列表而不是单个字符串。

什么是造成此错误?更重要的是我如何克服它

代码如下

import java.awt.*; 
import java.awt.font.*; 
import java.awt.geom.*; 
import java.awt.print.*; 
import java.text.*; 
import java.io.*; 
import javax.swing.*; 
import java.util.List; 
import java.util.ArrayList; 

public class PrintText implements Printable { 

    private String text; // Constructor argument for AttributedString. 

    // Below the code will allow the user to select a file and then print out the contents of the file 
    public static void main(String[] args) throws IOException { 
     new PrintText(); 
    } 

    public PrintText() { 
     EventQueue.invokeLater(new Runnable() { 
       @Override 
       public void run() { 
        try { 
         UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
        } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
        } 

        //selects the file 
        JFileChooser chooser = new JFileChooser(); 
        chooser.showOpenDialog(null); 
        File file = chooser.getSelectedFile(); 
        String filename = file.getName(); 
        //System.out.println("You have selected: " + filename); testing to see if file seleected was right 
        String path = file.getAbsolutePath(); 

        //Reads contents of file into terminal 
        //FileReader fr = new FileReader("filename"); 
        // FileReader fr = new FileReader("D:/Documents/" + "filename")); 

        BufferedReader br = null; 
        try { 
         br = new BufferedReader(new FileReader(path)); 
         StringBuilder stringBuilder = new StringBuilder(); 
         String line; 
         while ((line = br.readLine()) != null) { 
          System.out.println(line); 
          stringBuilder.append(line).append("\n"); 
         } 
         text = stringBuilder.toString();; 

         printer(); 
        } catch (IOException exp) { 
         exp.printStackTrace(); 
        } finally { 
         try { 
          br.close(); 
         } catch (Exception e) { 
         } 
        } 
        //fr.close(); 
       } 
      }); 
    } 
    //private static final String mText = 
    // "This is a test to see if this text will be printed "; //This works perfectly fine 
    //AttributedString mStyledText = new AttributedString(mText); 
    /** 
    * Print a single page containing some sample text. 
    */ 
    public void printer() { 

     /* Get the representation of the current printer and 
     * the current print job. 
     */ 
     PrinterJob printerJob = PrinterJob.getPrinterJob(); 
     /* Build a book containing pairs of page painters (Printables) 
     * and PageFormats. This example has a single page containing 
     * text. 
     */ 
     Book book = new Book(); 
     book.append(this, new PageFormat()); 
     /* Set the object to be printed (the Book) into the PrinterJob. 
     * Doing this before bringing up the print dialog allows the 
     * print dialog to correctly display the page range to be printed 
     * and to dissallow any print settings not appropriate for the 
     * pages to be printed. 
     */ 
     printerJob.setPageable(book); 
     /* Show the print dialog to the user. This is an optional step 
     * and need not be done if the application wants to perform 
     * 'quiet' printing. If the user cancels the print dialog then false 
     * is returned. If true is returned we go ahead and print. 
     */ 
     boolean doPrint = printerJob.printDialog(); 
     if (doPrint) { 
      try { 
       printerJob.print(); 
      } catch (PrinterException exception) { 
       System.err.println("Printing error: " + exception); 
      } 
     } 
    } 

    /** 
    * Print a page of text. 
    */ 
    public int print(Graphics g, PageFormat format, int pageIndex) { 

     AttributedString mStyledText = new AttributedString(); 
     Graphics2D g2d = (Graphics2D) g; 
     g2d.translate(format.getImageableX(), format.getImageableY()); 
     g2d.setPaint(Color.black);// Sets text colour 
     Point2D.Float pen = new Point2D.Float(); 
     AttributedCharacterIterator charIterator = mStyledText.getIterator(); 
     LineBreakMeasurer measurer = new LineBreakMeasurer(charIterator, g2d.getFontRenderContext()); 
     float wrappingWidth = (float) format.getImageableWidth(); 
     while (measurer.getPosition() < charIterator.getEndIndex()) { 
      TextLayout layout = measurer.nextLayout(wrappingWidth); 
      pen.y += layout.getAscent(); 
      float dx = layout.isLeftToRight() ? 0 : (wrappingWidth - layout.getAdvance()); 
      layout.draw(g2d, pen.x + dx, pen.y); 
      pen.y += layout.getDescent() + layout.getLeading(); 
     } 
     return Printable.PAGE_EXISTS; 
    } 
} 

更新上面的代码,以我现在所运行

+0

如果没有suitible构造器中发现OBV它意味着你不使用对象参数。让我更多地了解这个对象,看看它是如何正确完成的。 – DrinkJavaCodeJava

+0

你应该养成使用API​​的习惯,因为所有这些都在那里得到了回答,包括哪些构造函数对这个类是有效的,如果你看一看。 –

+0

*“有一个(希望)最终的问题,我的代码不会编译,..”*清洁编译后,然后来'运行时错误和异常'。 :) –

回答

1

使用一个StringBuilder来构建一个单一的字符串。

更换

private List<String> list; 

...

    // Wrong: List<String> list = new ArrayList<String>(); 
        list = new ArrayList<String>(); // 
        String line; 
        while ((line = br.readLine()) != null) { 
         System.out.println(line); 
         list.add(line); 
        } 

通过

private String text; // Constructor argument for AttributedString. 

...

    StringBuilder stringBuilder = new StringBuilder(); 
        String line; 
        while ((line = br.readLine()) != null) { 
         System.out.println(line); 
         stringBuilder.append(line).append("\n"); 
        } 
        text = stringBuilder.toString(); 
+0

谢谢,我刚刚尝试过,但编译我得到错误不兼容的类型,它突出显示字符串stringBuilder =新的StringBuilder(); – user1924104

+0

复制错误;应该是'StringBuilder stringBuilder ...' –

+0

非常感谢:) – user1924104

3

这些都为类valid constructors

AttributedString(AttributedCharacterIterator text) 
AttributedString(AttributedCharacterIterator text, int beginIndex, int endIndex) 
AttributedString(AttributedCharacterIterator text, int beginIndex, int endIndex, AttributedCharacterIterator.Attribute[] attributes) 
AttributedString(String text) 
AttributedString(String text, Map<? extends AttributedCharacterIterator.Attribute,?> attributes) 

他们都不需要一个字符串列表,所以你需要重新思考你传递给它的东西。可能是:

list.get(0); 
2

如果你看看AttributedString的API不存在构造函数需要一个列表作为参数。因此,当您尝试将它传递给列表时,您会收到编译时错误。

AttributedString mStyledText = new AttributedString(list); 

下面是AttributedString class

AttributedString(AttributedCharacterIterator text) 
AttributedString(AttributedCharacterIterator text, int beginIndex, int endIndex) 
AttributedString(AttributedCharacterIterator text, int beginIndex, int endIndex, AttributedCharacterIterator.Attribute[] attributes) 
AttributedString(String text) 
AttributedString(String text, Map<? extends AttributedCharacterIterator.Attribute,?> attributes) 
1

唯一允许的构造函数没有构造函数接受List<String>

考虑到AttributedString处理单个字符串值,将列表传递给它是没有意义的。

也许你想要一个列表,即List<AttributedString>?在这种情况下,在List<String>上循环调用String的构造函数并将其添加到List<AttributedString>

相关问题