我想做一个TextEditor
,并试图改变一些颜色。但是我仍然很难改变JTextArea
的JFrame
的颜色(我的意思是这个白色边框),也不知道如何使这个文本区域的大小总是改变为所选的JFrame大小。
TextEditorPicture
TextEditorPicture2
public class TextEditor extends JFrame implements ActionListener {
JTextArea textArea;
JScrollPane scrollPane;
JLabel fontLabel;
JSpinner fontSizeSpinner;
JButton fontColorButton;
JComboBox fontBox;
JMenuBar menuBar;
JMenu fileMenu;
JMenuItem openItem;
JMenuItem saveItem;
JMenuItem exitItem;
TextEditor(){
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setTitle("TextEditor");
this.setSize(500,500);
this.setMinimumSize(new Dimension(500,0));
this.setMaximumSize(new Dimension(500, Integer.MAX_VALUE));
this.setVisible(true);
this.setLayout(new FlowLayout());
this.setLocationRelativeTo(null);
this.getContentPane().setBackground(Color.decode("#252025"));
//Text Area
textArea = new JTextArea();
textArea.setVisible(true);
textArea.setLineWrap(true);
textArea.setWrapStyleWord(true);
textArea.setFont(new Font("SF Mono Regular 11", Font.PLAIN,20));
textArea.setBackground(Color.decode("#252025"));
textArea.setForeground(Color.decode("#eaeaea"));
//Scroll Panel Sidebar
scrollPane = new JScrollPane(textArea);
scrollPane.setPreferredSize(new Dimension(500,500));
scrollPane.setMinimumSize(new Dimension(500,0));
scrollPane.setMaximumSize(new Dimension(Integer.MAX_VALUE, Integer.MAX_VALUE));
scrollPane.setVisible(true);
scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
//Font Text
fontLabel = new JLabel("Font: ");
fontLabel.setForeground(Color.decode("#eaeaea"));
//Font Size Spinner
fontSizeSpinner = new JSpinner();
fontSizeSpinner.setPreferredSize(new Dimension(50,25));
fontSizeSpinner.setValue(20);
fontSizeSpinner.getEditor().getComponent(0).setBackground(Color.decode("#252025"));
fontSizeSpinner.addChangeListener(new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
textArea.setFont(new Font("SF Mono Regular 11",Font.PLAIN,(int) fontSizeSpinner.getValue()));
textArea.setSelectedTextColor(Color.white);
}
});
fontColorButton = new JButton("Color");
fontColorButton.setBackground(Color.decode("#252025"));
fontColorButton.setOpaque(true);
fontColorButton.setBorderPainted(false);
fontColorButton.addActionListener(this);
fontColorButton.setForeground(Color.decode("#eaeaea"));
String[] fonts = GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailableFontFamilyNames();
//Font Change Box
fontBox = new JComboBox(fonts);
fontBox.addActionListener(this);
fontBox.setBackground(Color.decode("#252025"));
fontBox.setForeground(Color.green);
fontBox.setOpaque(true);
fontBox.setEditable(true);
fontBox.getEditor().getEditorComponent().setBackground(Color.decode("#252025"));
((JTextField) fontBox.getEditor().getEditorComponent()).setBackground(Color.decode("#252025"));
fontBox.setSelectedItem("SF Mono Regular 11");
//Menubar
menuBar = new JMenuBar();
fileMenu = new JMenu("File");
openItem = new JMenuItem("Open");
saveItem = new JMenuItem("Save");
exitItem = new JMenuItem("Exit");
openItem.addActionListener(this);
saveItem.addActionListener(this);
exitItem.addActionListener(this);
fileMenu.add(openItem);
fileMenu.add(saveItem);
fileMenu.add(exitItem);
menuBar.add(fileMenu);
this.setJMenuBar(menuBar);
this.add(fontLabel);
this.add(fontSizeSpinner);
this.add(fontColorButton);
this.add(fontBox);
this.add(scrollPane);
this.setVisible(true);
}
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
if(e.getSource() == fontColorButton) {
JColorChooser colorChooser = new JColorChooser();
Color color = colorChooser.showDialog(null, "Color", Color.white);
}
if(e.getSource()==fontBox) {
textArea.setFont(new Font((String)fontBox.getSelectedItem(),Font.PLAIN,textArea.getFont().getSize()));
}
//Open
if(e.getSource()==openItem) {
JFileChooser fileChooser = new JFileChooser();
fileChooser.setCurrentDirectory(new File("."));
FileNameExtensionFilter filter = new FileNameExtensionFilter("Text Files", "txt");
fileChooser.setFileFilter(filter);
int response = fileChooser.showOpenDialog(null);
if(response==JFileChooser.APPROVE_OPTION) {
File file = new File(fileChooser.getSelectedFile().getAbsolutePath());
Scanner fileIn = null;
try {
fileIn = new Scanner(file);
if(file.isFile()) {
while(fileIn.hasNextLine()) {
String line = fileIn.nextLine()+"n";
textArea.append(line);
}
}
} catch (FileNotFoundException e1){
e1.printStackTrace();
} finally {
fileIn.close();
}
}
}
//Save
if(e.getSource()==saveItem) {
JFileChooser fileChooser = new JFileChooser();
fileChooser.setCurrentDirectory(new File("."));
int response = fileChooser.showSaveDialog(null);
if(response==JFileChooser.APPROVE_OPTION) {
File file;
PrintWriter fileOut = null;
file = new File(fileChooser.getSelectedFile().getAbsolutePath());
try {
fileOut = new PrintWriter(file);
fileOut.println(textArea.getText());
} catch (FileNotFoundException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} finally {
fileOut.close();
}
}
}
//Exit
if(e.getSource()==exitItem) {
System.exit(0);
}
}
}
你需要使用多种布局。只有FlowLayout是不够的。
BorderLayout的center组件将始终拉伸以填充容器的空间。
请记住,您可以在面板中放置面板。将字体和颜色标签/字段放在使用FlowLayout的JPanel中,然后将该JPanel放在使用BorderLayout的JPanel的NORTH区域中。你的JScrollPane属于同一个BorderLayout的中心。
删除对setPreferredSize, setMinimumSize和setMaximumSize的所有调用。它们干扰了布局管理器正确安排内容的能力。所有组件在创建时都有一个有用的首选大小。
要设置JScrollPane的大小,使用JTextArea的setRows和setColumns方法。JScrollPane父组件将参考它的Scrollable视图(即JTextArea)来确定它的首选大小。