Использование setBounds или setLocation на JTextArea не работает

Я добавляю JTextArea в мою JPanel с этим кодом:

commentTextArea.setLineWrap(true);
commentTextArea.setWrapStyleWord(true);
commentTextArea.setVisible(true);
this.add(commentTextArea);
commentTextArea.setBounds(0, 0, 100, 100);
//commentTextArea.setLocation(0, 0);

Всякий раз, когда я использую setLocation(0,0), JTextArea никогда не перемещается. Это всегда в верхней средней части экрана, а не в (0,0). То же самое касается setBounds(0,0,100,100), НО высота и ширина задаются таким образом, а не местоположением. Почему это?

Полный код

import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;

import javax.swing.JFrame;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JTextArea;

public class UMLEditor {

    public static void main(String[] args) {
        JFrame frame = new UMLWindow();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setBounds(30, 30, 1000, 700);
        frame.getContentPane().setBackground(Color.white);
        frame.setVisible(true);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
}

class UMLWindow extends JFrame {
    Canvas canvas = new Canvas();

    private static final long serialVersionUID = 1L;

    public UMLWindow() {
        addMenus();
    }

    public void addMenus() {

        getContentPane().add(canvas);

        JMenuBar menubar = new JMenuBar();

        JMenuItem newTextBox = new JMenuItem("New Text Box");
        newTextBox.setMnemonic(KeyEvent.VK_E);
        newTextBox.setToolTipText("Exit application");
        newTextBox.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent event) {
                canvas.addTextBox();
            }
        });

        menubar.add(newTextBox);

        setJMenuBar(menubar);

        setSize(300, 200);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
    }
}

class Canvas extends JPanel {

    JTextArea commentTextArea = new JTextArea(10, 10);

    public Canvas() {
        this.setOpaque(true);

    }

    public void addTextBox() {

        commentTextArea.setLineWrap(true);
        commentTextArea.setWrapStyleWord(true);
        commentTextArea.setVisible(true);
        commentTextArea.setLocation(0, 0);
        this.add(commentTextArea);
        commentTextArea.setBounds(0, 0, 100, 100);

        revalidate();
        repaint();
    }
}

1 ответ

Решение

Установка позиции компонента с помощью setBounds(...) работает только для нулевых макетов, т. е.

container.setLayout(null);` 

но независимо от этого, я собираюсь предложить вам не делать этого, поскольку это делает для очень негибкого графического интерфейса пользователя то, что, хотя они могут хорошо выглядеть на одной платформе, выглядят ужасно на большинстве других платформ или разрешений экрана и которые очень трудно обновлять и поддерживать. Вместо этого вы захотите изучить и изучить менеджеры макетов, а затем вложить JPanels, каждый из которых использует свой собственный менеджер макетов для создания приятных и сложных графических интерфейсов, которые хорошо смотрятся во всех ОС.

Также существует вторая скрытая опасность установки размера JTextArea - делайте это, и он не будет работать правильно в JScrollPane, обычном месте, где находится JTextAreas, так как он не может правильно расширяться при добавлении строк текста. Таким образом, это происходит вдвойне, так что вы никогда не должны устанавливать размер JTextArea.

Другие вопросы по тегам