Переменные доступа из другого класса в java

#java #swing #class #object #jframe

#java #swing #класс #объект #jframe

Вопрос:

Я пытаюсь написать то, что должно быть очень простым проектом на Java. Я пытаюсь создать 2 класса, где основной выполняет метод в классе 2 для создания нового объекта JFrame. Затем основной класс завершает метод в классе 2, чтобы установить значения 2 переменных. Затем на панели JFrame должна быть напечатана строка с заданными значениями x и y. Однако, это как если бы xPos и YPO не были изменены, а строка печатается с 0,0.

Это код:

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

public class Test {
        public static void main(String[] args){
                Class2 obj = new Class2();
                obj.createJFrame();
                obj.setVal(100, 200);
        }
}

class Class2 extends JPanel{
        private int xPos, yPos;
        public void createJFrame(){
                JFrame window = new JFrame();
                Class2 obj2 = new Class2();
                window.setVisible(true);
                window.setSize(300, 300);
                window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                Container c = window.getContentPane();
                c.add(obj2);
        }
        public void setVal(int x, int y){
                xPos = x;
                yPos = y;
                repaint();
        }
        public void paintComponent(Graphics g){
                super.paintComponent(g);
                g.drawString("This string should be at 100, 200", xPos, yPos);
        }
}
 

В качестве примечания, я не думаю, что мой заголовок точен, поэтому было бы здорово, если бы кто-нибудь мог мне помочь, отредактировав заголовок. Извините, если заголовок не соответствует вопросу, но я новичок в Java. Кроме того, эта программа моделирует более сложную программу, поэтому, если этот метод кажется неэффективным из-за косвенности, это потому, что более сложная программа будет использовать подобную структуру. Заранее благодарю вас.

Ответ №1:

 class Class2 extends JPanel{
        private int xPos, yPos;
        public void createJFrame(){
                JFrame window = new JFrame();
                // Class2 obj2 = new Class2();
                window.setVisible(true);
                window.setSize(300, 300);
                window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                Container c = window.getContentPane();
                c.add(this); // now the setValue will update the object
        }
...
 

Вы не обновляли объект, который был добавлен в JFrame. В качестве исключения я бы создал JFrame в статическом методе или другом классе и использовал Class2 в качестве аргумента. Что-то вроде:

 class Class2 extends JPanel{
    private int xPos, yPos;
    public static void createJFrame(Class2 obj){
            JFrame window = new JFrame();
            window.setVisible(true);
            window.setSize(300, 300);
            window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            Container c = window.getContentPane();
            c.add(obj);
    }
    public void setVal(int x, int y){
            xPos = x;
            yPos = y;
            repaint();
    }
    public void paintComponent(Graphics g){
            super.paintComponent(g);
            g.drawString("This string should be at 100, 200", xPos, yPos);
    }
 }

public class Test {
   public static void main(String[] args){
         Class2 obj = new Class2();
         obj.setVal(100, 200);
         Class2.createJFrame(obj);
   }
}
 

Комментарии:

1. спасибо, это работает. Я не узнал об использовании объектов в качестве параметров, но первый по-прежнему работает нормально. Я уверен, что как только я узнаю о втором методе, это будет иметь смысл и будет лучше. На данный момент, однако, первый метод работает очень хорошо.

2. См. Также Начальные потоки .