如何将圆圈移动到“WEST”边框布局框架?

时间:2012-01-31 02:02:26

标签: java swing layout layout-manager

这是文件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 个答案:

答案 0 :(得分:3)

我不确定我是否理解这个GUI应该做什么,但这可以将圆圈向左移动。要点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();
}
}

  

..如何区分所执行动作中的按钮?

有很多方法。

    使用if / else语句
  1. ActionEvent.getActionCommand() / getSource()选择正确的操作。
  2. 为每个按钮添加单独的侦听器。这在现实世界的代码中更常见。无需获取源或检查操作命令。

答案 1 :(得分:2)

我认为你对“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();
         }
      });
   }
}

答案 2 :(得分:2)

这是我的建议,希望它适合你。

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();
    }

}