2014-12-31 3 views
3

Итак, у меня есть один класс с установленной в нем переключателем. Затем во втором классе я расширил первый класс и сделал 3 слова «если», которые создадут апплет в зависимости от вывода переключателя. В этих операторах «if» говорится, что переменные не могут быть разрешены. Как я могу их решить? И, пожалуйста, скажите мне, есть ли в моем коде какие-либо ошибки. Спасибо миллион, D.Невозможно получить доступ к переменной из другого класса

Спасибо, любая помощь поможет очень.

// The First Class Code: 


import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 


public class RadioButton extends JPanel { 

    static JFrame frame; 

    JLabel pic; 
    RadioListener myListener = null; 
    public RadioButton() { 



     // Create the radio buttons 
     JRadioButton displacement = new JRadioButton("Displacement"); 
     displacement.setMnemonic(KeyEvent.VK_N); 
     displacement.setSelected(true); 
     //Displacement Button, set to automatically be clicked 

     JRadioButton accel = new JRadioButton("Acceleration"); 
     accel.setMnemonic(KeyEvent.VK_A); 
     accel.setActionCommand("acceleration"); 
     //Acceleration Button 

     JRadioButton time = new JRadioButton("Change in time"); 
     time.setMnemonic(KeyEvent.VK_S); 
     time.setActionCommand("deltaT"); 
     //The change in time button 


     // Creates the group of buttons 
     ButtonGroup group = new ButtonGroup(); 
     group.add(displacement); 
     group.add(accel); 
     group.add(time); 

       myListener = new RadioListener(); 
       displacement.addActionListener(myListener); 
       accel.addActionListener(myListener); 
       time.addActionListener(myListener); 


     // Set up the picture label 
     pic = new JLabel(new ImageIcon(""+"numbers" + ".jpg"));   //Set the Default Image 

     pic.setPreferredSize(new Dimension(177, 122)); 


     // Puts the radio buttons down 
     JPanel panel = new JPanel(); 
     panel.setLayout(new GridLayout(0, 1)); 
     panel.add(displacement); 
     panel.add(accel); 
     panel.add(time); 


     setLayout(new BorderLayout()); 
     add(panel, BorderLayout.WEST); 
     add(pic, BorderLayout.CENTER); 
     setBorder(BorderFactory.createEmptyBorder(40,40,40,40)); 
    } 



    //Listening to the buttons 
    class RadioListener implements ActionListener { 
     public void actionPerformed(ActionEvent e) { 
      pic.setIcon(new ImageIcon(""+e.getActionCommand() 
             + ".jpg")); 
     } 
    } 

    public static void main(String s[]) { 
     frame = new JFrame("∆x = Vavg * time"); 
     frame.addWindowListener(new WindowAdapter() { 
      public void windowClosing(WindowEvent e) {System.exit(0);} 
     }); 

     frame.getContentPane().add(new RadioButton(), BorderLayout.CENTER); 
     frame.pack(); 
     frame.setVisible(true); 
    } 
} 

Мой второй класс, с если заявления

import java.lang.Object; 
    import java.awt.Graphics; 


    public class RadioButtonMain extends RadioButton { 

     public static void main(String [ ] args) { 
     if (displacement.isSelected()) 
      { 
    //Option 1 for applet 
      } 

     if (accel.isSelected()) { 
      //Option 2 for applet 
     } 

     else { 
      //Option 3 for applet 
     } 
     } 
    } 
+1

Смещение невозможно без объекта класса RadioButton. Вы должны создать объект для этого класса, а затем только вы можете получить к нему доступ. Также обратите внимание, что public static void main() - это точка входа программы в то время, когда ваш компилятор ничего не знает о перемещении. –

ответ

2

displacement - локальная переменная в вашем конструкторе. Поэтому он не будет доступен вне конструктора.

Если вы хотите, чтобы он был доступен для других методов в классе, переместить его из конструктора и сделать его поле экземпляра, говоря JRadioButton displacement; над конструктором, в том же месте, где вы объявляете myListener. Фактически, вы уже поступили правильно с myListener, поэтому вам нужно сделать то же самое с displacement.

Это сделает displacement доступным для других методов в классе RadioButton, но не для подклассов, таких как RadioButtonMain. Для того, чтобы сделать его доступным для RadioButtonMain, сделать поле protected:

protected JRadioButton displacement; 

или, возможно, лучше, сделать его private и добавить метод геттер в RadioButton вернуть поле, так как вы, вероятно, не хотят подклассы, чтобы изменить displacement в любое время они чувствуют это.

Кроме того, убедитесь, что вы измените это в конструкторе:

JRadioButton displacement = new JRadioButton("Displacement"); 

к этому:

displacement = new JRadioButton("Displacement"); 

так, что у вас нет локальной переменной с тем же именем, что и поле.

И, наконец, обратите внимание, что метод main является статическим. Поэтому, хотя он определен внутри RadioButtonMain, он не будет иметь доступ к любым полям RadioButtonMain, включая displacement. Сделать это что-то вроде этого:

public static void main(String [ ] args) { 
    new RadioButtonMain().doMain(); 
} 

public void doMain() { 
    if (displacement.isSelected()) 
     { 
//Option 1 for applet 
     } 

    if (accel.isSelected()) { 
     //Option 2 for applet 
    } 

    else { 
     //Option 3 for applet 
    } 
    } 
} 

Это дает вам RadioButtonMain (который также является RadioButton) работать. Обратите внимание, что конструктор RadioButton вызывается до того, как вызывается doMain, что вам нужно, потому что конструктор устанавливает displacement.

+0

Большое спасибо за вашу тяжелую работу! : D –

1

displacement не является глобальной переменной для доступа. в пределах method or constructor вы не можете получить доступ.

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