如何为 JTextArea 的 frame/border 着色?

How can I color this frame/border of my JTextArea?

我想做一个TextEditor并尝试改变一些颜色。但是我仍然难以更改 JTextAreaJFrame 的颜色(我的意思是这个白色边框)并且也不知道如何制作这个文本区域以便它总是将大小更改为选定的 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 的中心组件将始终伸展以填充容器的 space。

请记住,您可以将面板放在面板内。将字体和颜色 labels/fields 放入使用 FlowLayout 的 JPanel 中,然后将该 JPanel 放入使用 BorderLayout 的 JPanel 的 NORTH 区域中。您的 JScrollPane 属于同一个 BorderLayout 的中心。

删除对 setPreferredSize、setMinimumSize 和 setMaximumSize 的所有调用。它们正在干扰布局管理器正确安排事物的能力。所有组件在创建时都有一个有用的首选大小。

要设置 JScrollPane 的大小,请使用 setRows and setColumns methods of JTextArea. The JScrollPane parent will consult its Scrollable 视图(即 JTextArea)来确定其首选大小。