【问题标题】:How can I color this frame/border of my JTextArea?如何为我的 JTextArea 的框架/边框着色?
【发布时间】:2021-11-01 16:33:57
【问题描述】:

我想制作一个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);
    
}
        
        
        
    }

}

【问题讨论】:

  • 提供基本图形或 ASCII 艺术图形,说明 GUI 应如何以最小尺寸显示,如果可调整大小,则添加更多宽度和高度。上面看到的代码中有多个错误,但是如果您能清楚地(用图片)解释 GUI 的外观,我(或其他人)可能愿意提供示例代码来说明如何将它们组合在一起。

标签: java swing jframe jtextarea


【解决方案1】:

您需要使用多种布局。仅 FlowLayout 是不够的。

BorderLayout 的中心组件将始终拉伸以填充容器的空间。

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

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

要设置 JScrollPane 的大小,请使用 JTextArea 的 setRowssetColumns 方法。 JScrollPane 父级将咨询其Scrollable 视图(即JTextArea)以确定其首选大小。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-02
    • 2020-12-18
    • 2017-07-30
    • 2022-12-31
    • 2015-10-12
    相关资源
    最近更新 更多