1

对于家庭作业,我正在尝试paintComponent使用用户输入的变量来绘制一个框。我已经能够使用固定数字构建我需要做的事情。我整天都在做这件事,一直没能找到实现变量的方法。这是我正在研究的精简版:

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

public class Problem3 extends JFrame{

  public static void main(String[] args) {  
    int xCoord = Integer.parseInt(
            JOptionPane.showInputDialog("Enter an X cord."));

    JFrame gd = new JFrame();
    gd.setLocationRelativeTo(null);
    gd.setSize(300, 300);
    gd.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    gd.setVisible(true);

    gd.add(new NewPanel());   
  }

  public int getX(){
    return xCoord;
  }
}

class NewPanel extends JPanel {

  int xCoord = getX();

  protected void paintComponent(Graphics g){
    super.paintComponent(g);

    g.drawRect(10,10,xCoord,50);
  }
}

编辑

自从在这里发布以来,我尝试在 NewPanel 类中使用 setter 方法

public void setX() {
    xCoord = Integer.parseInt(
            JOptionPane.showInputDialog("Enter an X cord."));
}

运行这会导致我以前从未见过的奇怪错误:我收到 StackOverFlow 错误,然后对话框弹出多次/数百次并且不会停止弹出。

编辑 3使用充满鳗鱼的气垫船解决方案,我让它工作了!感谢 Full Of Eels 的时间、帮助和耐心。

public class Problem3 extends JFrame{
    public static void main(String[] args) {  

        JFrame gd = new JFrame();
        gd.setLocationRelativeTo(null);
        gd.setSize(300, 300);
        gd.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        gd.setVisible(true);

        NewPanel panel = new NewPanel();

        panel.setX(50); 
        gd.add(panel);
    } 
}
class NewPanel extends JPanel {

    int xCoord;

    public void setX(int x){
        xCoord = x;
    }

    public int getX(){
        return xCoord;
    }

    protected void paintComponent(Graphics g){
        super.paintComponent(g);

        g.drawRect(10,10,xCoord,50);
    }

}
4

2 回答 2

6

就像更基本的 Java 类一样,您经常使用 mutator 和 accessor 方法(也称为 setter 和 getter)来更改对象的状态。在您的情况下,您需要为 NewPanel 类提供一个setter方法,public void setXCoor(int x) {...}如果需要,可能为 yCoord 提供类似的方法,以便外部类(包含 NewPanel 对象的 GUI)可以更改 NewPanel 的值。更改 xCoord 后,您需要在同一个 NewPanel 对象上调用 repaint(),以便 JVM 可以调用其 paintComponent 方法,以显示更改后的 xCoord 值的效果。

编辑 1
还有一个问题:为什么您的 Problem3 类扩展了 JFrame?这里似乎没有必要。

编辑 2
另外,我不会在 main 方法中执行此代码:

int xCoord = Integer.parseInt(
        JOptionPane.showInputDialog("Enter an X cord."));

JFrame gd = new JFrame();
gd.setLocationRelativeTo(null);
gd.setSize(300, 300);
gd.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
gd.setVisible(true);

gd.add(new NewPanel()); 

而是在一个成熟类的构造函数中。

此外,我会给该类一个 NewPanel 类字段,并将该字段持有的对象放入 JFrame 中,这样我就可以引用 NewPanel 对象,这样我就可以在类的其他地方调用它的方法。

编辑 3
关于此代码:

public void setX() {
    xCoord = Integer.parseInt(
            JOptionPane.showInputDialog("Enter an X cord."));
}

我不会在绘图类中进行用户输入。相反,我将 setter 方法设置为真正的setter 方法,类似于我确信您之前以这种形式多次使用的方法:

public void setX(int xCoord) {
   // set your field in here like you always do
}

然后进行用户交互,无论是 JOptionPane 还是主 GUI 或程序其他地方的任何东西。一旦用户给出他的输入,然后在传入用户输入的 NewPanel 变量上调用上面的 setter 方法(当然是 int)。

编辑 4

关于这段代码:

public static void main(String[] args) {
    // ....
    gd.add(new NewPanel());   

    NewPanel.setX(50); 
}

您在 NewPanel 类上调用 setX 方法,而不是在 NewPanel 对象上,这就是编译器适当抱怨的原因。这就是为什么我在上面的一个编辑中建议在你的 GUI 类中创建一个 NewPanel 变量,在 GUI 类的构造函数中创建你的 GUI,而不是在 main 方法(应该主要调用 GUI 类的构造函数),并使用将相同的 NewPanel 变量放入 GUI 的 JFrame 并调用 setX(...) 方法。

于 2011-07-02T03:34:52.433 回答
1
import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;


public class BerksSnakeMain extends JPanel{
    int xCoord;

    public void berk() {
        xCoord = Integer.parseInt(
            JOptionPane.showInputDialog("Enter an X cord."));
    }

    public void paintComponent(Graphics g){
    super.paintComponent(g);

    g.setColor(Color.red);
    g.fillOval(xCoord,10,10,10);
  }



    public static void main(String[] args) {

        BerksSnakeMain ad = new BerksSnakeMain();
        ad.berk();
        JFrame frame = new JFrame();
        frame.setSize(800, 600);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
        frame.add(ad);

    }

}
于 2012-10-27T19:52:37.430 回答