我有一个jframe,上面有一个jpanel,这个panel经常需要用repaint()和revalidate()更改它的内容。我已经设法将图像、文本和按钮按我希望的方式放置在这个JPanel上。一切都在工作,但现在我试图为jframe设置一个背景,这不会干扰上面的内容。例如,如果有一个树的绘图,它应该出现在jpanel的文本后面,而不会破坏它。我发现semi的工作原理是在jframe上使用setContentPane(),添加一个类,它扩展了jpanel并覆盖了paintComponent()。所有内容都出现在屏幕上,但文本被垂直压扁,元素被移到框架的顶部。
如果我不使用setContentPane()而是将background类添加到框架中,那么无论JPanel的setOpaque()如何,它都不会出现。我还尝试使用jLayeredPane,因为我在internet上读到的东西表明这是正确的答案。然而,我无法让它工作,背景仍然隐藏。
private final int WIDTH = 1024;
private final int HEIGHT = 768;
Frame()
{
JFrame frame = new JFrame();
panel = new JPanel();
gbc = new GridBagConstraints();
//Unrelated elements
//font = new Font(Font.MONOSPACED, Font.PLAIN, 20);
//border = BorderFactory.createEmptyBorder();
//imageResizer = new ImageResizer();
frame.setTitle("Shady Path");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(WIDTH, HEIGHT);
frame.setLocationRelativeTo(null);
frame.setResizable(false);
frame.setIconImage(new ImageIcon("res/human.png").getImage());
frame.setContentPane(new DrawPanel());
panel.setLayout(new GridBagLayout());
panel.setOpaque(false);
gbc.anchor = GridBagConstraints.PAGE_START;
frame.add(panel);
frame.setVisible(true);
}
//One of the two methods that change the contents of the jpanel
void appendMain(String mainImage, JTextArea mainText, JButton button)
{
panel.removeAll();
image = new JLabel(imageResizer.resize(200, 200, mainImage));
gbc.insets = new Insets(0, 0, 30, 0);
gbc.gridwidth = GridBagConstraints.REMAINDER;
panel.add(image, gbc);
formatText(mainText);
panel.add(mainText, gbc);
button.setFont(font);
button.setForeground(Color.WHITE);
button.setBackground(Color.BLACK);
button.setBorder(border);
gbc.fill = GridBagConstraints.VERTICAL;
gbc.insets = new Insets(50, 0, 70, 0);
panel.add(button, gbc);
panel.revalidate();
panel.repaint();
}
//This is for the text formating
private void formatText(JTextArea baseText)
{
baseText.setEditable(false);
baseText.setForeground(Color.WHITE);
baseText.setFont(font);
baseText.setLineWrap(true);
baseText.setWrapStyleWord(true);
baseText.setMargin(new Insets(0, 300, 0, 300));
baseText.setOpaque(false);
gbc.insets = new Insets(30, 0, 0, 0);
gbc.weightx = 1;
gbc.fill = GridBagConstraints.HORIZONTAL;
}
//The following code is for the paintComponent() class
//The imageResizer is another class that I made, but it just resizes images and it is unrelated.
public class DrawPanel extends JPanel
{
private Image image;
public DrawPanel()
{
ImageResizer imageResizer = new ImageResizer();
ImageIcon imageIcon = imageResizer.resize(1024, 768, "res/test.png");
image = imageIcon.getImage();
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(image, 0, 0, this);
}
}
嗯...看起来@hovercraftfullofeels的评论是对的。实际上,我只需要将DrawPanel的布局设置为BorderLayout,一切都修复了。
public DrawPanel()
{
this.setLayout(new BorderLayout());
ImageResizer imageResizer = new ImageResizer();
ImageIcon imageIcon = imageResizer.resize(1024, 768, "res/test.png");
image = imageIcon.getImage();
}
问题内容: 我正在创建一个GUI,尽管很简单,但我想让背景图像(2048 X 2048)填满整个窗口,并在左上角放置一个正方形,可以偶尔加载64 X 64图像。在此先感谢提供帮助的任何人:)编辑:我已经知道如何使JFrame设置大小,其图像加载需要帮助。 问题答案: 这是一个在JFrame中添加背景图像的简单示例: 点击这里了解更多信息
我试图在JFrame中更改JPanel的背景。JFrame由JPanels组成,很像一个网格。我试图改变JFrame中的一个随机JPanel,并查看循环中每一次的颜色变化。 如果取消对panel.add(individualPanel)行的注释,这将显示颜色变化,但它会不断向JFrame添加越来越多的JPanels。但是,注释这一行可以让我更改颜色,但不会显示JFrame中的任何更改。我试着修改了
问题内容: 如何设置JFrame的背景颜色? 问题答案: 检索框架的内容窗格,并使用从继承的方法更改颜色。 例:
我试图做的是防止用户在我的输入中输入空字符串。现在,用户只能输入数字。然而,没有什么能阻止他们将文本字段留空。我想限制他们在程序空白时按我的按钮启动程序。 现在,我的文本字段最初是空白的,按钮最初是灰色的。但当我输入一些东西时,按钮保持灰色。请记住,所有这些代码都在构造函数中。
我刚开始尝试创建java接口,我想创建一个作为大学项目的一部分。 就像我说的,我是一个新手,所以我知道它可能非常简单,或者我没有把它搞砸,但如果有人能帮助它,它将会非常接近。
问题内容: 如果选择了该面板(单击该面板),则该面板的颜色为蓝色。另外,我在该面板上添加了一个小标志(图像),它表示所选面板之前已被选中。 因此,如果用户看到例如10个面板,其中有4个带有这个小标记,则他知道自己之前已经单击了这些面板。到目前为止,这项工作还不错。现在的问题是我无法显示小标志并使面板同时变为蓝色。 我使用css将面板设置为蓝色,使用设置背景图像。但是背景色似乎在图像上方,因此您看不