2014-11-12 3 views
0

Я пытаюсь установить новый текст в кнопку, когда вы нажимаете на нее. Однако это не похоже на работу, я делаю что-то неправильно, и я не знаю, что ...JButton setText() ERROR

EDIT ----- Я придаю код для облегчения понимания того, что я имею в виду

import javax.swing.*; 

import java.awt.*; 
import java.awt.event.*; 

public class GrowAndShrinkSquareGUItest { 
JFrame frame; 
SquareDrawPanel bigGreen; 
SquareDrawPanel smallGreen; 
JButton button; 
growAndShrinkListener listener; 

public class SquareDrawPanel extends JPanel { 

    int width; 
    int height; 

    SquareDrawPanel(int w, int h) { 

     width = w; 
     height = h; 
    } 

    public void paintComponent(Graphics g) { 

     g.setColor(Color.green); 
     g.fillRect(frame.getWidth()/2 - (width/2), frame.getHeight() 
       /2 - (height/2) - 15, width, height); 

    } 

} 

public class growAndShrinkListener implements ActionListener { 

    // JButton button; 

    growAndShrinkListener(JButton button) { 

     button = new JButton("Click me to grow the Square"); 
     frame.add(button, BorderLayout.NORTH); 
     button.addActionListener(this); 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     button.setText("Unselect all"); 

    } 
} 

public static void main(String[] args) { 
    GrowAndShrinkSquareGUItest test = new GrowAndShrinkSquareGUItest(); 
    test.go(); 
} 

private void createPanels() { 

    bigGreen = new SquareDrawPanel(400, 400); 
    smallGreen = new SquareDrawPanel(100, 100); 

} 

private void drawPanel(JPanel panel) { 

    frame.add(panel); 
    panel.setVisible(true); 
    frame.add(panel, BorderLayout.CENTER); 

} 

private void createListenerButton() { 
    listener = new growAndShrinkListener(button); 
} 

private void loop(){} 

public void go() { 
    frame = new JFrame(); 
    frame.setSize(500, 500); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    createPanels(); 
    drawPanel(smallGreen); 
    createListenerButton(); 
    frame.setVisible(true); 


} 

}

+1

Пожалуйста, укажите ошибку. –

+1

Где именно находится 'кнопка? Кажется, он не определен для метода actionPerformed. – RealSkeptic

+0

Этот класс является внутренним классом большего. Я объявил кнопку в суперклассе. – eneko

ответ

0

Это потому, что вы используете переменную button, которая не определена в рамках метода actionPerformed. Переменные Java имеют область видимости, и они доступны внутри фигурных скобок, где они определены. Метод actionPerformed выполнен из фигурных скобок growAndShrinkListener. Фиксированный код:

public class growAndShrinkListener implements ActionListener { 



    growAndShrinkListener(JButton button) { 

     button = new JButton("Click me to grow the Square"); 
     frame.add(button, BorderLayout.NORTH); 
     button.addActionListener(this); 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     Object source = e.getSource(); 

     if(source instanceof JButton) { 
      button = (JButton) source; 
      button.setText("Click to shrink square"); 
     } 
    } 
} 

В качестве альтернативы, вы можете использовать частную переменную:

public class growAndShrinkListener implements ActionListener { 

    private JButton button; 

    growAndShrinkListener() { 

     button = new JButton("Click me to grow the Square"); 
     frame.add(button, BorderLayout.NORTH); 
     button.addActionListener(this); 

    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     button.setText("Click to shrink square"); 
    } 
} 

Примечание: Вы не должны перезаписать содержимое аргумента в конструкторе. Аргумент, который вы получили, не является «указателем» на переменную вызываемого, а просто простой ссылкой на это. Если вы перепишете, то контент будет потерян для вас, и calle этого не узнает.

+0

Работал! большое спасибо! – eneko

0

изменения, как это ..

public class YourSuperClass{ 
    private JButton button; 
    public YourSuperClass(){ 
     // your logics 
     button = new JButton(); 
     button.addActionListener(new GrowAndShrinkListener(button)); 
     frame.add(button, BorderLayout.NORTH); 
    } 
    class GrowAndShrinkListener implements ActionListener { 
     GrowAndShrinkListener(JButton button) { 

     } 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      if(e.getSource() == button){ 
       button.setText("Click to shrink square"); 
      } 

     } 
    } 
} 
+0

Thaks также работал! – eneko

0

Попробуйте:

 import javax.swing.*; 
     import java.awt.*; 
     import java.awt.event.*; 
     class frame extends JFrame 
     { 
     JButton b; 
     public frame() 
     { 
      setLayout(new BorderLayout()); 
      b=new JButton("Press"); 
      add(b,BorderLayout.SOUTH); 
      b.addActionListener(new ActionListener(){ 
      public void actionPerformed(ActionEvent e) 
      { 
      b.setText("Clicked"); 
      } 
      }); 
     } 

     public static void main (String[] args) { 
      frame f=new frame(); 
      f.setExtendedState(MAXIMIZED_BOTH); 
      f.setVisible(true); 
     } 
     } 
Смежные вопросы