#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. См. Также Начальные потоки .