JLabelは、1行のテキストを表示するように作成されています。はい、あなたはもっと多くを示すためにそれを陪審することができますが、それは厄介であり、しばしばあなたのコードで将来の問題を引き起こす可能性があります。代わりに、あなたはJTextAreaにテキストを表示することをお勧めします。は、その背景色をnullにしてJLabelのように、がJLabelのように見えるようにすることができます。ただし、JScrollPaneに追加すると、スクロールバー(該当する場合)とスクロールペインの境界線が表示されますが、これが問題になる可能性があります。また、JTextAreaをフォーカスしないようにし、編集不可能にすることで、ラベルのように機能し、ユーザーのやりとりを受け入れるテキストコンポーネントに似ていないようにします。
JTextFieldsのように、JTextFieldsには、テキストファイルの読み込みに参加できるように、必要に応じて改行を保持するためのリーダーが渡されるメカニズムがあります。詳しくはread method API entryをご覧ください。いつものように、Swingのスレッドルールを尊重し、バックグラウンドスレッドでのテキストI/Oと、SwingイベントスレッドでのすべてのSwing突然変異呼び出しに注意してください。
あなたのコードは、私いくつかを心配:
- あなたは上記のあなたの方法で2つのリターンを持っている、との両方が、情報の2つの非常に異なるビットを返す例外
- を無視しているように見えます。たとえば、
:
import java.awt.BorderLayout;
import java.awt.event.*;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import javax.swing.*;
import javax.swing.filechooser.FileNameExtensionFilter;
@SuppressWarnings("serial")
public class TextAreaAsLabel extends JPanel {
private static final int TA_ROWS = 30;
private static final int TA_COLS = 50;
private static final Font TA_FONT = new Font(Font.DIALOG, Font.BOLD, 12);
private JTextArea textArea = new JTextArea(TA_ROWS, TA_COLS);
public TextAreaAsLabel() {
// JButton and JPanel to open file chooser and get text
JPanel buttonPanel = new JPanel();
buttonPanel.add(new JButton(new ReadTextAction("Read Text")));
// change JTextArea's properties so it "looks" like a multi-lined JLabel
textArea.setLineWrap(true);
textArea.setWrapStyleWord(true);
textArea.setBackground(null);
textArea.setBorder(null);
textArea.setFocusable(false);
textArea.setEditable(false);
textArea.setFont(TA_FONT);
// add components to *this* jpanel
setLayout(new BorderLayout());
add(textArea, BorderLayout.CENTER);
add(buttonPanel, BorderLayout.PAGE_END);
}
private class ReadTextAction extends AbstractAction {
public ReadTextAction(String name) {
super(name);
int mnemonic = (int) name.charAt(0);
putValue(MNEMONIC_KEY, mnemonic);
}
@Override
public void actionPerformed(ActionEvent e) {
// create file chooser and limit it to selecting text files
JFileChooser fileChooser = new JFileChooser();
FileNameExtensionFilter filter = new FileNameExtensionFilter("Text Files", "txt");
fileChooser.setFileFilter(filter);
fileChooser.setMultiSelectionEnabled(false);
// display it as a dialog
int choice = fileChooser.showOpenDialog(TextAreaAsLabel.this);
if (choice == JFileChooser.APPROVE_OPTION) {
// get file, check if it exists, if it's not a directory
File file = fileChooser.getSelectedFile();
if (file.exists() && !file.isDirectory()) {
// use a reader, pass into text area's read method
try (BufferedReader br = new BufferedReader(new FileReader(file))){
textArea.read(br, "Reading in text file");
} catch (IOException e1) {
e1.printStackTrace();
}
}
}
}
}
private static void createAndShowGui() {
JFrame frame = new JFrame("Foo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(new TextAreaAsLabel());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> createAndShowGui());
}
}
私は、データの読み込みに問題があります。私が別のクラスでそのメソッドを呼び出すと、nullであると言います。私はそれを持っている必要がありますので、私はそれをすべてのデータを持つ別の方法で呼び出す? –
@TylerBull:上のサンプルコードを参照してください。あなたの新しい問題は完全に無関係な問題であり、デバッグする必要があります。あなたのコードに戻って、あなたが期待していないところでなぜnullになっているのかを見てみましょう。必要に応じてデバッガを使用してください。 –
私はそれを働かせました。私はJTextAreaを使用し、テキストを表示するために配列を追加しました。ご協力いただきありがとうございます。 –