2015-03-18 2 views
0

У меня есть JRadioButton с ActionListener, но не могу понять, как вызвать изменение значка для JButton на другой панели при нажатии. Код для обоих приведен ниже. При выборе правильного переключателя изображение должно переключаться с левой кнопки вправо.Изменение значка JButton на основе выбора JRadioButton

package gui; 

public class ExampleGUI extends JFrame { 

private static final long serialVersionUID = 1L; 
private JPanel contentPane; 
ImageIcon icon = new ImageIcon(ExampleGUI.class 
     .getResource("/gui/schlange1.gif")); 

/** 
* Launch the application. 
*/ 
public static void main(String[] args) { 
    EventQueue.invokeLater(new Runnable() { 
     public void run() { 
      try { 
       ExampleGUI frame = new ExampleGUI(); 
       frame.setVisible(true); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    }); 
} 

/** 
* Create the frame. 
*/ 
public ExampleGUI() { 
    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(0, 5)); 
    setContentPane(contentPane); 

    JLabel lblExampleGui = new JLabel("Example GUI"); 
    lblExampleGui.setFont(new Font("Tahoma", Font.PLAIN, 18)); 
    lblExampleGui.setHorizontalAlignment(SwingConstants.CENTER); 
    contentPane.add(lblExampleGui, BorderLayout.NORTH); 

    JPanel radioButtonPanel = new JPanel(); 
    contentPane.add(radioButtonPanel, BorderLayout.SOUTH); 

    JPanel imagePanelBoxes = mainImagePanel(); 
    contentPane.add(imagePanelBoxes, BorderLayout.CENTER); 

    JButton leftImage = leftClickImage(); 
    imagePanelBoxes.add(leftImage); 

    JButton rightImage = rightClickImage(); 
    imagePanelBoxes.add(rightImage); 

    JRadioButton leftRadioButton = leftRadioButton(); 
    radioButtonPanel.add(leftRadioButton); 

    JRadioButton rightRadioButton = rightRadioButton(); 
    radioButtonPanel.add(rightRadioButton); 

    ButtonGroup group = new ButtonGroup(); 
    group.add(leftRadioButton); 
    group.add(rightRadioButton); 
} 

private JPanel mainImagePanel() { 
    JPanel imagesPanel = new JPanel(); 
    imagesPanel.setBorder(new EmptyBorder(0, 5, 0, 5)); 
    imagesPanel.setLayout(new GridLayout(0, 2, 10, 0)); 
    return imagesPanel; 
} 

private JRadioButton leftRadioButton() { 
    final JRadioButton leftRadioButton = new JRadioButton("LEFT"); 
    leftRadioButton.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent e) { 
      changeIcon(leftClickImage(), icon); 
     } 
    }); 
    leftRadioButton.setSelected(true); 
    return leftRadioButton; 
} 

private JRadioButton rightRadioButton() { 
    final JRadioButton rightRadioButton = new JRadioButton("RIGHT"); 
    rightRadioButton.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent e) { 
      changeIcon(rightClickImage(), icon); 
     } 
    }); 
    rightRadioButton.isSelected(); 
    return rightRadioButton; 
} 

private JButton leftClickImage() { 
    JButton leftImage = new JButton(""); 
    leftImage.setIcon(new ImageIcon(ExampleGUI.class 
      .getResource("/gui/schlange1.gif"))); 
    leftImage.setBackground(Color.BLACK); 
    return leftImage; 
} 

private JButton rightClickImage() { 
    final JButton rightImage = new JButton(""); 
    rightImage.setBackground(Color.BLACK); 
    return rightImage; 
} 

public void changeIcon(JButton jb, ImageIcon icon) { 
    jb.setIcon(icon); 
} 

}

+0

У вас нет кнопки или радиообмена. у вас есть два метода, которые их возвращают. Вам нужны эти методы или вы хотите достичь того, что вы описали выше? Если последнее, см. Ниже, если нет, уточните ваши потребности –

+0

Я добавил полный код. По умолчанию изображение будет отображаться на левой кнопке, и при нажатии правой кнопки переключателя необходимо перейти к правой кнопке. – KMKZ509

+0

его дефинитно не полный код, отсутствует классное деление XD –

ответ

0

Просто

yourJButton.setIcon(yourIconToSet); 

, и это должно быть OFC вызывается из действий слушателя на кнопку радио

leftRadioButton.addActionListener(new ActionListener() { 
    public void actionPerformed(ActionEvent arg0) { 
     // ? <- here invoke code to change your button's label 
    } 
}); 
+0

Я пробовал, но это не сработало. Я добавил полный код, если вы хотите его проверить. – KMKZ509

1
public class SwitchButton { 
public static void main(String [] args){ 
    SwitchButton sb = new SwitchButton(); 
} 

JFrame jfButtons = new JFrame(); 
JPanel jpButtons = new JPanel(); 
JRadioButton jrb = new JRadioButton("if you click me"); 
JButton jb = new JButton("I'll change"); 

public SwitchButton(){ 
    jrb.addActionListener(new ActionListener() { 
     @Override 
     public void actionPerformed(ActionEvent e) { 
      changeColor(jb, Color.blue); 
     } 
    }); 
    jpButtons.add(jrb); 
    jpButtons.add(jb); 
    jfButtons.add(jpButtons); 
    jfButtons.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
    jfButtons.setVisible(true); 
    jfButtons.pack(); 
} 

public void changeColor(JButton jbtn, Color color){ 
    jbtn.setBackground(color); 
} 

}

Это в основном то, что вы пытаетесь сделать. Вы просто должны изменить changeColor() в ChangeIcon()

+0

Все еще новый с Java, поэтому я не уверен, как реализовать свой код в моем. Я добавил свой полный код, если вы хотите просмотреть его. – KMKZ509

0

Вы могли бы обеспечить кнопку, которая должна быть изменена в качестве аргумента вашего JRadioButton-творца, но выглядит вполне нечитаемым и плохо сконструированный

private JRadioButton leftRadioButton(JButton affectedButton) { 
    JRadioButton leftRadioButton = new JRadioButton("LEFT"); 
    leftRadioButton.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent arg0) { 
      if (leftRadioButton.isSelected()) 
       affectedButton=rightRadioButton(); 
      else 
       affectedButton=leftRadioButton(); 
     } 
    }); 
    leftRadioButton.setSelected(true); 
    return leftRadioButton; 
} 

Я бы предпочел использовать не встроенное дефинирование вашего ActionListener, а реализовать его в вашем фрейме (или в каком классе вы используете), чтобы получить доступ к кнопкам и ярлыкам и т. Д., Которые используются в этом классе. Это становится более читаемым, если у вас нет слишком много предметов для прослушивания.

public class buttonchanger extends JFrame implements ActionListener{ 
    JPanel radioButtonPanel; 
    JPanel imagePanelBoxes; 
    JButton leftImage; 
    JButton rightImage; 
    JRadioButton leftRadioButton; 
    JRadioButton rightRadioButton; 

    public initGUI() { 
     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(0, 5)); 
     setContentPane(contentPane); 

     JLabel lblExampleGui = new JLabel("Example GUI"); 
     lblExampleGui.setFont(new Font("Tahoma", Font.PLAIN, 18)); 
     lblExampleGui.setHorizontalAlignment(SwingConstants.CENTER); 
     contentPane.add(lblExampleGui, BorderLayout.NORTH); 

     JPanel radioButtonPanel = new JPanel(); 
     contentPane.add(radioButtonPanel, BorderLayout.SOUTH); 

     JPanel imagePanelBoxes = mainImagePanel(); 
     contentPane.add(imagePanelBoxes, BorderLayout.CENTER); 

     JButton leftImage = leftClickImage(); 
     imagePanelBoxes.add(leftImage); 

     JButton rightImage = rightClickImage(); 
     imagePanelBoxes.add(rightImage); 

     JRadioButton leftRadioButton = leftRadioButton(); 
     leftRadioButton.addActionListener(this); 
     radioButtonPanel.add(leftRadioButton); 

     JRadioButton rightRadioButton = rightRadioButton(); 
     rightRadioButton.addActionListener(this); 
     radioButtonPanel.add(rightRadioButton); 

     ButtonGroup group = new ButtonGroup(); 
     group.add(leftRadioButton); 
     group.add(rightRadioButton); 
    } 

    public void ActionListener(ActionEvent actE){ 
     Object obj=actE.getSource(); 
     if (obj==leftRadioButton){ 
      leftImage.setIcon(yourIcon); 
      //or do whatever you intend to do 
     } 
    } 

} 

надеюсь, что это скорее решение, которое вы искали. Я до сих пор не знаю, что кнопка должна измениться в каком состоянии после RadioButton-Event

+0

его нерабочий код, но в порядке, куда идти. –

+0

Спасибо, что ответили, к сожалению, у меня все еще есть проблемы. Я собираюсь проверить у репетитора, чтобы узнать, могут ли они помочь. – KMKZ509

0
ImageIcon icon = new ImageIcon("img src"); 

rightRadiobutton.addActionListener(new ActionListener(ActionEvent ae){ 
    changeIcon(rightButton, icon); 
}); 

public void changeIcon(JButon jb, ImageIcon icon){ 
    jb.setIcon(icon); 
} 

Вы делаете то же самое для leftRadioButton. Также вам не нужны отдельные методы для создания компонентов; вы можете просто назначить и использовать их как:

JRadioButton rightJrb = new JRadioButton("I am a radio button"); 
rightJrb.addActionListener(); 
+0

Я редактировал код вопроса с последним кодом минус импорта. Я использую только один класс. Попробовав свои предложения, он пока не отобразит изображение в правой кнопке, пока не будет выбран правильный переключатель. Я также попытался использовать оператор if, чтобы проверить, выбрано ли RadioButton, но все равно ничего. – KMKZ509

Смежные вопросы