2012-01-31 48 views
1

这是文件1(我的导师更喜欢是我们使用单独的文件为每个分机)如何将圆圈移动到“WEST”边框布局框架?

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边框布局。有人能帮助我吗。

+0

不扩展每个类并只扩展actionlistener的原因是什么? – Robert 2012-01-31 02:23:00

+1

比继承更喜欢构图。 *必须*实现'ActionListener',其他可以用其他方式完成。 – 2012-01-31 02:24:53

+0

我不认为我会跟着你。到目前为止,在课堂上我们只创建了这样的类。当我们需要一个按钮时,我们编写一个扩展JButton的类并调用该类的一个实例。 – Robert 2012-01-31 02:28:18

回答

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

..how我按钮之间的区别行动执行?

有很多方法。

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

当你点击一个特定的按钮(左,右,上,下)时,赋值是让我们有一个“球”并将它移动到屏幕上。 – Robert 2012-01-31 02:32:23

+0

我的想法是,我可以使用BorderLayout来移动“球”,当你点击有问题的按钮。 – Robert 2012-01-31 02:33:04

+0

此代码与我的想法很接近,但我需要在“中心”窗格中启动“球”。 – Robert 2012-01-31 02:36:18

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

Lab2Panel.this.remove(canvas)调用画布的特定实例吗? – Robert 2012-01-31 02:33:54

+0

是的,因为canvas是Lab2Panel类中的类范围变量。就Lab2Panel类的给定实例而言,只有一个“画布”,即在Lab2Button canvas = new Lab2Button()行中创建的画布。 – IaD 2012-01-31 04:07:31

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

}