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



我创建了一个 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。

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() );

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

编辑:

我想改变精算师的颜色

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

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

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

尺寸为 50x50。

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

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

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

frame.setVisible(true);  

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

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

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

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

最新更新