Java - Невозможно переместить позицию JTextField - PullRequest
0 голосов
/ 13 мая 2018

Я пытаюсь создать новый JTextField в моем Jframe. Я хочу поиграть с позиционированием текстового поля. Я пытался использовать setBounds и setLocation, чтобы изменить положение текстового поля, но это вовсе не меняет расположение текстового поля.

Это мой код:

public class GUI_Tutorial extends JFrame {

    public static void main(String[] args) {

        GUI_Tutorial frame = new GUI_Tutorial();
        frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
        frame.setSize(1000, 800);
        frame.setVisible(true);
        frame.setTitle("Calculator");
        frame.setLayout(new FlowLayout());

    }

    public GUI_Tutorial() {
        //frame.setLayout(new FlowLayout());
        JTextField num1;
        num1 = new JTextField(10);
        add(num1);
        num1.setVisible(true);
        num1.setLocation(5, 5);     
    } 
}

Могу ли я знать, что я делаю не так?

Ответы [ 2 ]

0 голосов

Ваша проблема - один из менеджеров по расположению.Когда вы добавляете компонент в контейнер, менеджер макета будет указывать, куда будет направлен компонент.ContentPane JFrame (субконтейнер JFrame, который содержит его компоненты) по умолчанию использует BorderLayout, а элементы, добавленные в этот контейнер по умолчанию, заполнят центральную часть контейнера, заполнят его полностью, если ничего не добавлено к другимРасположение BorderLayout.

Возможные решения для размещения предметов:

  • Худшее предложение, используйте макет null.Вы бы сделали это, позвонив по номеру getContentPane().setLayout(null);.Но когда вы делаете это, вы, программист, на 100% ответственны за точное положение и размер всех добавляемых компонентов.Это приводит к тому, что сложно поддерживать GUI, который может даже не работать на других платформах - поэтому не делают это.
  • Используйте конструктор GUI, чтобы помочь построить вашу программу: это имеет определенные преимуществаодна из них заключается в том, что это избавляет вас от необходимости непосредственно понимать диспетчеры компоновки, но это также является недостатком, поскольку, как только вы сталкиваетесь с крайними случаями (и вы обычно будете и быстро )это знание необходимо.Мое собственное мнение состоит в том, чтобы сначала избегать его использования, чтобы лучше понимать менеджеров компоновки, а затем, как только вы ознакомитесь с менеджерами, обязательно используйте его по мере необходимости.
  • Лучше учиться и экспериментировать сМенеджеры по расположению и границам, играющие с размещением компонентов.Помните, что вы можете вкладывать контейнеры (обычно JPanels), и каждому из них может быть назначен собственный менеджер макета, позволяющий создавать сложные графические интерфейсы, которые легко создаются и обслуживаются.

Обратите внимание, что

  • (снова) JFrames (на самом деле их contentPanes), JDialogs и другие окна верхнего уровня по умолчанию используют BorderLayout, что JPanels использует FlowLayout по умолчанию, что JScrollPanes использует свой собственный специализированный макет, который вы, вероятно, никогда не захотите отбрасыватьи что большинство других компонентов / контейнеров, таких как JComponent, JLabel, ... по умолчанию имеют нулевые макеты.
  • Наилучшим ресурсом является учебное пособие: Урок: Размещение компонентов в контейнере
  • Границы также могут быть полезны здесь, особенно в EmptyBorder, который позволяет вам поместить пустую буферную зону вокруг ваших компонентов.
  • Начните играть с более простыми менеджерами компоновки, FlowLayout, BorderLayout, GridLayout,затем BoxLayout, прежде чем перейти к более сложному
0 голосов
/ 13 мая 2018

Попробуйте удалить frame.setLayout(new FlowLayout());.Затем вам нужно будет использовать num1.setBounds(x, y, width, height) вместо setLocation()

Но, как отмечали другие пользователи, вам следует использовать менеджер макета.Прочтите различные макеты и выберите лучший для вашего GUI.

...