到目前为止,你们在这个论坛上得到了很大的帮助,我学到了很多东西,但我有一个(希望)最后一期,我的代码没有编译,我得到一个错误:
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 :(得分: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);
答案 1 :(得分:2)
如果查看AttributedString的API,则没有构造函数将List作为参数。因此,当您尝试将List传递给List时会出现编译时错误。
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)
答案 2 :(得分:1)
没有构造函数接受List<String>
。
考虑到AttributedString
处理单个字符串值,将列表传递给它是没有意义的。
也许您想要一个列表,即List<AttributedString>
?在这种情况下,循环调用List<String>
构造函数的String
并添加到List<AttributedString>
。
答案 3 :(得分:1)
使用StringBuilder构建一个String。
替换
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();