最简单的Gui测试Java重绘

最简单的Gui测试Java重绘,java,swing,jpanel,paintcomponent,drawstring,Java,Swing,Jpanel,Paintcomponent,Drawstring,这是一个简单的问题,也许我只是不理解我正在阅读的教程。但我已经在这上面呆了一段时间了。我的程序很简单,因为它远离了“hello world”。我想做的是:当用户点击按钮时,“O”移到右边。很简单,但是我应该把repaint()放在哪里呢?是否需要添加一些内容。重新绘制();重新粉刷屏幕还是自己粉刷?嵌套类问题?这让我很痛苦,似乎没有人有我无法理解的问题。提前谢谢 import java.awt.*; import java.awt.event.*; import javax.swing.*;

这是一个简单的问题,也许我只是不理解我正在阅读的教程。但我已经在这上面呆了一段时间了。我的程序很简单,因为它远离了“hello world”。我想做的是:当用户点击按钮时,“O”移到右边。很简单,但是我应该把repaint()放在哪里呢?是否需要添加一些内容。重新绘制();重新粉刷屏幕还是自己粉刷?嵌套类问题?这让我很痛苦,似乎没有人有我无法理解的问题。提前谢谢

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class GuiTest {

    static int x = 20;

    private static class moveTest extends JPanel {

        public void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.drawString("O", x, 30);
        }
    }

    private static class ButtonHandler implements ActionListener {

        public void actionPerformed(ActionEvent e) {
            x += 1;
        }
    }

    public static void main(String[] args) {
        moveTest displayPanel = new moveTest();
        JButton okButton = new JButton("move");
        ButtonHandler listener = new ButtonHandler();
        okButton.addActionListener(listener);

        JPanel content = new JPanel();
        content.setLayout(new BorderLayout());
        content.add(displayPanel, BorderLayout.CENTER);
        content.add(okButton, BorderLayout.SOUTH);

        JFrame window = new JFrame("GUI Test");
        window.setContentPane(content);
        window.setSize(250, 100);
        window.setLocation(100, 100);
        window.setVisible(true);
    }
}

您需要一个组件来调用上的
repaint()
。最简单的解决方案是调用
repaint()
,如下所示:

((JComponent)e.getSource()).getTopLevelAncestor().repaint();

问题是,
ActionListener
被声明为静态成员类,因此它无法访问封闭类的非静态成员,因为它与封闭类的实例没有关联。通常,我将所有GUI初始化代码放在自己的
JPanel
子类的构造函数中。我还为侦听器使用匿名内部类。只要命名类不是静态的,就可以轻松地使用它们。然后,您可以在侦听器方法中调用JPanel方法。

您需要一个组件来调用
repaint()
。最简单的解决方案是调用
repaint()
,如下所示:

((JComponent)e.getSource()).getTopLevelAncestor().repaint();

问题是,
ActionListener
被声明为静态成员类,因此它无法访问封闭类的非静态成员,因为它与封闭类的实例没有关联。通常,我将所有GUI初始化代码放在自己的
JPanel
子类的构造函数中。我还为侦听器使用匿名内部类。只要命名类不是静态的,就可以轻松地使用它们。然后,您可以在侦听器方法中调用JPanel方法。

考虑让您的
MoveTest
面板导出一个供
GuiTest
按钮使用的方法

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class GuiTest {

    private static class MoveTest extends JPanel {

        private int x = 20;
        private int y = 20;

        @Override
        public void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.drawString("<O>", x, y);
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(256, 128);
        }

        public Action getAction() {
            return new ButtonHandler("Move");
        }

        private class ButtonHandler extends AbstractAction {

            public ButtonHandler(String name) {
                super(name);
            }

            @Override
            public void actionPerformed(ActionEvent e) {
                x += 2;
                y += 1;
                repaint();
            }
        }
    }

    public static void main(String[] args) {
        MoveTest displayPanel = new MoveTest();
        JButton moveButton = new JButton(displayPanel.getAction());

        JFrame window = new JFrame("GUI Test");
        window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        window.add(displayPanel);
        window.add(moveButton, BorderLayout.SOUTH);
        window.pack();
        window.setLocationByPlatform(true);
        window.setVisible(true);
    }
}

import java.awt.*;
导入java.awt.event.*;
导入javax.swing.*;
公共类吉他测试{
私有静态类MoveTest扩展了JPanel{
私有整数x=20;
私人智力y=20;
@凌驾
公共组件(图形g){
超级组件(g);
g、 抽绳(“”,x,y);
}
@凌驾
公共维度getPreferredSize(){
返回新维度(256,128);
}
公共行动{
返回新按钮手柄(“移动”);
}
私有类ButtonHandler扩展了AbstractAction{
公共按钮句柄(字符串名称){
超级(姓名);
}
@凌驾
已执行的公共无效操作(操作事件e){
x+=2;
y+=1;
重新油漆();
}
}
}
公共静态void main(字符串[]args){
MoveTest displayPanel=新的MoveTest();
JButton moveButton=newjbutton(displayPanel.getAction());
JFrame窗口=新JFrame(“GUI测试”);
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
添加(显示面板);
添加(移动按钮,BorderLayout.SOUTH);
window.pack();
window.setLocationByPlatform(true);
window.setVisible(true);
}
}

考虑让您的
MoveTest
面板导出供
GuiTest
按钮使用的

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class GuiTest {

    private static class MoveTest extends JPanel {

        private int x = 20;
        private int y = 20;

        @Override
        public void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.drawString("<O>", x, y);
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(256, 128);
        }

        public Action getAction() {
            return new ButtonHandler("Move");
        }

        private class ButtonHandler extends AbstractAction {

            public ButtonHandler(String name) {
                super(name);
            }

            @Override
            public void actionPerformed(ActionEvent e) {
                x += 2;
                y += 1;
                repaint();
            }
        }
    }

    public static void main(String[] args) {
        MoveTest displayPanel = new MoveTest();
        JButton moveButton = new JButton(displayPanel.getAction());

        JFrame window = new JFrame("GUI Test");
        window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        window.add(displayPanel);
        window.add(moveButton, BorderLayout.SOUTH);
        window.pack();
        window.setLocationByPlatform(true);
        window.setVisible(true);
    }
}

import java.awt.*;
导入java.awt.event.*;
导入javax.swing.*;
公共类吉他测试{
私有静态类MoveTest扩展了JPanel{
私有整数x=20;
私人智力y=20;
@凌驾
公共组件(图形g){
超级组件(g);
g、 抽绳(“”,x,y);
}
@凌驾
公共维度getPreferredSize(){
返回新维度(256,128);
}
公共行动{
返回新按钮手柄(“移动”);
}
私有类ButtonHandler扩展了AbstractAction{
公共按钮句柄(字符串名称){
超级(姓名);
}
@凌驾
已执行的公共无效操作(操作事件e){
x+=2;
y+=1;
重新油漆();
}
}
}
公共静态void main(字符串[]args){
MoveTest displayPanel=新的MoveTest();
JButton moveButton=newjbutton(displayPanel.getAction());
JFrame窗口=新JFrame(“GUI测试”);
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
添加(显示面板);
添加(移动按钮,BorderLayout.SOUTH);
window.pack();
window.setLocationByPlatform(true);
window.setVisible(true);
}
}

您应该能够将其放入
actionPerformed()
方法中。只需重新绘制();?因为那不起作用“不起作用”是什么意思?如果您希望我们帮助您,请提供更多信息,例如错误消息。我使用eclipse,编辑器中的错误消息说它未定义(方法repaint();未为类型GuiTest.ButtonHandler定义)这是否意味着我没有正确导入某些内容…?我还建议从
x
的声明中删除
static
。一般来说,静态字段和方法应该少用。您应该能够将其放入
actionPerformed()
method.just repaint();?因为那不起作用“不起作用”是什么意思?如果您希望我们帮助您,请提供更多信息,例如错误消息。我使用eclipse,编辑器中的错误消息说它未定义(方法repaint();未为类型GuiTest.ButtonHandler定义)这是否意味着我没有正确导入某些内容…?我还建议从
x
的声明中删除
static
。消息