Изменение текстового значения JLabel в режиме реального времени

Я пытаюсь изменить текст этого JLabel (searchedstock) в режиме реального времени. Вот мой код:

public void gamegui() {

    GridBagConstraints c = new GridBagConstraints();
    c.fill = GridBagConstraints.HORIZONTAL;
    c.gridwidth = 2;
    JLabel welcome = new JLabel("Welcome " + playername + "!");
    welcome.setFont(new Font("Arial", 1, 30));
    gamepanel.add(welcome, c);
    c.gridx = 0;
    c.gridy = 1;
    gamepanel.add(new JPanel(), c);
    c.gridwidth = 1;
    c.gridy = 2;
    gamepanel.add(new JLabel("Symbol Search:"), c);
    c.gridx = 1;
    final JTextField symbolsearch = new JTextField(10);
    gamepanel.add(symbolsearch, c);
    c.gridx = 0;
    c.gridy = 3;
    gamepanel.add(new JPanel(), c);
    c.gridx = 0;
    c.gridy = 4;
    c.gridwidth = 2;
    JButton search = new JButton("Search");
    search.addActionListener(new ActionListener() {

        public void actionPerformed(ActionEvent e){

            stockvalue = Double.toString(getstocks(symbolsearch.getText()));
        }
    });
    gamepanel.add(search, c);
    c.gridx = 0;
    c.gridy = 5;
    gamepanel.add(new JPanel(), c);
    c.gridx = 0;
    c.gridy = 6;
    c.gridwidth = 2;
    JLabel searchedstock = new JLabel(stockvalue);
    gamepanel.add(searchedstock, c);
    add(gamepanel);
}

Как я могу изменить значение в реальном времени при нажатии этой кнопки, потому что ее слушатель находится во внутреннем классе? У него нет прямого доступа к моему JLabel, поэтому я не могу использовать setText(); и это моя проблема.


person ama291    schedule 19.08.2013    source источник


Ответы (2)


У вас есть как минимум два варианта...

Опция 1

Сделайте JLabel final, но вы должны сделать это ДО внутреннего слушателя...

public void gamegui() {
    /*...*/
    final JLabel searchedstock = new JLabel(stockvalue);
    JButton search = new JButton("Search");
    search.addActionListener(new ActionListener() {

        public void actionPerformed(ActionEvent e){

            stockvalue = Double.toString(getstocks(symbolsearch.getText()));
            searchedstock.setText(NumberFormat.getNumberInstance().format(stockValue));
        }
    });
    gamepanel.add(search, c);
    c.gridx = 0;
    c.gridy = 5;
    gamepanel.add(new JPanel(), c);
    c.gridx = 0;
    c.gridy = 6;
    c.gridwidth = 2;
    gamepanel.add(searchedstock, c);
    add(gamepanel);
}

Вариант 2

Сделайте метку полем экземпляра класса...

private JLabel searchedstock;

public void gamegui() {
    /*...*/
    final JLabel searchedstock = new JLabel(stockvalue);
    JButton search = new JButton("Search");
    search.addActionListener(new ActionListener() {

        public void actionPerformed(ActionEvent e){

            stockvalue = Double.toString(getstocks(symbolsearch.getText()));
            searchedstock.setText(NumberFormat.getNumberInstance().format(stockValue));
        }
    });
    gamepanel.add(search, c);
    c.gridx = 0;
    c.gridy = 5;
    gamepanel.add(new JPanel(), c);
    c.gridx = 0;
    c.gridy = 6;
    c.gridwidth = 2;
    searchedstock = new JLabel(stockvalue);
    gamepanel.add(searchedstock, c);
    add(gamepanel);
}
person MadProgrammer    schedule 19.08.2013
comment
Какой провал, я не сделал свой JLabel перед кнопкой с внутренним классом. Раньше я пытался использовать final на JLabel, и из-за этого это не сработало. Большое спасибо! - person ama291; 19.08.2013

Сделайте JLabel final (и объявите перед кнопкой) или членом экземпляра. Затем он будет доступен из внутреннего класса.

eg

final JLabel searchedstock = new JLabel(stockvalue);

search.addActionListener(new ActionListener() {

    public void actionPerformed(ActionEvent e){

        String stockvalue = Double.toString(getstocks(symbolsearch.getText()));
        searchedstock.setText(stockvalue);
    }
});
person pstanton    schedule 19.08.2013