Java 如何向JPane添加和删除JLabel?
我想做一个小GUI。它有三个复选框和一个按钮。下面的图片我有一个头部的图像,我想把其他图像放在上面。这样,当我选择它们并按下按钮时,它们会改变。目前在我的处理程序中,我只有一个ImageIcon。 当我按原样运行代码时,coolBrows.png图像不会显示。我在这里看到了一些将JFrame添加到JFrame的示例,他们说我需要添加一个布局才能让它工作。我已经这样做了,但它仍然不会出现。。。感谢您的帮助! 注意:每个图像都有相同的尺寸,但是要叠加的图像有一个透明的背景 对不起,如果我打破了以前从未在这里发布过的惯例 GUIJava 如何向JPane添加和删除JLabel?,java,swing,user-interface,Java,Swing,User Interface,我想做一个小GUI。它有三个复选框和一个按钮。下面的图片我有一个头部的图像,我想把其他图像放在上面。这样,当我选择它们并按下按钮时,它们会改变。目前在我的处理程序中,我只有一个ImageIcon。 当我按原样运行代码时,coolBrows.png图像不会显示。我在这里看到了一些将JFrame添加到JFrame的示例,他们说我需要添加一个布局才能让它工作。我已经这样做了,但它仍然不会出现。。。感谢您的帮助! 注意:每个图像都有相同的尺寸,但是要叠加的图像有一个透明的背景 对不起,如果我打破了以前从
因此,您似乎需要对图标或jlabel进行分层 因此,您可以使用: 用于将标签分层的JLayeredPane。因此,为每个面部特征创建一个层,并向该层添加标签。然后,您可以根据复选框的值从标签中添加/删除图标。有关更多信息和工作示例,请阅读上Swing教程的部分 使用图层将图标分层。这允许您将图标堆叠在另一个图标之上,然后在单个JLabel上显示生成的图标。因此,每次通过单击复选框生成事件时,您都可以使用选定的功能重建CompoundIcon,并重置JLabel上的图标
好的,那么您显然知道如何将组件添加到容器中,删除它们几乎是相同的过程,但是调用remove。在屏幕上显示的容器上执行此操作时,您需要调用revalidate,并且通常需要在容器上重新绘制以生成布局和绘制过程。在您的情况下,我想知道您是否应该用新图像ie setIconThank更新先前存在的JLabel。我使用了setIcon,效果非常好。谢谢您的反馈。我查看了一下JLayeredPane,它似乎是为实现我所尝试的功能而构建的。我将重写这篇文章,使用图层进行练习。
package AssignmentFace;
import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
public class AssignmentFace extends JFrame {
private JPanel contentPane;
private ImageIcon head;
private JCheckBox checkBoxBrows;
private static ImageIcon brows;
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
AssignmentFace frame = new AssignmentFace();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* Create the frame.
*/
public AssignmentFace() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 450, 300);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
contentPane.setLayout(new BorderLayout(1,2));
setContentPane(contentPane);
JPanel selectionPanel = new JPanel();
selectionPanel.setLayout(new GridLayout(7,1));
contentPane.add(selectionPanel, BorderLayout.WEST);
// Contains the checkboxes
checkBoxBrows= new JCheckBox("brows");
selectionPanel.add(checkBoxBrows);
JCheckBox checkBoxNose = new JCheckBox("Nose");
selectionPanel.add(checkBoxNose);
JCheckBox checkBoxMouth = new JCheckBox("Mouth");
selectionPanel.add(checkBoxMouth);
Handler handler = new Handler();
JButton btnCycle = new JButton("Cycle ...");
btnCycle.addActionListener(handler);
selectionPanel.add(btnCycle);
JPanel facePanel = new JPanel();
facePanel.setOpaque(true);
contentPane.add(facePanel, BorderLayout.CENTER);
// Head
head = new ImageIcon(getClass().getResource("/images/head.png"));
JLabel headLabel = new JLabel(head, JLabel.CENTER);
headLabel.setLayout(new BorderLayout());
facePanel.add( headLabel, BorderLayout.CENTER );
// Brows
brows = new ImageIcon();
JLabel browsLabel = new JLabel(brows, JLabel.CENTER);
headLabel.add(browsLabel, BorderLayout.CENTER);
// Nose
//ImageIcon nose = new ImageIcon();
//JLabel noseLabel = new JLabel(nose, JLabel.CENTER);
//facePanel.add(noseLabel, BorderLayout.CENTER);
// Mouth
//ImageIcon mouth = new ImageIcon();
//JLabel mouthLabel = new JLabel(nose, JLabel.CENTER);
//facePanel.add(mouthLabel, BorderLayout.CENTER);
}
public class Handler implements ActionListener
{
@Override
public void actionPerformed(ActionEvent e)
{
if(checkBoxBrows.isSelected())
{
brows = new ImageIcon(getClass().getResource("/images/coolBrows.png"));
System.out.println("here"); //For testing purposes. This does come through in the console
}
}
}
}