如何在Java SWING中的新行上启动一些东西?

时间:2015-09-08 21:06:54

标签: java swing jtextarea

我正在尝试将我的JTextArea设置为占据屏幕的最大长度,以便接下来的东西,在这种情况下是一个按钮,将从一个新行开始,但我不知道如何做到这一点。通过将JTextArea的大小设置为从20更改为1000但我没有做任何事情,我搞砸了。

如何让我的textarea占用整个第一行,然后让我添加的下一个项目开始在下一行?这是我到目前为止所拥有的......

MyFrame(){//constructor

        super("Simple Calculator");
        p = new JPanel();
        grid = new GridLayout(4, 4, 3, 3);
        p.setLayout(grid);
        setSize(400, 500);
        setResizable(true);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setUpTextScreen();
        //create buttons
        for(int i = 0; i < buttonValues.length; i++){
            p.add(new JButton(buttonValues[i]));
        }
        add(p);
        setVisible(true);
    }

    private void setUpTextScreen() {

        textOnScreen = new JTextArea(7, 1000);
        textOnScreen.setText("0");//default
        textOnScreen.setEditable(false);
        p.add(textOnScreen);
    }

3 个答案:

答案 0 :(得分:5)

  

如何让我的textarea占用整个第一行,然后让我添加的下一个项目开始在下一行?

将您的布局分解为逻辑部分。从BorderLayout开始使用主面板。

  1. 首先,我会使用JTextField作为计算器显示,而不是JTextArea。然后,您可以使用以下内容添加文本字段:mainPanel.add(textField, BorderLayout.PAGE_START);

  2. 然后使用GridLayout为按钮创建JPanel。然后将按钮添加到按钮面板并使用:maonPanel.add(buttonPanel, BorderLayout.CENTER);

  3. 例如:

    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    import javax.swing.border.*;
    
    public class CalculatorPanel extends JPanel
    {
        private JTextField display;
    
        public CalculatorPanel()
        {
            Action numberAction = new AbstractAction()
            {
                @Override
                public void actionPerformed(ActionEvent e)
                {
    //              display.setCaretPosition( display.getDocument().getLength() );
                    display.replaceSelection(e.getActionCommand());
                }
            };
    
            setLayout( new BorderLayout() );
    
            display = new JTextField();
            display.setEditable( false );
            display.setHorizontalAlignment(JTextField.RIGHT);
            add(display, BorderLayout.NORTH);
    
            JPanel buttonPanel = new JPanel();
            buttonPanel.setLayout( new GridLayout(0, 5) );
            add(buttonPanel, BorderLayout.CENTER);
    
            for (int i = 0; i < 10; i++)
            {
                String text = String.valueOf(i);
                JButton button = new JButton( text );
                button.addActionListener( numberAction );
                button.setBorder( new LineBorder(Color.BLACK) );
                button.setPreferredSize( new Dimension(30, 30) );
                buttonPanel.add( button );
    
                InputMap inputMap = button.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
                inputMap.put(KeyStroke.getKeyStroke(text), text);
                inputMap.put(KeyStroke.getKeyStroke("NUMPAD" + text), text);
                button.getActionMap().put(text, numberAction);
            }
        }
    
        private static void createAndShowUI()
        {
            JFrame frame = new JFrame("Calculator Panel");
            frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
            frame.add( new CalculatorPanel() );
            frame.pack();
            frame.setLocationRelativeTo( null );
            frame.setVisible(true);
        }
    
        public static void main(String[] args)
        {
            EventQueue.invokeLater(new Runnable()
            {
                public void run()
                {
                    createAndShowUI();
                }
            });
        }
    }
    

答案 1 :(得分:4)

Hava看一下Nested layouts,你可以添加一个带有BorderLayout的面板(虽然还有其他选项)并将textarea添加到它。然后你只需要一个带有GridLayout的面板来显示按钮。这是一个示例:(请注意,此代码中不需要几行,但它们有助于理解布局)

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridLayout;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.border.LineBorder;

public class Example extends JFrame {

    Example() {//

        super("Simple Calculator");

        // The Main Panel where the 2 other panels will be on
        JPanel mainPanel = new JPanel(new BorderLayout());

        // The textarea will be inside this panel
        JPanel areaPanel = new JPanel(new BorderLayout());

        JTextArea area = new JTextArea(
                "This is a JTextArea -Long text to show it works -Long text to show it works- -Long text to show it works- -Long text to show it works- -Long text to show it works- -Long text to show it works-");
        area.setBorder(new LineBorder(Color.BLACK));
        area.setWrapStyleWord(true);
        area.setLineWrap(true);

        // Fill the whole space of the panel with the area
        areaPanel.add(area, BorderLayout.CENTER);

        // The buttons will be inside this panel
        JPanel buttonPanel = new JPanel(new GridLayout(4, 4, 3, 3));
        for (int i = 0; i < 16; i++) { // Adding buttons
            buttonPanel.add(new JButton("Button" + i));
        }

        // The textarea-panel should be on top of the main panel
        mainPanel.add(areaPanel, BorderLayout.NORTH);

        // The panel with the buttons should fill the remaining space
        mainPanel.add(buttonPanel, BorderLayout.CENTER);

        getContentPane().add(mainPanel);

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(500, 500);
        setVisible(true);
    }

    public static void main(String[] args) {
        new Example();
    }

}

答案 2 :(得分:-1)

您还可以使用html标签,如:

JButton button = new JButton("<html><b><u>T</u>wo</b><br>lines</html>");

或者像你得到的任何其他JComponent。

因此,您可以使用<BR>标记来满足您的需求。