Я не могу получить доступ к переменной экземпляра в операторе if в Java - PullRequest
0 голосов
/ 12 февраля 2019

Я пытаюсь упростить классы свинговой графики Javax, чтобы другим людям было проще войти в графику Java, но я сталкиваюсь с проблемой при ее тестировании.Имейте в виду, что я пишу основной метод как пользователь кода, а не разработчик.Мне нужны ответы, которые изменят код методов класса, а не метод main.

То, что должен делать мой код основного метода, это печать «зависания», когда пользователь наводит курсор на кнопку.Однако, когда я добавляю оператор SOP перед оператором if, он работает ... Метод наведения мыши находится в классе Button.

Вот мой основной код метода -

    public static void main(String[] args) {
        GraphWin win = new GraphWin(1000, 1000, "Graphics Window - Test");
        win.show();

        Button button = new Button(new Point(380, 300), new Point(620, 400));
        button.draw(win);

        enter code herewhile(true) {
            //System.out.println(button.hovering);
            if(button.hovering) {
                System.out.println("hovering");
            }
        }
    }

А вот мой код для класса Button -

public class Button implements MouseListener{
    public JButton button;
    public boolean clicked = false, hovering = false, pressed = false;

    public Button(Point p, Point p2) { //This is the default constructor of the button with only 2 points specified
        this.button = new JButton();
        this.setBounds(p, p2);  
        this.button.addMouseListener(this);
        this.setBorderVisible(false);}

    public Button(Point p, Point p2, String text) { //This constructor requires text to be displayed`enter code here`
        this.button = new JButton(text);
        this.setBounds(p, p2);
        this.button.addMouseListener(this);
        this.setBorderVisible(false);}

    public Button(String icon, Point p, Point p2) { //This constructor sets an Icon for the button
        this.button = new JButton();
        this.setIcon(icon);
        this.setBounds(p, p2);
        this.button.addMouseListener(this);
        this.setBorderVisible(false);}

    public Button(Point p, Point p2, String text, String icon) { //Here, both the text and Icon is specified
        this.button = new JButton(text);
        this.setIcon(icon);
        this.setBounds(p, p2);
        this.button.addMouseListener(this);
        this.setBorderVisible(false);}

    public void draw(GraphWin win) {
        win.window.add(this.button);}
    public void setBounds(Point p, Point p2) {
        this.button.setBounds(p.x, p.y, p2.x - p.x, p2.y - p.y);
    }

    public void setEnabled(boolean enable) {
        this.button.setEnabled(enable);}
    public void disable() {
        this.button.setEnabled(false);}
    public void enable() {
        this.button.setEnabled(true);
    }

    public void setColor(Color color) {
        this.button.setBackground(color);}
    public void setColor(String color) {
        this.button.setBackground(Color.decode(color));}

    public void setText(String text) {
        this.button.setText(text);}
    public void setIcon(String icon) {
        File imageCheck = new File(icon);
        if(!imageCheck.exists()) 
            System.out.println("Image file not found!");
        else
            this.button.setIcon(new ImageIcon(icon));
    }

    public void resizeIcon(String icon, int width, int height) {
        Image img = new ImageIcon(icon).getImage();
        img = img.getScaledInstance(width, height, Image.SCALE_SMOOTH);
        this.button.setIcon(new ImageIcon(img));
    }

    public void setCustomMargins(int top, int bottom, int left, int right) {
        this.button.setMargin(new Insets(top, left, bottom, right));}
    public void setMargins(int m) {
        this.button.setMargin(new Insets(m, m, m, m));}

    public void setLabel(String label) {
        this.button.setToolTipText(label);
    }
    public void setBorderVisible(boolean border) {
        this.button.setBorderPainted(border);}

    public void setOpaque(boolean opaque) {
        this.button.setContentAreaFilled(opaque);}

    @Override
    public void mouseEntered(MouseEvent arg0) {
        this.hovering = true;
        System.out.println(1);
        }

    @Override
    public void mouseExited(MouseEvent arg0) {
        this.hovering = false;
    }

    @Override
    public void mousePressed(MouseEvent arg0) {
        this.pressed = true;
    }

    @Override
    public void mouseReleased(MouseEvent arg0) {
        this.pressed = false;
    }

    @Override
    public void mouseClicked(MouseEvent e) {
        this.clicked = true;
        System.out.println(1);
    }

}

Ответы [ 2 ]

0 голосов
/ 12 февраля 2019

Подобные вещи обычно связаны с многопоточностью.

События в Swing отправляются в потоке диспетчеризации событий AWT (EDT).Чтобы быть потокобезопасным, практически все, что касается Swing / AWT, должно выполняться на EDT.

В вашем случае нет никакой блокировки между устанавливаемой и читаемой переменной.Добавление println вызывает паузу (со всеми видами барьеров памяти или что-то еще), которая позволяет программе запускаться в нужной последовательности.

Вы, вероятно, видели main методов, написанных для прохождения выполненияпрямо к AWT.

class MyGUI {
    public static void main(String[] args) {
        java.awt.EventQueue.invokeLater(MyGUI::go);
    }
    private static void go() {
        ...

Возможно, было бы лучше предоставить основной класс самостоятельно, реализованный таким образом, чтобы он принимал класс приложения в качестве аргумента и передавал выполнение, когда все настроено.В то время как традиционно командные строки используют main статический метод / функцию, везде другие подтипы: апплеты, сервлеты и т. Д.

0 голосов
/ 12 февраля 2019

лучшим подходом будет использование метода isHovering(), но обоснованное предположение о поведении внутри while(true) с или без Sysout может быть связано с оптимизацией компилятора.Можно исправить, указав переменную зависания как transient

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...