Я попытался поместить JLabel на JButton, но когда я наведу указатель мыши на ярлык, он исчезает - PullRequest
0 голосов
/ 23 апреля 2019

Здесь я реализую JButton:

btnTotalCall = new JButton("Total calls");
        btnTotalCall.setFocusPainted(false);
        btnTotalCall.setVerticalAlignment(SwingConstants.TOP);
        btnTotalCall.setForeground(Color.BLACK);
        btnTotalCall.setBackground(Color.WHITE);
        btnTotalCall.setBounds(302, 39, 125, 125);
        contentPane.add(btnTotalCall);

Здесь JLabel:

lblTotalCall = new JLabel("");
        lblTotalCall.setHorizontalAlignment(SwingConstants.CENTER);
        lblTotalCall.setBackground(Color.WHITE);
        lblTotalCall.setForeground(Color.BLACK);
        lblTotalCall.setFont(new Font("Tahoma", Font.BOLD, 20));
        lblTotalCall.setBounds(302, 39, 125, 125);
        contentPane.add(lblTotalCall);

Здесь в MainController я пытался обновить lblTotalCall с помощью моегобаза данных все секунды:

public MainController(MainView mainView)
    {
        this.mainView = mainView;

        ActionListener timerListener = new ActionListener()
        {
            DAO<Call> call_dao = new CallDAO();
            List<Call> call_list;
            int call_time;
            DAO<User> user_dao = new UserDAO();
            List<User> user_list;

            public void actionPerformed(ActionEvent e)
            {
                // Put the current date and time in the label date and update it
                DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
                DateFormat heureFormat = new SimpleDateFormat("HH:mm:ss");
                Date cal = Calendar.getInstance().getTime();
                mainView.getLblDate().setText("<html>" + dateFormat.format(cal).toString() + "<br>" +
                                heureFormat.format(cal) + "</html>");

                call_list = call_dao.recupAll();

                        // Update the lblTotalCall
                if(call_list.size() > 0)
                {
        mainView.getLblTotalCall().setText(Integer.toString(call_list.size()));
                }
                else
                {
                    mainView.getLblTotalCall().setText("0");
                }


                for (Call call : call_list) 
                {
                    if (call.getDate() == cal && mainView.getRdbtnToday().isSelected())
                    {
                        call_time = call_time + call.getDuration();
                        call_time = call_time / call_list.size();
                    }
                }

                user_list = user_dao.recupAll();

                if(user_list.size() > 0)
                {
                    mainView.getLblOperators().setText(Integer.toString(user_list.size()));
                }
                else
                {
                    mainView.getLblOperators().setText("0");
                }
            }
        };

        Timer timer = new Timer(1000, timerListener);
        // to make sure it doesn't wait one second at the start
        timer.setInitialDelay(0);
        timer.start();
    }

Я уже пытался поместить значение по умолчанию в JLabel и изменить значение свойств focusable и enabled на false, но это не исправитьэто.

Я запускаю приложение, (извините, я не могу опубликовать изображения)

enter image description here

Я вижу правильные данные, но когдаЯ положил указатель мыши на btnTotalCall или btnOperators, этикетки исчезли.

enter image description here

1 Ответ

1 голос
/ 23 апреля 2019

Я пытался надеть Jlabel на кнопку J

Все, что я вижу, это:

contentPane.add(btnTotalCall);
...
contentPane.add(lblTotalCall);

Это означает, что вы добавляете два компонента на панель, а не добавляете ярлык для кнопки.

но когда я наведу указатель мыши на jlabel, исчезнет

По умолчанию Swing предполагает, что компоненты не перекрываются, и когда вы наводите курсор мыши на кнопку, кнопка должна быть перекрашена, чтобы закрасить мышь эффектом кнопки, поэтому вся кнопка перерисовывается и вы больше не видите метку.

Если вы хотите нарисовать два компонента в одном и том же месте, вам нужно переопределить метод isOptimizedDrawingEnabled() панели, чтобы вернуть false, чтобы убедиться, что оба компонента перекрашены.

См. Схема наложения для диспетчера компоновки, который позволит вам размещать несколько компонентов друг над другом, как только вы переопределите вышеуказанный метод.

Или более простой подход - добавить метку к кнопке:

JButton button = new JButton("Total Calls");
button.setVerticalAlignment(SwingConstants.TOP);
button.setLayout( new BorderLayout() );

JLabel center = new JLabel("0");
center.setHorizontalAlignment(SwingConstants.CENTER);
button.add(center, BorderLayout.CENTER);

Это не настоящий менеджер раскладки, так как размер кнопки будет определяться только свойствами кнопки, а не надписью, добавленной к кнопке.

Другой вариант - использовать HTML для текста кнопки:

JButton button2 = new JButton("<html>Total Calls<br><br><center>0</center></html>");
...