Использование переменной с paintComponent - PullRequest
1 голос
/ 02 июля 2011

Для домашнего задания я пытаюсь нарисовать поле с 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);
  }
}

РЕДАКТИРОВАТЬ

С момента публикации здесь я попытался использовать метод setter внутри класса NewPanel

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

Запуск этого приводит к странной ошибке, которую я никогда раньше не видел: я получаю ошибку StackOverFlow, и затем диалоговое окно всплывает несколько / сотни раз и не перестает появляться.

РЕДАКТИРОВАТЬ 3 Используя решение Hovercraft Full Of Eels, я получил его на работу! Спасибо, Full 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);
    }

}

Ответы [ 2 ]

6 голосов
/ 02 июля 2011

Так же, как и в более базовых Java-классах, вы часто используете методы мутатора и метода доступа, также известные как сеттеры и геттеры, для изменения состояния объекта.В вашей ситуации вам нужно предоставить классу NewPanel метод setter , public void setXCoor(int x) {...} и, возможно, аналогичный метод для yCoord, если необходимо, чтобы внешние классы (графический интерфейс, который содержит объект NewPanel) могли изменятьЦенности NewPanel.После изменения xCoord вы захотите вызвать repaint () для того же объекта NewPanel, чтобы JVM мог вызывать его метод paintComponent для отображения эффектов измененного значения xCoord.

Edit 1
Также вопрос: почему ваш класс Problem3 расширяет JFrame?Здесь это кажется ненужным.

Edit 2
Кроме того, я бы не делал этот код в основном методе:

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."));
}

Я бы не стал вводить пользователя на чертежеучебный класс.Вместо этого я бы использовал метод установки true метод установки, похожий на тот, который, я уверен, вы делали много раз до этого, и в такой форме:

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

Затем сделайте ваш пользовательвзаимодействие, будь то JOptionPane или что-то в основном графическом интерфейсе или в другом месте вашей программы.Как только пользователь введет свои данные, вызовите метод setter выше для вашей переменной NewPanel, передавая пользовательский ввод (как, конечно, int).

Edit 4

Относительно этого кода:

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

    NewPanel.setX(50); 
}

Вы вызываете метод setX для класса NewPanel, а не для объекта NewPanel, поэтому компилятор соответствующим образом жалуется.Вот почему я предложил в одном из моих редакторов выше создать переменную NewPanel в вашем классе GUI, создать графический интерфейс в конструкторе класса GUI, а не в методе main (который должен в основном вызывать конструктор класса GUI), и использоватьта же самая переменная NewPanel для помещения в JFrame GUI и для вызова метода setX (...).

1 голос
/ 27 октября 2012
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);

    }

}
...