2016-10-21 16 views
0

私は10個のjcheckboxを持っていますが、5つだけを選択してください。私はすでにこのすべてのコーディングを行ったが、私はどのようにjlabelに選択した5を表示するのか分からない。私はこのコードでそれをやってみました:jcheckboxをjlabelに表示

  JCheckBox check; 
      JPanel panel=new JPanel(); 
      for(int i=0; i<10; i++){ 
       check=new JCheckBox(); 
       check.addActionListener(listener); 
       check.setName("Select"+i); 

       panel.add(check); 
      } 

これはlistener

ActionListener listener = new ActionListener() { 
     @Override 
     public void actionPerformed(ActionEvent e) { 
      check = (JCheckBox) e.getSource(); 
      name=check.getName(); 
     } 
    }; 

であり、これはそれがJLabelの

 panel2=new JPanel(new GridLayout(5,1)); 
     for(int i=0; i<5; i++){ 
      txtVote=new JLabel(name); 
      panel2.add(txtVote); 
     } 

が、このコードを使用してに表示されるべきパネルで、 jlabelには何も表示されません。私はこのにlistenerを変更した場合:

ActionListener listener = new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       check = (JCheckBox) e.getSource(); 
       txtVote.setText(check.getName()); 
      } 
     }; 

それだけで最後のラベルに表示されます。他のラベルは空白になります。助けてください、ここでEDIT

public class JCheckBoxtoLabel{ 
    JCheckBox check; 
    String name; 
    JLabel txtVote; 

    public JCheckBoxtoLabel() { 
      JFrame frame = new JFrame(); 
      JPanel panel = createPanel(); 
      JPanel panel2 = panel2(); 

      frame.setLayout(new GridLayout(1,2)); 
      frame.add(panel); frame.add(panel2); 
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      frame.setSize(500, 300); 
      frame.setLocationRelativeTo(null); 
      frame.setVisible(true); 
     } 

     private JPanel createPanel() { 
       JPanel panel=new JPanel(new GridLayout(10,1)); 
       for(int i=0; i<10; i++){ 
        check=new JCheckBox(); 
        check.addActionListener(listener); 
        check.setName("Select"+i); 

        panel.add(check); 
       } 

      return panel; 
     } 

     private JPanel panel2(){ 
      JPanel panel2=new JPanel(new GridLayout(5,1)); 
      for(int i=0; i<5; i++){ 
       txtVote=new JLabel(); 
       txtVote.setBorder(BorderFactory.createLineBorder(Color.RED)); 
       panel2.add(txtVote); 
      } 
     return panel2; 
    } 

     ActionListener listener = new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       check = (JCheckBox) e.getSource(); 
       txtVote.setText(check.getName()); 
      } 
     }; 

     public static void main(String[] args) { 
      SwingUtilities.invokeLater(new Runnable() { 
       public void run() { 
        new JCheckBoxtoLabel(); 
       } 
      }); 
     } 
} 
+1

コードスニペットが役立ちますが、この状況ではコードがどのように結びついているかは実際には重要なことです。したがって、実際にはさらに[mcve]をしたいと考えています。これは、コンパイル、実行、および私たちの問題を表示する、ここに(リンクではなく)投稿された小さなプログラムです(フルプログラムではありません)。詳しくは、[mcve]リンクをご覧ください。 –

+0

こんにちは?再度、[MCVE](http://stackoverflow.com/help/mcve)コードを検討してください。また、5つのJLabelではなく、JListに名前を表示することもできます。 –

+0

@HovercraftFullOfEelsああ私はすでにそれを編集しています。D – luh

答えて

0

問題はtxtVoteは単一のJLabelであり、あなたはすべてのためにそれを使用しようとしているということである実行可能なコードですどうもありがとう5. 5枚目のアルバムが最後に作成されたので、それが使用されています。私の提案は、あなたがarraylistフィールドを作成し、パネル12の各ラベルをarraylistに追加することです。リスナーの内部では、テキストが設定されている場合はarraylistのチェック内の各jlabelを繰り返し、テキストがない場合は次のテキストをチェックしてテキストを設定します。これで問題になるのは、コード内でボックスのチェックを外すと何が起きるのかを決して定義していないことです。

import java.awt.Color; 
import java.awt.GridLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.util.ArrayList; 

import javax.swing.BorderFactory; 
import javax.swing.JCheckBox; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 

public class JCheckBoxtoLabel{ 
JCheckBox check; 
String name; 
JLabel txtVote; 
ArrayList<JLabel> boxLabels; 

public JCheckBoxtoLabel() { 
    boxLabels = new ArrayList<JLabel>(); 

    JFrame frame = new JFrame(); 
    JPanel panel = createPanel(); 
    JPanel panel2 = panel2(); 

    frame.setLayout(new GridLayout(1,2)); 
    frame.add(panel); frame.add(panel2); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setSize(500, 300); 
    frame.setLocationRelativeTo(null); 
    frame.setVisible(true); 
} 

private JPanel createPanel() { 
    JPanel panel=new JPanel(new GridLayout(10,1)); 
    for(int i=0; i<10; i++){ 
     check=new JCheckBox(); 
     check.addActionListener(listener); 
     check.setName("Select"+i); 

     panel.add(check); 
    } 

    return panel; 
} 

private JPanel panel2(){ 
    JPanel panel2=new JPanel(new GridLayout(5,1)); 
    for(int i=0; i<5; i++){ 
     txtVote=new JLabel(); 
     txtVote.setBorder(BorderFactory.createLineBorder(Color.RED)); 
     panel2.add(txtVote); 
     boxLabels.add(txtVote); 
    } 
    return panel2; 
} 

ActionListener listener = new ActionListener() { 
    @Override 
    public void actionPerformed(ActionEvent e) { 
     check = (JCheckBox) e.getSource(); 
     if(!check.isSelected()){ 
      for(JLabel label: boxLabels){ 
       if(label.getText().equals(check.getName())) label.setText(""); 
      } 
     }else{ 
      for(JLabel label: boxLabels){ 
       if(label.getText().isEmpty()){ 
        label.setText(check.getName()); 
        return; 
       } 
      } 
     } 
    } 
}; 

public static void main(String[] args) { 
    SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      new JCheckBoxtoLabel(); 
     } 
    }); 
} 
} 
+0

いくつかのコードが必要な場合は、あなたのためにいくつかを生成することができます。 –

+0

ああ、どうもありがとう! :) – luh

+0

そこに行く、あなたの問題に働く解決策を加えた、それは選択された5つのラベルを表示しますが、あなたが選択した最初の5つだけ、あなたもそれらの選択を解除することができます。 –

0

変数JLabel txtVoteは、配列ではなく1つのJLabelオブジェクトです。

panel2()関数では、5つの新しいJLabelをtxtVoteに割り当てます。 5行を連続して割り当てるので、毎回オーバーライドされるので、最後のJLabelのみが含まれます。

private JPanel panel2(){ 
     JPanel panel2=new JPanel(new GridLayout(5,1)); 
     for(int i=0; i<5; i++){ 
      txtVote=new JLabel(); 
      txtVote.setBorder(BorderFactory.createLineBorder(Color.RED)); 
      panel2.add(txtVote); 
     } 
     return panel2; 
} 

アクションリスナーでvoteTxtのgetTextを呼び出すと、最後のラベルのテキストのみが表示されます。

これを修正するには、txtにJLabelの配列を作成し、アクションリスナーでJLabelsで2回目の繰り返しを行い、それぞれに対してget textを呼び出します。

ActionListener listener = new ActionListener() { 
    @Override 
    public void actionPerformed(ActionEvent e) { 
     check = (JCheckBox) e.getSource(); 
     for (int i = 0; i < txtVotes.length; i++) { 
      txtVotes[i].getText(check.getName()); 
     } 
    } 
}; 

私はあなたが実現するかどうかを知りまたはしたいのですが、あなたは、これはあなたがチェックどこかの名前と反復の配列を格納する必要がありますしたくない場合は、各ラベルは、同じ値に設定されていませんこれらを通しても。

+0

これは、各Jlabelsで5つの選択されたチェックボックスを設定したいという問題です。 –

1

あなたがやっていることを変更し、JLabelsではなくJListにテキストを表示することを検討してください。これにより、情報を統合するのに役立ちます。また、JCheckBoxやJRadioButtons、ItemListenerに、現在選択されている最も古いものを選択解除して5つのボタンだけを選択できるようにすることもできます。例:

import java.awt.GridLayout; 
import java.awt.event.ItemEvent; 
import java.awt.event.ItemListener; 
import java.util.ArrayList; 
import java.util.List; 
import javax.swing.*; 

@SuppressWarnings("serial") 
public class FiveNames extends JPanel { 
    private static final String[] ALL_NAMES = {"Bob", "Bill", "Frank", "Helen", 
      "Erica", "Mickey", "Donald", "Hillary", "Michael", "Peter", "Roger"}; 
    private static final int ALLOWED_SELECTIONS_COUNT = 5; 
    private DefaultListModel<String> displayListModel = new DefaultListModel<>(); 
    private JList<String> list = new JList<>(displayListModel); 

    public FiveNames() { 
     JPanel namePanel = new JPanel(new GridLayout(0, 1, 0, 5)); 
     RButtonItemListener rButtonListener = new RButtonItemListener(); 
     for (String name : ALL_NAMES) { 
      JRadioButton rButton = new JRadioButton(name); 
      rButton.setActionCommand(name); 
      rButton.addItemListener(rButtonListener); 
      namePanel.add(rButton); 
     } 

     list.setVisibleRowCount(ALLOWED_SELECTIONS_COUNT); 
     list.setPrototypeCellValue("       "); 
     list.setBackground(null); 

     setLayout(new GridLayout(1, 0)); 
     add(namePanel); 
     add(list); 
    } 

    // listener to only allow the last 5 radiobuttons to be selected 
    private class RButtonItemListener implements ItemListener { 
     private List<ButtonModel> buttonModelList = new ArrayList<>(); 

     @Override 
     public void itemStateChanged(ItemEvent e) { 
      JRadioButton rBtn = (JRadioButton) e.getSource(); 
      ButtonModel model = rBtn.getModel(); 
      if (e.getStateChange() == ItemEvent.SELECTED) { 
       buttonModelList.add(model); 
       if (buttonModelList.size() > ALLOWED_SELECTIONS_COUNT) { 
        for (int i = 0; i < buttonModelList.size() - ALLOWED_SELECTIONS_COUNT; i++) { 
         ButtonModel removedModel = buttonModelList.remove(0); 
         removedModel.setSelected(false); 
        } 
       } 
      } else { 
       buttonModelList.remove(model); 
      } 
      displayListModel.clear(); 
      for (ButtonModel buttonModel : buttonModelList) { 
       displayListModel.addElement(buttonModel.getActionCommand()); 
      } 
     } 

    } 

    private static void createAndShowGui() { 
     JFrame frame = new JFrame("FiveNames"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().add(new FiveNames()); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(() -> createAndShowGui()); 
    } 
} 
関連する問題