Как установить размер компонента в GridLayout и расширить JTextArea при вводе? - PullRequest
0 голосов
/ 27 октября 2019

Я создаю чат, но это не имеет значения. У меня пока нет проблем, все работает нормально, но я хочу изменить внешний вид пользовательского интерфейса, чтобы пользователь мог иметь большую JTextArea вместо кнопки, занимающей больше места, чем необходимо. Кроме того, я хотел бы изменить размер JTextArea, а не писать несколько текстов в одной строке. Наконец, я должен поблагодарить вас за то, что вы уделили мне время: D

Цели:

  • Установите размер JLabel или JTextArea, чтобы кнопкаостается меньше.

  • Разверните JLabel, когда текст достигнет правильного предела, и поместите его в новую строку (вроде WhatsApp).

Код:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import java.awt.GridLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JButton;
import javax.swing.JTextArea;
import javax.swing.BorderFactory;
import javax.swing.JLabel;
import javax.swing.JTextField;

class MyFirstChatSO extends JFrame {

  JLabel title;
  JTextArea messages;
  JTextField text;
  JButton send;

    public MyFirstChatSO () {
      setLayout(new BorderLayout(0,10));

        title = new JLabel("-Chat-");
          title.setHorizontalAlignment(JLabel.CENTER);
          title.setFont(new Font("Gabriola",Font.ITALIC,34));
        add(title, BorderLayout.NORTH);

        messages = new JTextArea();
          messages.setEnabled(false);
          messages.setBorder(BorderFactory.createLineBorder(new Color(168,168,168),2,true));
        add(messages, BorderLayout.CENTER);

        JPanel subPanel = new JPanel();
          subPanel.setLayout(new GridLayout(0,2));
            text = new JTextField();
          subPanel.add(text);
            send = new JButton("Send");
          subPanel.add(send);
        add(subPanel, BorderLayout.SOUTH);
    }

    public static void main(String[] args) {
        MyFirstChatSO chat = new MyFirstChatSO();
          chat.setSize(600,450);
          chat.setLocationRelativeTo(null);
          chat.setVisible(true);
          chat.setDefaultCloseOperation(EXIT_ON_CLOSE);
    }
}

Если любые другие методы, такие как использование разных макетов, являются решением, было бы полезно узнать об этом.

Еще один сбой, но на этот раз с GridBagLayout(Я не знаю, как его использовать, помогите мне, пожалуйста):

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JButton;
import javax.swing.JTextArea;
import javax.swing.BorderFactory;
import javax.swing.JLabel;
import javax.swing.JTextField;

class MyFirstChatSO extends JFrame {

  JLabel title;
  JTextArea messages;
  JTextField text;
  JButton send;

    public MyFirstChatSO () {
      setLayout(new BorderLayout(0,10));

        title = new JLabel("-Chat-");
          title.setHorizontalAlignment(JLabel.CENTER);
          title.setFont(new Font("Gabriola",Font.ITALIC,34));
        add(title, BorderLayout.NORTH);

        messages = new JTextArea();
          messages.setEnabled(false);
          messages.setBorder(BorderFactory.createLineBorder(new Color(168,168,168),2,true));
        add(messages, BorderLayout.CENTER);

    JPanel subPanel = new JPanel();
      subPanel.setLayout(new GridBagLayout());
      GridBagConstraints gb = new GridBagConstraints();
      gb.weightx = 1;
      gb.weighty = 1;
      gb.fill = GridBagConstraints.HORIZONTAL;
        text = new JTextField();
        gb.gridx = 0;
        gb.gridy = 0;
        gb.gridwidth = 6;
        gb.fill = GridBagConstraints.HORIZONTAL;
      subPanel.add(text,gb);
        send = new JButton("Send");
        gb.gridx = 7;
        gb.gridy = 0;
      subPanel.add(send,gb);
    add(subPanel, BorderLayout.SOUTH);
    }

    public static void main(String[] args) {
        MyFirstChatSO chat = new MyFirstChatSO();
          chat.setSize(600,450);
          chat.setLocationRelativeTo(null);
          chat.setVisible(true);
          chat.setDefaultCloseOperation(EXIT_ON_CLOSE);
    }
}

1 Ответ

0 голосов
/ 27 октября 2019

Еще один сбой, но на этот раз с GridBagLayout (я не знаю, как его использовать, помогите мне, пожалуйста):

Да, вам нужно понять, как это работает. Всегда иметь Как использовать GridBagLayout и доступные JavaDocs;)

Итак, я начал с ...

JPanel subPanel = new JPanel(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.weightx = 1;
gbc.weighty = 1;
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.insets = new Insets(4, 4, 4, 4);

text = new JTextArea(1, 80);
text.setBorder(new CompoundBorder(new LineBorder(Color.DARK_GRAY), new EmptyBorder(4, 4, 4, 4)));
subPanel.add(text, gbc);

gbc.insets = new Insets(0, 0, 0, 0);
gbc.weightx = 0;
gbc.weighty = 0;
gbc.fill = GridBagConstraints.HORIZONTAL;
send = new JButton("Send");
subPanel.add(send, gbc);

И в итоге я получил что-то вроде .. .

GridBagLayout

Но подождите секунду, в этом примере используется JTextArea ?! Почему!?

Ах, это потому, что я подлый, обманывающий штаны;)

Auto expanding magic

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

Чтобы исправить это, становится сложным, и я посмотрю наScrollable interface для некоторых идей

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...