Изменение цвета и размеров JPanel не работает - PullRequest
0 голосов
/ 26 сентября 2019

Я создал JPanel, который содержит 9 экземпляров класса ItemTest в сетке.

Класс ItemTest содержит свой собственный JPanel, флажок и некоторый текст.Он используется для представления различных предметов, которые можно приобрести.Я хотел бы иметь возможность изменять размер и цвет компонентов JPanel, принадлежащих к классу ItemTest.

Методы setSize и setForeground здесь не работают.this.setSize(100,100) и this.setForeground(new java.awt.Color(80,80,90)) не влияют на JPanel.

import javax.swing.JPanel;
import java.awt.GraphicsConfiguration;
import java.awt.GridLayout;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JLabel;

public class ItemTest extends JPanel{

    static JPanel secondPanel = new JPanel();

    private static final long serialVersionUID = 8013287075740780359L;

    static JCheckBox selectBox;

    static GraphicsConfiguration gc;

    static JFrame frame = new JFrame(gc);

    ItemTest(String name, double cost){

        JLabel nameLabel = new JLabel();
        this.add(nameLabel);
        nameLabel.setText(name);

        selectBox = new JCheckBox("$"+cost);

        this.setForeground(new java.awt.Color(80, 80, 90));
        this.setSize(100, 100);
        this.add(selectBox);
    }

    public static void main(String[] args) {

        frame.setVisible(true);
        frame.setTitle("Program");
        frame.setSize(1000,800);
        frame.setResizable(false);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLayout(null);
        frame.setLocationRelativeTo(null);
        frame.getContentPane().setBackground(new java.awt.Color(100,100,110));

        secondPanel.setBounds(345,40,640,700);
        secondPanel.setBackground(new java.awt.Color(90,90,100));
        secondPanel.setLayout(new GridLayout(3,3,50,50));
        secondPanel.setVisible(true);
        secondPanel.getComponents();
        frame.add(secondPanel);

        for (int i = 0; i < 9; i ++) {
            secondPanel.add(new ItemTest("T-Shirt",50));
            System.out.println("test");
        }
    }
}

РЕДАКТИРОВАТЬ:

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

import javax.swing.JPanel;

import java.awt.Color;
import java.awt.GraphicsConfiguration;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JLabel;

public class ItemTest extends JPanel{

    private static final long serialVersionUID = 8013287075740780359L;

    static GraphicsConfiguration gc;
    static JFrame frame = new JFrame(gc);

    ItemTest(String name, double cost){

        JLabel nameLabel = new JLabel();
        this.add(nameLabel);
        nameLabel.setText(name);


        JCheckBox selectBox = new JCheckBox("$"+cost);
        this.add(selectBox);

        //Changes colour of the text, but I want that to remain black.  I'm looking to change the colour of the actuall JPanel.
        selectBox.setForeground(Color.red);
        nameLabel.setForeground(Color.red);
    }

    public static void main(String[] args) {

        frame.setTitle("Program");
        frame.setSize(1000,800);
        frame.setResizable(false);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLayout( new GridBagLayout() );
        frame.setLocationRelativeTo(null);
        frame.getContentPane().setBackground(new java.awt.Color(100,100,110));
        frame.setVisible(true);

        JPanel secondPanel = new  JPanel();
        //secondPanel.setBounds(345,40,640,700);
        secondPanel.setBackground(new java.awt.Color(90,90,100));
        secondPanel.setLayout(new GridLayout(3,3,50,50));
        secondPanel.setVisible(true);
        secondPanel.getComponents();
        frame.add(secondPanel);

        for (int i = 0; i < 9; i ++) {
            secondPanel.add(new ItemTest("T-Shirt",50));
        }
    }
}

Изменение метода setBounds сняло мой предпочтительный размер JPanel, поэтому теперь все элементы находятся в центре окна, вместо моего предыдущего дизайна, где они содержались в jpanel offв сторону.

Использование

selectBox.setForeground(Color.red);
nameLabel.setForeground(Color.red);

Устанавливает цвет текста на красный.Я хотел бы изменить цвет фона JPanel и оставить цвет текста черным.

Я бы хотел, чтобы элементы располагались на панели сбоку, как в моем исходном коде с размерами, скажем, 50x50..

1 Ответ

4 голосов
/ 26 сентября 2019
static JCheckBox selectBox; 

Не используйте статические переменные. Компоненты Swing должны быть экземплярами переменных, определенными в вашем классе ItemTest.

this.setForeground(new java.awt.Color(80, 80, 90));

Установка переднего плана на JPanel ничего не делает, потому что в JPanel нет настраиваемого рисования,

Вам потребуется установить передний план на JLabel и JCheckbox.

this.setSize(100, 100);

Не использовать setSize (...).Как вы заметили, это будет проигнорировано.

Swing был разработан для использования с менеджерами компоновки.Макет по умолчанию для JPanel - FlowLayout.JLabel и JCheckBox будут отображаться в их предпочтительном размере.

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

frame.setLayout(null);
secondPanel.setBounds(345,40,640,700);

Не используйте пустой макет и setBounds (...).

Вместо этого используйте что-то вроде:

frame.setLayout( new GridBagLayout() );

Размер панели будет автоматически определяться компонентами, которые вы добавляете на панель.

Правки:

Я хочу изменить цвет всей панели JPanel

Затем измените фон панели, используя setBackground(...), а не setForeground (...).

, так что теперь все элементы находятся в центре окна, вместо моего предыдущего дизайна, где они содержались в jpanel в стороне.

Да, это поведение по умолчанию для GridBagLayout.Если вам это не нравится, вы можете использовать другой менеджер раскладки на кадре.Прочтите руководство по Менеджерам по раскладке .Самым простым может быть FlowLayout.Вы можете указать выравнивание по левому краю.

с размерами, скажем, 50x50.

Не используйте случайные числа.Вы понятия не имеете, может ли текст метки и флажок отображаться в 50 пикселях.Я уже говорил вам, как сделать размер панели больше.Прочитайте учебник по границам !!!

static GraphicsConfiguration gc;
static JFrame frame = new JFrame(gc);

Вы все еще используете статические переменные.Избавляться от них они не нужны.

frame.setVisible(true);  

Это должно быть последнее утверждение ПОСЛЕ того, как все компоненты были добавлены в фрейм.На самом деле код должен быть:

frame.pack();
frame.setVisible( true );

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

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

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