JPanel с полосой прокрутки установить содержание не изменяемого размера - PullRequest
0 голосов
/ 04 апреля 2019

Моя цель - отображать сообщения, полученные с помощью UDP-сервера, в ящике.Для этого я создал JScrollBar, в который я добавил JPanel.Когда я получаю сообщение, создается объект ReceivedCommand, который расширяет JTextArea и добавляет его в JPanel.Моя проблема здесь в том, что когда в JPanel отображается слишком много сообщений, он автоматически изменяет размеры моих TextAreas.Как я могу установить TextAreas не изменяемого размера, чтобы сообщения добавлялись, даже если они не были видны в Panel, а затем наконец сделали полосу прокрутки полезной.

Вот мой тестовый код для иллюстрации:

package test;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridBagLayout;
import java.awt.GridLayout;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.ScrollPaneConstants;
import javax.swing.border.LineBorder;

public class test {

    public static void main(String args[]){
        JFrame frame  = new JFrame();

        JPanel RXCommand = new JPanel();
        RXCommand.setPreferredSize(new Dimension(500, 250));
        RXCommand.setBorder(new LineBorder(Color.black));
        RXCommand.setLayout(new GridLayout(0,1));

        JScrollPane scrollPane = new JScrollPane(RXCommand, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
        scrollPane.setPreferredSize(new Dimension(500, 250));

        RXCommand.add(new ReceivedCommand("11:02:56", "5", "5", "command exemple", "command exemple"));
        RXCommand.add(new ReceivedCommand("11:02:56", "5", "5", "command exemple", "command exemple"));
        RXCommand.add(new ReceivedCommand("11:02:56", "5", "5", "command exemple", "command exemple"));
        RXCommand.add(new ReceivedCommand("11:02:56", "5", "5", "command exemple", "command exemple"));
        RXCommand.add(new ReceivedCommand("11:02:56", "5", "5", "command exemple", "command exemple"));
        RXCommand.add(new ReceivedCommand("11:02:56", "5", "5", "command exemple", "command exemple"));
        RXCommand.add(new ReceivedCommand("11:02:56", "5", "5", "command exemple", "command exemple"));
        RXCommand.add(new ReceivedCommand("11:02:56", "5", "5", "command exemple", "command exemple"));
        RXCommand.add(new ReceivedCommand("11:02:56", "5", "5", "command exemple", "command exemple"));
        RXCommand.add(new ReceivedCommand("11:02:56", "5", "5", "command exemple", "command exemple"));
        RXCommand.add(new ReceivedCommand("11:02:56", "5", "5", "command exemple", "command exemple"));
        RXCommand.add(new ReceivedCommand("11:02:56", "5", "5", "command exemple", "command exemple"));
        RXCommand.add(new ReceivedCommand("11:02:56", "5", "5", "command exemple", "command exemple"));
        RXCommand.add(new ReceivedCommand("11:02:56", "5", "5", "command exemple", "command exemple"));
        RXCommand.add(new ReceivedCommand("11:02:56", "5", "5", "command exemple", "command exemple"));

        frame.add(scrollPane);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
}

ReceivedCommand:

package test;

import java.awt.Color;
import java.awt.Dimension;

import javax.swing.JTextArea;
import javax.swing.border.CompoundBorder;
import javax.swing.border.EmptyBorder;
import javax.swing.border.LineBorder;

public class ReceivedCommand extends JTextArea {
    public ReceivedCommand(String time, String init, String now, String cmd1, String cmd2) {
        this.setPreferredSize(new Dimension(495, 50));
        this.setText("Reçu : " + time +" Canal initial : " + init + " Canal actuel : " + now + "\nCommande 1 :" + cmd1 + "\nCommande 2 : " + cmd2); 
        this.setBorder(new CompoundBorder(new EmptyBorder(5, 5, 5, 5), new LineBorder(Color.black)));   

    }
}

1 Ответ

1 голос
/ 04 апреля 2019
JPanel RXCommand = new JPanel();

Прежде всего, имена переменных НЕ должны начинаться с символа верхнего регистра. На форуме будут выделены имена классов, чтобы облегчить чтение кода. Заметьте, как форум считает, что ваша переменная называется именем класса? Изучите и соблюдайте соглашения об именах Java.

Как настроить TextAreas без изменения размера

RXCommand.setLayout(new GridLayout(0,1));

Не используйте GridLayout. GridLayout займет все доступное пространство. Таким образом, первый компонент занимает 100% пространства. Когда у вас есть два, каждый занимает 50%.

Вместо этого используйте BoxLayout или GridBagLayout.

Прочтите раздел из учебника по Swing на Менеджеры по раскладке для получения дополнительной информации и примеров для начала работы.

и затем, наконец, сделайте полосу прокрутки полезной

Уже ответил на комментарий Эндрю выше.

...