少しGUIを作ろうとしています。 3つのチェックボックスとボタンがあります。 (下の写真)私は頭のイメージを持っています。他のイメージを上に置いて欲しいです。この方法で私はそれらを選択し、ボタンを押すと変更されます。現在、私のハンドラにはImageIconが1つしかありません。 コードをそのまま実行すると、「coolBrows.png」画像が表示されません。 JFrameにJFrameを追加する例をいくつか見てきましたが、JFrameを動作させるためにレイアウトを追加する必要があると言いました。私はそれをやったことがまだ表示されません...任意の助けに感謝! 注:各イメージの寸法は同じですが、オーバーレイされるイメージの背景は透明です。JPaneにJLabelを追加したり削除したりするにはどうすればよいですか?
申し訳ありませんが、慣習に違反した場合は、これまでに投稿したことはありません。
GUI
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
}
}
}
}
さて、コンポーネントをコンテナに追加する方法はわかっているので、それらを削除することはほぼ同じプロセスですが、 'remove'を呼び出すことです。画面上で実現されるコンテナでこれを行うときは、 'revalidate'を呼び出す必要があります。また、レイアウトとペイントパスを生成するためにコンテナに' repaint'を呼び出すよりも頻繁に呼び出す必要があります。あなたのケースでは、既存の 'JLabel'を新しいイメージ(setIcon')で更新するだけでよいのかどうか疑問です。 – MadProgrammer
ありがとうございます。私はsetIcon()を使ってくれてありがとうございました。 –