2017-04-01 93 views
0

少しGUIを作ろうとしています。 3つのチェックボックスとボタンがあります。 (下の写真)私は頭のイメージを持っています。他のイメージを上に置いて欲しいです。この方法で私はそれらを選択し、ボタンを押すと変更されます。現在、私のハンドラにはImageIconが1つしかありません。 コードをそのまま実行すると、「coolBrows.png」画像が表示されません。 JFrameにJFrameを追加する例をいくつか見てきましたが、JFrameを動作させるためにレイアウトを追加する必要があると言いました。私はそれをやったことがまだ表示されません...任意の助けに感謝! 注:各イメージの寸法は同じですが、オーバーレイされるイメージの背景は透明です。JPaneにJLabelを追加したり削除したりするにはどうすればよいですか?

申し訳ありませんが、慣習に違反した場合は、これまでに投稿したことはありません。

GUI

enter image description here

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 
      } 
     } 
    } 
} 
+0

さて、コンポーネントをコンテナに追加する方法はわかっているので、それらを削除することはほぼ同じプロセスですが、 'remove'を呼び出すことです。画面上で実現されるコンテナでこれを行うときは、 'revalidate'を呼び出す必要があります。また、レイアウトとペイントパスを生成するためにコンテナに' repaint'を呼び出すよりも頻繁に呼び出す必要があります。あなたのケースでは、既存の 'JLabel'を新しいイメージ(setIcon')で更新するだけでよいのかどうか疑問です。 – MadProgrammer

+0

ありがとうございます。私はsetIcon()を使ってくれてありがとうございました。 –

答えて

1

あなたがIconsJLabelsをレイヤーする必要がありますようだから、そうです。

だから、多分あなたは使用することができます。

  1. JLayeredPaneをラベルを層に。したがって、各顔のフィーチャのレイヤを作成し、そのレイヤにラベルを追加します。次に、チェックボックスの値に基づいてラベルからアイコンを追加/削除することができます。詳しくは、How to Use Layered PanesのSwingチュートリアルのセクションを読んでください。

  2. Compound Iconを使用してアイコンをレイヤーします。これにより、アイコンを重ねて表示し、その結果のIconを1つのJLabelに表示することができます。したがって、チェックボックスをクリックしてイベントを生成するたびに、選択した機能でCompoundIconを再構築し、JLabelIconをリセットすることができます。

+0

フィードバックいただきありがとうございます。私はJLayeredPaneを調べましたが、それは私が試みていたことをするために構築されているようです。私はこれを書き直して、練習用のレイヤーで作業します。 –

関連する問題