单击按钮时移动卡住

drnojrws  于 2021-07-03  发布在  Java
关注(0)|答案(2)|浏览(432)

创建了一个类似于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();

    }

}
xienkqul

xienkqul1#

第一个简短的回答。添加:

button1.setFocusable(false);
    button2.setFocusable(false);
    button3.setFocusable(false);
    button4.setFocusable(false);
    button5.setFocusable(false);
    button6.setFocusable(false);
    button7.setFocusable(false);
    button8.setFocusable(false);
    button9.setFocusable(false);
    button10.setFocusable(false);
vtwuwzda

vtwuwzda2#

首先是基本的设计问题:
不要延伸框架。没有必要扩展任何类。
不要在swing应用程序中使用awt组件。 JFrame 是秋千。”按钮“是awt。你的秋千应该用 JButton .
不要对整个框架使用空布局。保留默认的边框布局。阅读swing教程中有关如何使用borderlayout的部分。
对于按钮,您应该创建一个jpanel(默认情况下使用flowlayout)并将按钮添加到此面板。
然后使用以下方法将此面板添加到框架中:

frame.add(buttonPanel, BorderLayout.PAGE_END);

定制绘画是通过扩展 JPanel 然后你覆盖了 paintComponent(...) 方法。所以你需要创建一个 DrawingPanel 画你的矩形。阅读有关自定义绘制的swing教程中的工作示例,以帮助您更好地构建代码。
然后使用以下方法将绘图面板添加到框架:

frame.add(drawingPanel, BorderLayout.CENTER):

不要使用windowlistener关闭框架。
创建框架时,可以设置“关闭”属性:

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

像在actionlistner中那样使用多个嵌套的if语句是糟糕的设计。当您继续支持更多的颜色时,代码就会不断增长。另一种方法可能是:
a) 创建一个hashmap作为示例变量,以包含按钮和颜色:

private HashMap<JButton, Color> buttonColors = new HashMap<>();
private Color rectangleColor = Color.BLACK;

b) 现在,当您创建每个按钮时,您可以更新哈希Map:

buttonColors.put(button1, Color.BLACK);

c) 现在,actionlistener中的代码变成:

JButton button = (JButton)e.getSource();
Color color = buttonColors.get(button);
rectangleColor = color;
repaint();

d) paintcomponent()方法中的代码变成:

//g.setColor(new Color(color1,color2,color3));
g.setColor( rectangleColor );

不要用暴力制作你的按钮。创建一个方法。
调用方法的代码

buttonsPanel.add( createButton("Black", Color.BLACK) );
buttonsPanel.add( createButton("Blue", Color.BLUE) );

以及 createButton(..) 方法类似于:

public JButton (String text, Color color)
{
    JButton button = new JButton( text );
    button.addActionListener(this);
    buttonColors.put(button, color);

    return button;
}

这里有很多建议。代码是在没有测试的情况下发布的,所以要理解每个概念,一次修改一个,并进行测试以确保正确实现每个步骤。
现在的问题是,点击任何颜色按钮后,移动停止,即矩形不移动。
keyevent只传递给具有焦点的组件。当你点击一个按钮时,绘画面板会失去焦点,不再对事件做出React。
更好的解决办法是使用 Key Bindings . 即使组件没有焦点,键绑定也可以工作。有关更多信息和工作示例,请参见:使用键盘的运动。

相关问题