Проблема с областью видимости

247
19 июня 2017, 19:37

Ошибка: button cannot be resolved

Как исправить эту ошибку? Код:

package tstgm;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
public class bckgrnd {
    public static void main(String[] args) {
        JButton button = new JButton();
        button.addActionListener(new ListenerAction());
        button.setSize(1920, 1080);
        button.setVisible(true);
        EventQueue.invokeLater(new Runnable()
        {
            public void run()
            {
            ImageFrame frame = new ImageFrame();
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setVisible(true);
            frame.add(button);
        }
    });
}
static class ListenerAction implements ActionListener {
    public void actionPerformed(ActionEvent e) {
    button.setVisible(false);
    button.setSize(0, 0);
    }
}
}
class ImageFrame extends JFrame
{
    public ImageFrame()
    {
        setTitle("ImageTest");
        setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);
        ImageComponent component = new ImageComponent();
        add(component);
    }
    public static final int DEFAULT_WIDTH = 300;
    public static final int DEFAULT_HEIGHT = 200;
}
class ImageComponent extends JComponent
{
    public ImageComponent()
    {
        try
        {
            image = ImageIO.read(new File("src/ball.png"));
        }
        catch(IOException e)
        {
            e.printStackTrace();
        }
    }
    public void paintComponent(Graphics g)
    {
        if(image == null) return;
        int imageWidth = image.getWidth(this);
        int imageHeight = image.getHeight(this);
        g.drawImage(image, 0, 0, null);
    }
    private Image image;
}
Answer 1

Переменная button описана внутри метода main и вне этого метода не видна. Вы можете сделать её видимой, если попишете как поле класса (static).

public class bckgrnd {
    static JButton button;
    public static void main(String[] args) {
        button = new JButton();

Но подобное решение не является эффективным. Будет лучше, если вы используете анонимный класс для слушателя

button.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
        button.setVisible(false);
        button.setSize(0, 0);
    }
});

Или лямбду

button.addActionListener(e -> {
    button.setVisible(false);
    button.setSize(0, 0);
});
READ ALSO
Возможно ли слепить файл изображения из строки переданной в запросе?

Возможно ли слепить файл изображения из строки переданной в запросе?

Из android-клиента, на сервер, передается файл в виде строки, на стороне андроид-приложения это делается как-то так:

208
Кнопки в верстке [требует правки]

Кнопки в верстке [требует правки]

Как сверстать чтобы надписи были под кнопками

173
Почему select скроллится к первому значению?

Почему select скроллится к первому значению?

Не могу понять, почему кастомизированный select с multiple скроллится к первому выбранному значению при выборе любого пункта? Как побороть понятно,...

221