Кнопка и JSlider появляются только при наведении на экран

Может ли кто-нибудь помочь мне, где моя ошибка? Меня напрягает, что кнопка и JSlider появляются, когда я навожу мышь. Это было нормально, когда я использую кнопку, но как только я добавляю кнопку, JSlider отсутствует и появляется при наведении и нажатии.

import java.awt.*;
import java.awt.event.*;
import java.awt.geom.Point2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.util.ArrayList;
import javax.imageio.ImageIO;
import javax.swing.*;
import javax.swing.event.*;

public class MainDisplay extends JFrame implements MouseMotionListener, 
        MouseListener, ChangeListener, ActionListener{
    
    private Point mousepnt = new Point();
    public static Color penColor = new Color(255,105,180);
    private final JSlider penSize = new JSlider(JSlider.HORIZONTAL, 1, 30, 4);
    public static int pen = 4;
    JButton rbutton = new JButton();
    JButton cbutton = new JButton();
    JButton tbutton = new JButton();
    JButton qbutton = new JButton();
    ImageIcon ricon = new ImageIcon(getClass().getResource("ricon.png"));
    ImageIcon cicon = new ImageIcon(getClass().getResource("cicon.png"));
    ImageIcon ticon = new ImageIcon(getClass().getResource("ticon.png"));
    ImageIcon qicon = new ImageIcon(getClass().getResource("qicon.png"));

    public MainDisplay(){ 
        JPanel toolbar = new JPanel(new FlowLayout(FlowLayout.LEFT));
        JPanel toolbar2 = new JPanel(new FlowLayout(FlowLayout.LEFT));
    JPanel jp = new JPanel();
        jp.addMouseMotionListener(this);
        jp.addMouseListener(this);
        toolbar.add(new Label("Drag mouse to draw"));
        toolbar.add(penSize);
        penSize.addChangeListener(this);
        toolbar2.add(new Label("Choose shape to draw"));
        rbutton = new JButton(ricon);
        rbutton.addActionListener(this);
        rbutton.setMargin(new Insets(1, 2, 1, 2));
        toolbar2.add(rbutton);
        cbutton = new JButton(cicon);
        cbutton.addActionListener(this);
        cbutton.setMargin(new Insets(1, 2, 1, 2));
        toolbar2.add(cbutton);
        tbutton = new JButton(ticon);
        tbutton.addActionListener(this);
        tbutton.setMargin(new Insets(1, 2, 1, 2));
        toolbar2.add(tbutton);
        qbutton = new JButton(qicon);
        qbutton.addActionListener(this);
        qbutton.setMargin(new Insets(1, 2, 1, 2));
        toolbar2.add(qbutton);
    this.add(toolbar,BorderLayout.SOUTH);
        this.add(toolbar2,BorderLayout.NORTH);
        this.add(jp,BorderLayout.CENTER);
        setSize(800,600);
    setVisible(true);
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    }

Основной класс

public class Main {
    public static void main(String[] args){
    MainDisplay md = new MainDisplay();
    }
}
"кнопка и JSlider появляются, когда я навожу мышь" В классе MainDisplay отсутствует закрывающий }, а затем он не будет компилироваться из-за отсутствия реализации объявленных интерфейсов. Для получения дополнительной справки опубликуйте минимальный воспроизводимый пример, в котором отображаются проблемы (во время выполнения), о которых сообщалось выше.
Andrew Thompson 30.03.2022 10:44
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
1
26
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Что бы я сделал:

Добавьте MouseMotionListener на панель:

jp.addMouseMotionListener(new MouseMotionListener() {
            @Override
            public void mouseDragged(MouseEvent e) {
                
            }

            @Override
            public void mouseMoved(MouseEvent e) {
                System.out.println("motion" + e.getPoint());
            }
    });

Добавьте ChangeListener в penSize:

penSize.addChangeListener(new ChangeListener() {
            @Override
            public void stateChanged(ChangeEvent e) {
                System.out.println("new pensize: " + penSize.getValue());
            }
    });

И так далее. Таким образом, вы добавили lsiteners к компонентам, а не к фрейму.

Я надеюсь, что помог вам на данный момент. Если у вас есть какие-либо вопросы, пожалуйста, опубликуйте минимальный воспроизводимый пример, как написал Андрей.

Штеффи

спасибо за помощь!! Я новичок в использовании stackoverflow, поэтому я все еще узнаю, как здесь

nana28 06.04.2022 11:53

Другие вопросы по теме