Как мне переместить круг к рамке макета границы "WEST"? - PullRequest
1 голос
/ 31 января 2012

Это файл 1 (мой инструктор предпочитает, чтобы мы использовали отдельные файлы для каждого расширения)

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

public class Lab2 extends JFrame {

Lab2(){
    setTitle("Lab 1b - Application #2");
    Lab2Panel p = new Lab2Panel();
    add(p);
}

public static void main(String[] args){

    Lab2 frame = new Lab2();
    frame.setTitle("Lab2 Application # 1");
    frame.setLocationRelativeTo(null);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(200, 400);
    frame.setVisible(true);
    }

}

файл 2:

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

public class Lab2Panel extends JPanel{
Lab2Button canvas = new Lab2Button();
JPanel panel = new JPanel();

Lab2Panel () {

    setLayout(new BorderLayout());

    JButton leftButton = new JButton("left");
    JButton rightButton = new JButton("right");
    JButton upButton = new JButton("up");
    JButton downButton = new JButton("down");

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

    this.add(canvas, BorderLayout.CENTER);
    this.add(panel, BorderLayout.SOUTH);

    leftButton.addActionListener(new Lab2MoveBallListener());
}


}

файл 3:

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

public class Lab2Button extends JPanel {
int radius = 5;

protected void paintComponent(Graphics g){
    super.paintComponent(g);
    g.drawOval(getWidth() / 2 - radius, getHeight() / 2 - radius, 2 * radius, 2 * radius);

}

        public void moveLeft(){

            this.add(this, BorderLayout.WEST);
            this.repaint();
        }


}

код слушателя действия:

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

class Lab2MoveBallListener implements ActionListener{


public void actionPerformed(ActionEvent e){
    this.moveLeft();
}
}

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

Ответы [ 3 ]

3 голосов
/ 31 января 2012

Я не совсем уверен, что понимаю, что должен делать этот графический интерфейс, но это работает для перемещения круга влево.Пункты 3) и 4) моего комментария все еще нуждаются в рассмотрении.

Вот измененный код.

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

public class Lab2 extends JFrame {

Lab2(){
    setTitle("Lab 1b - Application #2");
    Lab2Panel p = new Lab2Panel();
    add(p);
}

public static void main(String[] args){

    Lab2 frame = new Lab2();
    frame.setTitle("Lab2 Application # 1");
    frame.setLocationRelativeTo(null);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(200, 400);
    frame.setVisible(true);
    }

}

class Lab2Panel extends JPanel{
Lab2Button canvas = new Lab2Button();
JPanel panel = new JPanel();

Lab2Panel () {

    setLayout(new BorderLayout());

    JButton leftButton = new JButton("left");
    JButton rightButton = new JButton("right");
    JButton upButton = new JButton("up");
    JButton downButton = new JButton("down");

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

    this.add(canvas, BorderLayout.CENTER);
    this.add(panel, BorderLayout.SOUTH);

    leftButton.addActionListener(new Lab2MoveBallListener(canvas));
}


}

class Lab2Button extends JPanel {
int radius = 5;
int x = -1;
int y = -1;

protected void paintComponent(Graphics g){
    if (x<0 || y<0) {
        x = getWidth() / 2 - radius;
        y = getHeight() / 2 - radius;
    }
    super.paintComponent(g);
    g.drawOval(x,y, 2 * radius, 2 * radius);

}

        public void moveLeft(){

            //this.add(this, BorderLayout.WEST);
            x -= 5;
            this.repaint();
        }


}

class Lab2MoveBallListener implements ActionListener{
    private Lab2Button canvas;

Lab2MoveBallListener(Lab2Button canvas) {
    this.canvas = canvas;
}

public void actionPerformed(ActionEvent e){
    canvas.moveLeft();
}
}

.. как различать кнопкив действии выполнено?

Есть несколько способов.

  1. ActionEvent.getActionCommand() / getSource() с операторами if / else для выбора правильного действия.
  2. Добавить отдельного слушателя к каждой кнопке.Это чаще встречается в реальном мире кода.Нет необходимости получать источник или проверять команду действия.
2 голосов
/ 31 января 2012

это то, что я предложил, надеюсь, это сработает для вас.

Lab2.java

import javax.swing.JFrame;


public class Lab2 extends JFrame
{

    Lab2() 
    {
        setTitle("Lab 1b - Application #2");
        Lab2Panel p = new Lab2Panel();
        add(p);
    }

    public static void main(String[] args)
    {
        Lab2 frame = new Lab2();
        frame.setTitle("lab2 Application # 1");
        frame.setLocationRelativeTo(null);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(300, 400);
        frame.setVisible(true);
    }

}

Lab2Panel.java

import java.awt.BorderLayout;

import javax.swing.JButton;
import javax.swing.JPanel;


public class Lab2Panel extends JPanel
{

    Lab2Button canvas = new Lab2Button();
    JPanel panel = new JPanel();

    Lab2Panel()
    {
        setLayout(new BorderLayout());

        JButton leftButton = new JButton("left");
        JButton rightButton = new JButton("right");
        JButton upButton = new JButton("up");
        JButton downButton = new JButton("down");

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

        this.add(canvas, BorderLayout.CENTER);
        this.add(panel, BorderLayout.SOUTH);

        leftButton.addActionListener(new Lab2MoveBallListener(canvas));
        rightButton.addActionListener(new Lab2MoveBallListener(canvas));
        upButton.addActionListener(new Lab2MoveBallListener(canvas));
        downButton.addActionListener(new Lab2MoveBallListener(canvas));

    }

}

Lab2MoveBallListener.java

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;


public class Lab2MoveBallListener implements ActionListener
{
    private Lab2Button canvas;

    public Lab2MoveBallListener(Lab2Button canvas)
    {
        this.canvas = canvas;

    }

    @Override
    public void actionPerformed(ActionEvent e)
    {
        if (e.getActionCommand().equals("left"))
        {
            canvas.moveLeft();
        }

        if (e.getActionCommand().equals("right"))
        {
            canvas.moveRight();
        }

        if (e.getActionCommand().equals("up"))
        {
            canvas.moveTop();           
        }

        if (e.getActionCommand().equals("down")) 
        {
            canvas.moveDown();
        }

    }

}

Lab2Button.java

import java.awt.Graphics;

import javax.swing.JPanel;


public class Lab2Button extends JPanel
{
    int radius = 5;
    int x = -1;
    int y = -1;

    protected void paintComponent(Graphics g) 
    {
        if (x < 0 || y < 0) 
        {
            x = getWidth() / 2 - radius;
            y = getHeight() / 2 - radius;
        }
        super.paintComponent(g);
        g.drawOval(x, y, 2 * radius, 2 * radius);
    }

    public void moveLeft()
    {
        x -= 5;
        this.repaint();
    }

    public void moveRight()
    {
        x += 5;
        this.repaint();
    }

    public void moveTop()
    {
        y -= 5;
        this.repaint();
    }

    public void moveDown()
    {
        y += 5;
        this.repaint();
    }

}
2 голосов
/ 31 января 2012

Я думаю, что вы запутались с ключевым словом "this". Следующее может приблизить вас к тому, что вы хотите.

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

public class Lab2Panel extends JPanel
{
   Lab2Button canvas = new Lab2Button();
   JPanel panel = new JPanel();

   Lab2Panel () 
   {
      setLayout(new BorderLayout());

      JButton leftButton = new JButton("left");
      JButton rightButton = new JButton("right");
      JButton upButton = new JButton("up");
      JButton downButton = new JButton("down");

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

      this.add(canvas, BorderLayout.CENTER);
      this.add(panel, BorderLayout.SOUTH);

      leftButton.addActionListener(new ActionListener()
      {
         public void actionPerformed(ActionEvent e)
         {
             Lab2Panel.this.remove(canvas);
             Lab2Panel.this.add(canvas, BorderLayout.WEST);
             Lab2Panel.this.repaint();
         }
      });
   }
}
...