创建了一个类似于paint的程序,其中有一个矩形,其在屏幕内的移动可以通过“w,a,s,d”键控制,其大小可以使用鼠标上的滚动条增减。还有几个不同颜色的按钮,当按下时,这些按钮会用各自的颜色填充矩形形状。现在的问题是,点击任何颜色按钮后,移动停止,即矩形不移动。你可以增加和减少它的大小,但你不能移动与“w,a,s,d”键。请帮帮我。
作为一个可选的要求,我也尝试用这个矩形来作画,当我按下空格键时,我想填充指定区域所选的颜色。即使我能做到。我做的下一个动作是:要么按“w,a,s,d”键,要么按滚动条,颜色消失。现在我知道必须以某种方式保存colour或fillrect(),以便下一个操作不会影响它,但我尝试了几种方法,但都没有实现。我已经为下面的画注解了代码。
我的第一个请求是我的主要请求,第二个请求如果你不能理解我的意思或者不知道解决方法,就离开它。
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class Animation extends Frame implements KeyListener,MouseWheelListener,ActionListener {
int x,y,a,b;
char choice1;
int draw=1;
int n=0;
int color1,color2,color3;
Button button1,button2,button3,button4,button5,button6,button7,button8,button9,button10;
Animation() {
setSize(1000, 1000);
setVisible(true);
x = 500;
y = 500;
a = 20;
b = 50;
addKeyListener(this);
addMouseWheelListener(this);
JFrame frame = new JFrame();
frame.getContentPane().setLayout(null);
button1 = new Button("Black");
button2 = new Button("Blue");
button3 = new Button("Green");
button4 = new Button("Orange");
button5 = new Button("Red");
button6 = new Button("Yellow");
button7 = new Button("Gray");
button8 = new Button("Cyan");
button9 = new Button("Magenta");
button10 = new Button("Pink");
add(button1);add(button2);add(button3);add(button4);add(button5);
add(button6);add(button7);add(button8);add(button9);add(button10);
button1.setBounds(50,680,50,20); button2.setBounds(120,680,50,20);
button3.setBounds(190,680,50,20); button4.setBounds(260,680,50,20);
button5.setBounds(330,680,50,20); button6.setBounds(400,680,50,20);
button7.setBounds(470,680,50,20); button8.setBounds(540,680,50,20);
button9.setBounds(610,680,50,20); button10.setBounds(680,680,50,20);
button1.addActionListener(this);button2.addActionListener(this);
button3.addActionListener(this);button4.addActionListener(this);
button5.addActionListener(this);button6.addActionListener(this);
button7.addActionListener(this);button8.addActionListener(this);
button9.addActionListener(this);button10.addActionListener(this);
addWindowListener(new WindowListener() {
@Override
public void windowOpened(WindowEvent e) {
}
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
@Override
public void windowClosed(WindowEvent e) {
}
@Override
public void windowIconified(WindowEvent e) {
}
@Override
public void windowDeiconified(WindowEvent e) {
}
@Override
public void windowActivated(WindowEvent e) {
}
@Override
public void windowDeactivated(WindowEvent e) {
}
});
}
@Override
public void keyTyped(KeyEvent e) {
}
@Override
public void keyPressed(KeyEvent e) {
}
@Override
public void keyReleased(KeyEvent e) {
choice1 = e.getKeyChar();
if (choice1 == 'w') {
y = y - 10;
}
if (choice1 == 's') {
y = y + 10;
}
if (choice1 == 'a') {
x = x - 10;
}
if (choice1 == 'd') {
x = x + 10;
}
if(choice1 == ' '){
draw=2;
}
repaint();
}
@Override
public void mouseWheelMoved(MouseWheelEvent e) {
double p = e.getPreciseWheelRotation();
if(p>0){
a=a+5;
b=b+5;
} else{
a=a-5;
b=b-5;
}
repaint();
}
@Override
public void actionPerformed(ActionEvent e) {
if(e.getActionCommand().equals("Black")){
color1 = 0;
color2 = 0;
color3 = 0;
}
if(e.getActionCommand().equals("Blue")){
color1 = 0;
color2 = 0;
color3 = 255;
}
if(e.getActionCommand().equals("Green")){
color1 = 0;
color2 = 255;
color3 = 0;
}
if(e.getActionCommand().equals("Orange")){
color1 = 255;
color2 = 165;
color3 = 0;
}
if(e.getActionCommand().equals("Red")){
color1 = 255;
color2 = 0;
color3 = 0;
}
if(e.getActionCommand().equals("Yellow")){
color1 = 255;
color2 = 255;
color3 = 0;
}
if(e.getActionCommand().equals("Gray")){
color1 = 169;
color2 = 169;
color3 = 169;
}
if(e.getActionCommand().equals("Cyan")){
color1 = 0;
color2 = 255;
color3 = 255;
}
if(e.getActionCommand().equals("Magenta")){
color1 = 255;
color2 = 0;
color3 = 255;
}
if(e.getActionCommand().equals("Pink")){
color1 = 255;
color2 = 192;
color3 = 203;
}
repaint();
}
public void paint(Graphics g) {
if(draw==1) {
g.drawRect(x, y, a, b);
g.setColor(new Color(color1,color2,color3));
g.fillRect(x,y,a,b);
}
// if(draw==2){
// fillColor(g);
// draw=1;
// }
}
// public void fillColor(Graphics g){
// g.setColor(Color.red);
// int[] temp1 = new int[50];
// temp1[n] = x;
// int[] temp2 = new int[50];
// temp2[n] = y;
// int[] temp3 = new int[50];
// temp3[n] = a;
// int[] temp4 = new int[50];
// temp4[n] = b;
//
//
// n++;
// for (int i=0;i<n;i++){
// System.out.println("abcd");
// g.fillRect(temp1[n],temp2[n],temp3[n],temp4[n]);
// }
//
// }
public static void main(String[] args) {
Animation animation = new Animation();
}
}
2条答案
按热度按时间xienkqul1#
第一个简短的回答。添加:
vtwuwzda2#
首先是基本的设计问题:
不要延伸框架。没有必要扩展任何类。
不要在swing应用程序中使用awt组件。
JFrame
是秋千。”按钮“是awt。你的秋千应该用JButton
.不要对整个框架使用空布局。保留默认的边框布局。阅读swing教程中有关如何使用borderlayout的部分。
对于按钮,您应该创建一个jpanel(默认情况下使用flowlayout)并将按钮添加到此面板。
然后使用以下方法将此面板添加到框架中:
定制绘画是通过扩展
JPanel
然后你覆盖了paintComponent(...)
方法。所以你需要创建一个DrawingPanel
画你的矩形。阅读有关自定义绘制的swing教程中的工作示例,以帮助您更好地构建代码。然后使用以下方法将绘图面板添加到框架:
不要使用windowlistener关闭框架。
创建框架时,可以设置“关闭”属性:
像在actionlistner中那样使用多个嵌套的if语句是糟糕的设计。当您继续支持更多的颜色时,代码就会不断增长。另一种方法可能是:
a) 创建一个hashmap作为示例变量,以包含按钮和颜色:
b) 现在,当您创建每个按钮时,您可以更新哈希Map:
c) 现在,actionlistener中的代码变成:
d) paintcomponent()方法中的代码变成:
不要用暴力制作你的按钮。创建一个方法。
调用方法的代码
以及
createButton(..)
方法类似于:这里有很多建议。代码是在没有测试的情况下发布的,所以要理解每个概念,一次修改一个,并进行测试以确保正确实现每个步骤。
现在的问题是,点击任何颜色按钮后,移动停止,即矩形不移动。
keyevent只传递给具有焦点的组件。当你点击一个按钮时,绘画面板会失去焦点,不再对事件做出React。
更好的解决办法是使用
Key Bindings
. 即使组件没有焦点,键绑定也可以工作。有关更多信息和工作示例,请参见:使用键盘的运动。