我正在为家庭作业写的代码有问题。
当我加载txt文档时,我需要它执行的功能很简单我希望GUI中的左侧面板显示文档中的文本。
我已经尝试了一些调整JTextField和使用JTextArea的东西,但每当我加载示例文件时,我总是最后得到一个小空框,我可以输入内容。
如果有人为此修复/解决方案并且可以指出我做错了什么,那将非常感激。
这是我的代码。
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import javax.swing.*;
public class JavaAssingnment {
public static void main(String[] args) throws FileNotFoundException {
window window = new window();
String reader;
}
public static class window extends JFrame {
public window() throws FileNotFoundException {
JMenuBar menuBar = new JMenuBar(); // menubar
JMenu menu1 = new JMenu("File"); //menu
menuBar.add(menu1); // add menu to gui
JMenu menu2 = new JMenu("Help");
menuBar.add(menu2);
JMenuItem menuItem1 = new JMenuItem("Load File", KeyEvent.VK_1); // create drop down menu
JMenuItem menuItem2 = new JMenuItem("Save File", KeyEvent.VK_1);
JMenuItem menuItem3 = new JMenuItem("Exit", KeyEvent.VK_1);
JMenuItem menuItem4 = new JMenuItem("About", KeyEvent.VK_1);
menu1.add(menuItem1); // adds drop down menus to gui
menu1.add(menuItem2);
menu1.add(menuItem3);
menu2.add(menuItem4);
JPanel leftScrollPane = new JPanel();
JPanel rightPane = new JPanel();
JSplitPane splitPane;
JTextArea input = new JTextArea();
input.setVisible(true);
input.setSize(300,300);
leftScrollPane.add(input);
this.setVisible(true);
this.setSize(400, 400);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
splitPane = new JSplitPane();
splitPane.setOrientation(JSplitPane.HORIZONTAL_SPLIT);
splitPane.setDividerSize(10);
splitPane.setDividerLocation(100);
splitPane.setLeftComponent(leftScrollPane);
splitPane.setRightComponent(rightPane);
splitPane.setOneTouchExpandable(true);
splitPane.setDividerLocation(600);
Dimension minimumSize = new Dimension(100, 50);
leftScrollPane.setSize(400, 400);
this.setJMenuBar(menuBar);
splitPane.setPreferredSize(new Dimension(400, 200));
splitPane.setLeftComponent(leftScrollPane);
splitPane.setRightComponent(rightPane);
this.add(splitPane);
this.setSize(1280, 720);
// execute code when selected
menuItem1.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
final JFileChooser fc = new JFileChooser();
// you can set the directory with the setCurrentDirectory method.
int returnVal = fc.showOpenDialog(null);
if (returnVal == JFileChooser.APPROVE_OPTION) {
// User has selected to open the file.
File file = fc.getSelectedFile();
try {
// Open the selected file
BufferedReader reader = new BufferedReader(new FileReader(file));
// Output the contents to the console.
String nextLine = reader.readLine();
while ( nextLine != null ) {
nextLine = reader.readLine();
input.setText(nextLine);
}
reader.close();
} catch (IOException e1) {
System.err.println("Error while reading the file");
}
}
}});
}
}
}
答案 0 :(得分:2)
splitPane.setLeftComponent(leftScrollPane);
splitPane.setRightComponent(rightPane);
splitPane.setOneTouchExpandable(true);
splitPane.setDividerLocation(600);
Dimension minimumSize = new Dimension(100, 50);
leftScrollPane.setSize(400, 400);
this.setJMenuBar(menuBar);
splitPane.setPreferredSize(new Dimension(400, 200));
splitPane.setLeftComponent(leftScrollPane); // ???
splitPane.setRightComponent(rightPane); // ??
为什么要将组件添加到splitpane两次?
JPanel leftScrollPane = new JPanel();
JPanel rightPane = new JPanel();
JSplitPane splitPane;
JTextArea input = new JTextArea();
input.setVisible(true);
input.setSize(300,300);
leftScrollPane.add(input);
为什么要将文本区域添加到您调用"滚动窗格"的JPanel中。通常,您会将文本区域添加到实际的JScrollPane,以便在必要时可以使用滚动条。小组不需要。也:
所以更好的代码就像:
JTextArea textArea = new JTextArea(5,20);
JScrollPane scrollPane = new JScrollPane( textArea );
splitPane.setLeftComponent( scrollPane );
每当我加载示例文件时
不要循环读取文件。使用JTextArea的read(...)方法:
textArea.read(reader, null);
答案 1 :(得分:1)
JTextArea input = new JTextArea();
这并不表示尺寸,而..
JTextArea input = new JTextArea(20,40);
建议列和行的大小。
input.setSize(300,300);
这丝毫没有帮助,因为布局会忽略大小而偏向于首选大小。但是不要乱用它,因为数字只是猜测,而设置行和列允许运行时确定它应该有多大。
此外:
JPanel leftScrollPane = new JPanel();
最终将使用默认FlowLayout
,这意味着组件将以其首选尺寸显示,并且不会拉伸到面板的大小。
这将“修复”:
JPanel leftScrollPane = new JPanel(new GridLayout()); // will stretch content to fill
答案 2 :(得分:0)
除了Andrew Thompson所说的,你的while循环中还有一个错误。
String nextLine = reader.readLine();
你在这里阅读第一行。
while ( nextLine != null ) {
如果第一行不为空
nextLine = reader.readLine();
您阅读第二行并将其显示在屏幕上。
input.setText(nextLine);
}
您不会在控制语句中检查while循环的读取行。
而是尝试这样:
String nextLine;
String temp ="";
while ( ( nextLine = reader.readLine()) != null ) {
temp += nextLine;
input.setText(temp);
如果你没有将你之前读过的每一行添加到新读取的行中,你将只得到文本文件的最后一行。