почему мой jbutton с изображением не появляется с графикой Java - PullRequest
0 голосов
/ 03 мая 2018

У меня проблемы с тем, что моя кнопка не отображается. Если я не использую paintComponent, то мои JButton с изображениями не показывают проблем. Однако сейчас изображение не появляется. Если я наведусь на то место, где оно должно быть, изображение появится на одну секунду. Значит, кнопка все еще там, может быть, под фоном?

public class Game extends JPanel implements KeyListener, ActionListener {

    //layout variables
    private ImageIcon right,left,up,down;
    private JButton rightButton,leftButton,upButton,downButton;

    //play variables
    private boolean play=false;
    private int score=0;

    private int paddleX= 200; //paddle X position
    private int paddleY= 300; //paddle Y pos
    private int ballX= 210; //ball x position
    private int ballY= 260; //ball y position
    private int ballXdir=-1; //x direction
    private int ballYdir=-2; //y direction

    private Timer time; //my timer

    public Game() {
        Display(); //display the layout
        addKeyListener(this);
        setFocusable(true);
        setFocusTraversalKeysEnabled(false);
        time= new Timer(8,this);
        time.start();
    }

    public void Display(){

        //setLayout
        this.setLayout(null);

        //Setting the Images
        //right = new ImageIcon(getClass().getResource("images\\rightIcon.png"));
        left = new ImageIcon(getClass().getResource("images\\leftIcon.png"));
        up = new ImageIcon(getClass().getResource("images\\upIcon.png"));
        down = new ImageIcon(getClass().getResource("images\\downIcon.png"));

        //Setting the JButtons for the arrow images
        rightButton= new JButton("right");
        rightButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                if(paddleX>=400){
                    paddleX=400;
                }
                else{
                    moveRight();
                }
                repaint();
            }
        });
        //rightButton.setOpaque(false);
        //rightButton.setContentAreaFilled(false);
        //rightButton.setBorderPainted(false);

        leftButton= new JButton(left);
        leftButton.setOpaque(false);
        leftButton.setContentAreaFilled(false);
        leftButton.setBorderPainted(false);

        upButton= new JButton(up);
        upButton.setOpaque(false);
        upButton.setContentAreaFilled(false);
        upButton.setBorderPainted(false);

        downButton= new JButton(down);
        downButton.setOpaque(false);
        downButton.setContentAreaFilled(false);
        downButton.setBorderPainted(false);

        //setting image bounds and adding it to screen
        rightButton.setBounds(135,450,50,50);
        leftButton.setBounds(45,450,50,50);
        upButton.setBounds(90,400,50,50);
        downButton.setBounds(90,500,50,50);

        //rightButton.addActionListener(this);
        leftButton.addActionListener(this);

        add(upButton);
        add(downButton);
        add(leftButton);
        add(rightButton);



    }

    //painting the screen with graphics
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.setColor(Color.BLACK);
        g.fillRect(25,25,425,300); //game area

        //drawing the paddle
        g.setColor(Color.YELLOW);
        g.fillRect(paddleX,paddleY,50,8);

        //drawing the ball
        g.setColor(Color.PINK);
        g.fillOval(ballX,ballY,20,20);

        g.dispose();
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        time.start();

        if(e.getSource()==right) {
            if(paddleX>=400){
                paddleX=400;
            }
            else{
                moveRight();
            }           
        }

        if(e.getSource()==left) {
            if(paddleX<35){
                paddleX=35;
            }
            else{
                moveLeft();
            }
        }

        repaint();

    }
    @Override
    public void keyPressed(KeyEvent e) {
        if(e.getKeyCode()==KeyEvent.VK_RIGHT){
            if(paddleX>=400){
                paddleX=400;
            }
            else{
                moveRight();
            }

        }
        if(e.getKeyCode()==KeyEvent.VK_LEFT){
            if(paddleX<35){
                paddleX=35;
            }
            else{
                moveLeft();
            }
        }

    }
    @Override
    public void keyReleased(KeyEvent arg0) {

    }

    @Override
    public void keyTyped(KeyEvent arg0) {

    }

    public void moveRight(){
        play=true;
        paddleX+=10;
    }

    public void moveLeft(){
        play=true;
        paddleX-=10;
    }


}

1 Ответ

0 голосов
/ 03 мая 2018

Я настоятельно рекомендую взглянуть на Выполнение пользовательской рисования и Рисование в AWT и Swing , так как это объяснит, как работает система рисования.

По сути, вам передается ссылка на контекст Graphics, который в настоящее время используется для выполнения текущего прохода рисования, с помощью метода paintComponent. Это общий ресурс. Все компоненты, участвующие в прохождении рисования, передаются в одном и том же Graphics контексте.

Вызывая dispose, вы высвобождаете все базовые ресурсы для контекста, что в некоторых системах может препятствовать окрашиванию других компонентов.

Но они рисуют, когда я наводю на них мышь

Поскольку компоненты могут быть нарисованы независимо от их родителя, вы также вызываете repaint для родительского компонента, который, как вы уже догадались, нарисует его дочерние элементы.

Рекомендации

  • Создание пользовательского компонента, предназначенного исключительно для выполнения пользовательских операций рисования (и, возможно, некоторых других основных игровых функций)
  • Создайте еще один компонент для удерживания кнопок (и используйте соответствующие макеты)
  • Используйте какую-то модель данных, которая используется ими совместно. Эта модель будет хранить состояние «действий» (то есть вверх / вниз / влево / вправо), и «движок» будет использовать эту информацию для обновления состояния игры.
  • Используйте API связывания клавиш , который решит проблемы ненадежности, связанные с KeyListener
...