更改JPanel的颜色和尺寸不起作用

时间:2019-09-26 14:25:01

标签: java swing jframe

我创建了一个JPanel,它包含9个ItemTest类实例(以网格形式)。

ItemTest类包含其自己的JPanel,一个复选框和一些文本。它用来代表可以购买的不同物品。我希望能够更改属于ItemTest类的JPanel组件的大小和颜色。

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中。

使用

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

将文本颜色设置为红色。我想更改JPanel的背景颜色,并保持文本颜色为黑色。

我希望将这些物品像我原始代码中那样放置在面板上的侧面,尺寸为50x50。

1 个答案:

答案 0 :(得分:4)

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。阅读有关How to Use Borders的Swing教程中的部分,以获取更多信息和工作示例。

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

不要使用null布局和setBounds(...)。

请改为使用以下内容:

frame.setLayout( new GridBagLayout() );

面板的大小将由添加到面板中的组件自动确定。

编辑:

  

我想更改实际的JPanel的颜色

然后您使用setBackground(...)而不是setForeground(...)更改面板的背景。

  

,所以现在所有项目都位于窗口的中央,而不是我以前的设计中将它们包含在侧面的jpanel中。

是的,这是GridBagLayout的默认行为。如果您不喜欢这样,则可以在框架上使用其他布局管理器。阅读Layout Managers上的教程。最简单的可能是FlowLayout。您可以指定要左对齐的对齐方式。

  

尺寸为50x50。

请勿使用随机数。您不知道标签和复选框的文本是否可以50像素显示。我已经告诉过您如何增大面板尺寸。阅读有关边界的教程!!!

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

您仍在使用静态变量。摆脱它们是不必要的。

frame.setVisible(true);  

这应该是在将所有组件添加到框架之后的最后一条语句。实际上,代码应为:

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

然后所有组件将以其首选大小很好地显示。

阅读本教程,本教程的每个部分都有可以下载并使用的工作示例。本教程将向您展示如何更好地构建代码。