Как мне установить размер JTextArea? - PullRequest
1 голос
/ 31 января 2020

Я довольно новичок в работе с графикой в ​​Java, и я пытался создать простую консоль для отображения текстовых игр в окне. У меня есть тестовый класс, в котором я работаю с консолью, но когда я добавляю JTextArea в окно консоли, он либо занимает все окно, либо не отображается вообще.

Вот мой код:

import javax.swing.*;
import java.awt.*;
import java.util.*;
import java.awt.Event;
public class GUI {
    public static void main(String[] args) {
        JFrame frame = new JFrame("AoA");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
        frame.setSize(1020,760);
        frame.setBackground(Color.LIGHT_GRAY);
        frame.setResizable(false);
        JTextArea jta = new JTextArea(100,100);
        jta.setEditable(false);
        jta.setBackground(Color.WHITE);
        frame.add(jta);

    }
}

Я знаю, что некоторые из моих импортов не используются в этом файле, но они будут использоваться в финальной игре. Я также знаю, что JTextArea имеет размер 100,100, и я не уверен, является ли он слишком большим или маленьким. Хотя я действительно мог бы помочь с этим.

Ответы [ 2 ]

3 голосов
/ 31 января 2020

Ваша проблема установлена ​​по умолчанию BorderLayout в вашем фрейме. Самый простой способ решить вашу проблему - установить другой менеджер макетов.

public static void main(String[] args) {
    SwingUtilities.invokeLater(GUI::startUp); 
}

private static void startUp() {
    JFrame frame = new JFrame("AoA");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(1020,760);
    frame.setBackground(Color.LIGHT_GRAY);
    frame.setResizable(false);
    frame.setLayout(new FlowLayout()); // FlowLayout is required
    JTextArea jta = new JTextArea(40,40);
    jta.setEditable(false);
    jta.setBackground(Color.WHITE);
    // JScrollPane to get the scroll bars when required
    frame.add(new JScrollPane(jta));
    // setVisible should be last operation to get a correct painting
    frame.setVisible(true);
}

Пожалуйста, обратите внимание на менеджеры макетов в Swing

2 голосов
/ 31 января 2020

Я полагаю, что ваша проблема частично вызвана менеджером по умолчанию в вашем JFrame. frame.setLayout(new FlowLayout()); - это быстрое решение, но вам придется поиграться с менеджером макета и провести некоторое исследование, если вы хотите получить результаты, которые вы ищете.

Далее вы можете использовать setPreferredSize() и убедитесь, что вы передаете объект Dimension. Хотя, в зависимости от контейнера или менеджера компоновки, этот может не всегда быть фактическим размером.

Наконец, всегда запускайте свинг GUI из EDT. Ниже приведен пример:

// FWIW I don't recommend getting in the habit of importing .*
import javax.swing.*;
import java.awt.*;
import java.util.*;
import java.awt.Event;

public class GUI{

    public static void main(String[] args) {
       javax.swing.SwingUtilities.invokeLater(new Runnable() {
           public void run() {
               new GUI();
           }
       });
    }

    public GUI() {
         JFrame frame = new JFrame("AoA");
         frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
         frame.setSize(1020,760);
         frame.setBackground(Color.LIGHT_GRAY);
         frame.setResizable(false);
         frame.setLayout(new FlowLayout());
         frame.setVisible(true);

         JTextArea jta = new JTextArea("test");
         jta.setPreferredSize(new Dimension(100, 100));
         jta.setEditable(false);
         jta.setBackground(Color.WHITE);
         frame.add(jta);
    }
}
...