【发布时间】:2015-07-08 22:23:09
【问题描述】:
我当前的程序允许用户围绕 JFrame 移动一个圆圈,并通过按下 JFrame 底部的 JPanel 中显示的一种颜色来更改其颜色。
我的代码:
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JButton;
import javax.swing.border.Border;
import javax.swing.BorderFactory;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.FlowLayout;
import java.awt.BorderLayout;
import java.awt.GridLayout;
public class SixthProgram
{
public static void main(String[] args)
{
GUI prog=new GUI("SixthProgram");
prog.setBounds(350,250,500,250);
prog.setVisible(true);
}
}
class GUI extends JFrame implements MouseListener, MouseMotionListener
{
JButton button;
JPanel colorPan, color1, color2, color3 ,color4 ,color5;
Color color=Color.BLACK;
int x=3,y=30;
public GUI(String header)
{
super(header);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLayout(new BorderLayout());
maker();
addMouseListener(this);
addMouseMotionListener(this);
add(colorPan, BorderLayout.SOUTH);
}
public void maker()
{
colorPan = new JPanel();
Border raisedbevel = BorderFactory.createRaisedBevelBorder();
Border loweredbevel = BorderFactory.createLoweredBevelBorder();
Border compound = BorderFactory.createCompoundBorder(raisedbevel, loweredbevel);
colorPan.setBorder(compound);
colorPan.setLayout(new GridLayout(1, 0));
color1 = new JPanel();
color2 = new JPanel();
color3 = new JPanel();
color4 = new JPanel();
color5 = new JPanel();
color1.setBackground(Color.WHITE);
color2.setBackground(Color.GREEN);
color3.setBackground(Color.RED);
color4.setBackground(Color.BLUE);
color5.setBackground(Color.BLACK);
colorPan.add(color1);
colorPan.add(color2);
colorPan.add(color3);
colorPan.add(color4);
colorPan.add(color5);
}
@Override
public void paint(Graphics g)
{
//g.setColor(Color.WHITE);
//g.fillRect(0,0,getWidth(),getHeight());
super.paint(g); //Do the same thing as above(Clear jframe)
g.setColor(color);
g.fillOval(x,y,50,50);
}
public void mouseExited(MouseEvent e) //MouseListener overrided methods
{}
public void mouseEntered(MouseEvent e)
{}
public void mouseReleased(MouseEvent e)
{}
public void mousePressed(MouseEvent e)
{
System.out.println("Press");
if(e.getX()+50 < getWidth() && e.getY()+50 < getHeight()) // Preventing out of bounds
{
x=e.getX();
y=e.getY();
repaint();
}
}
public void mouseClicked(MouseEvent e) //Press+Release=Click
{
System.out.println("Click");
if((e.getX()>=8 && e.getX()<=105) && (e.getY()>=232 && e.getY()<=243))
color=Color.WHITE;
else if((e.getX()>=106 && e.getX()<=203) && (e.getY()>=232 && e.getY()<=243))
color=Color.GREEN;
else if((e.getX()>=204 && e.getX()<=301) && (e.getY()>=232 && e.getY()<=243))
color=Color.RED;
else if((e.getX()>=302 && e.getX()<=399) && (e.getY()>=232 && e.getY()<=243))
color=Color.BLUE;
else if((e.getX()>=400 && e.getX()<=489) && (e.getY()>=232 && e.getY()<=243))
color=Color.BLACK;
repaint();
}
public void mouseDragged(MouseEvent e) //MouseMotionListener overrided methods
{
System.out.println("Dragged to ("+ e.getX() +","+ e.getY() +")");
if((e.getX()>=3 && e.getY()>=30) && (e.getX()+50<getWidth() && e.getY()+50<getHeight())) //If circle is dragged in the JFrame
{
x=e.getX();
y=e.getY();
repaint();
}
}
public void mouseMoved(MouseEvent e)
{}
}
上面的代码按预期工作并产生输出:
当我也单击底部 JPanel 中的颜色时,程序会按预期工作并更改圆圈的颜色。
出现的两个问题是:
-
当我调整 JFrame 的大小时,颜色选择器无法按预期工作。这是由于我在
mouseClicked方法中硬编码的愚蠢方式:public void mouseClicked(MouseEvent e) //Press+Release=Click { System.out.println("Click"); if((e.getX()>=8 && e.getX()<=105) && (e.getY()>=232 && e.getY()<=243)) color=Color.WHITE; else if((e.getX()>=106 && e.getX()<=203) && (e.getY()>=232 && e.getY()<=243)) color=Color.GREEN; else if((e.getX()>=204 && e.getX()<=301) && (e.getY()>=232 && e.getY()<=243)) color=Color.RED; else if((e.getX()>=302 && e.getX()<=399) && (e.getY()>=232 && e.getY()<=243)) color=Color.BLUE; else if((e.getX()>=400 && e.getX()<=489) && (e.getY()>=232 && e.getY()<=243)) color=Color.BLACK; repaint(); } - 第二个问题是圆圈可以拖到颜色选择器上。我不知道我应该怎么做才能防止这种情况发生。我可以像对问题 #1 所做的那样对值进行硬编码,但这会产生与问题 #1 相同的问题。
我不希望使用 setResizable(false) 并且 JFrame 可以调整大小。
如何解决上述问题?
【问题讨论】:
-
如果您使用 JButtons 作为颜色而不是直接绘制它们,那应该可以缓解这两个问题
-
在我的开源项目中有一个用于在组件中移动形状的包,您对此感兴趣吗,或者您宁愿自己解决这个问题以获得乐趣?
-
@ControlAltDel,谢谢。我已经用
JButtons替换了那些JPanels。我这样做是为了好玩,为了提高我的挥杆技巧。