Почему мой JLabel не обновляется при каждом нажатии? - PullRequest
0 голосов
/ 30 октября 2019

По сути, я пытаюсь сделать так, чтобы каждый раз, когда вы щелкаете где-нибудь в JFrame, JLabel добавляется на 1. Проблема в том, что если бы я должен был распечатать значение количества, оно увеличивается, но фактическоеJLabel продолжает оставаться прежним.

Чтобы попытаться это исправить, я пытался обновлять объект JLabel каждый раз, когда вы щелкаете, но, похоже, это тоже не сработало. (Сделал это, написав "JLabel ();") Кроме этого, я действительно не могу думать о том, что это может быть,

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

public class Franels extends MouseAdapter {
    int width, height;
    int amount = 0;

    JFrame frame = new JFrame("Title");
    JPanel panel = new JPanel();
    JButton button = new JButton("Hello");
    JLabel label = new JLabel();

    public void FrameConfig(int width, int height) {
        this.width = width;
        this.height = height;
        frame.setSize(width, height);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
        frame.setLayout(null);
        frame.setResizable(false);

        frame.add(panel);

        frame.getContentPane().addMouseListener(new Franels());
    }

    public void PanelConfig() {
        panel.setBounds(300, 300, 300, 300);
        panel.setBackground(Color.blue);
        panel.setVisible(true);

        panel.add(label);        
    }

    public void LabelConfig() {
        label.setForeground(Color.red);
        label.setText(String.valueOf(amount));
    }

    public void mouseClicked(MouseEvent e) {
        amount++;
        LabelConfig();
        System.out.println(amount);
    }
}
import javax.swing.*;
import java.awt.*;

public class Main {


    public static void main(String args[]) {
        Franels windows = new Franels();
        windows.FrameConfig(900, 900);
        windows.PanelConfig();
        windows.LabelConfig();
    }
}

Ответы [ 2 ]

3 голосов
/ 30 октября 2019

Итак, ваша «основная» проблема в том, что JPanel() никогда не вызывается, поэтому метка никогда не добавляется в пользовательский интерфейс.

public class Franels extends MouseAdapter {

    //...
    JPanel panel = new JPanel();

    // Just want to point out that these method names
    // are poorly chosen
    public void JFrame(int width, int height) {
        //...
        // Thi sis going to give you no end of issues
        frame.setLayout(null);
        //...
        frame.add(panel);
        //...
    }

    // This is never called
    public void JPanel() {
        panel.setBounds(300, 300, 300, 300);
        panel.setBackground(Color.blue);
        panel.setVisible(true);

        panel.add(label);        
    }


    //...
}

Ваша большая проблема много.

  1. Я бы не использовал метод для прямой инициализации компонентов. Вместо этого они должны создать свой собственный экземпляр объекта и вернуть его. При необходимости вы можете назначить их другим переменным, но сами методы должны быть самодостаточными
  2. Именование ваших методов ... трудно читать. Попробуйте вместо этого использовать getXxx (т. Е. getPanel, getLabel) или что-то более значимое
  3. null макеты - это просто полная боль в ядре. Вам лучше потратить время на то, чтобы узнать, как использовать API менеджера компоновки. См. Расположение компонентов в контейнере для получения более подробной информации

Обновлено ...

Хорошо, после еще нескольких копаний. Обновленный экземпляр label отличается от экземпляра label на экране. Это заняло еще несколько копаний, но проблема сводится к следующему:

frame.getContentPane().addMouseListener(new Franels());

Вы создаете новый экземпляр Franels, который получает события мыши и обновляет свой экземпляр label, которыйне такой, как на экране.

Вместо этого используйте

frame.getContentPane().addMouseListener(this);
0 голосов
/ 30 октября 2019

Обновите текст JLabel после изменения суммы, он не будет делать это автоматически.

 public void mouseClicked(MouseEvent e) {
      amount++;
      label.setText(String.valueOf(amount));
 }

РЕДАКТИРОВАТЬ: Как вы сказали, вышеупомянутое решение не работает для вас, я написал небольшую программу дляподражать тому, что вы пытаетесь сделать.

public class Panel extends JPanel implements MouseListener
{
    JLabel label = new JLabel();
    int amount = 0;

    public static void main(String[] args)
    {
        JFrame frame = new JFrame();
        frame.setSize(400,400);
        frame.setContentPane(new Panel());
        frame.setVisible(true);
    }

    public Panel()
    {
        addMouseListener(this);
        label.setText(""+amount);
        add(label);
    }

    public void mouseClicked(MouseEvent arg0)
    {
        amount++;
        label.setText(""+amount);
        System.out.println(amount);
    }
}
...