Добавление объектов в JFrame из другого класса?

#java #arrays

#java #массивы

Вопрос:

Я пытаюсь создать программу blackjack для моего окончательного проекта на Java. Я все еще новичок в Java и OOD, поэтому прошу прощения, если моя проблема кажется вам очень тривиальной : (

Как работает моя программа: пока у меня есть три класса.

main.java Этот класс создает мой фрейм и запускает все остальные методы.

cards.java Этот класс создает массив, содержащий значения карт и расположение к изображению. У меня там есть цикл for, который автоматически заполняет его.

попадает.java Этот класс предназначен для «случайной» генерации числа, которое будет представлять выбранную карточку. Способ, которым это работает, заключается в том, что мы берем случайно созданный int и указываем ему на соответствующее местоположение индекса в массиве.

Я присваиваю значение объектам string, которые затем пытаюсь добавить в jlabel, а затем добавляю эту jlabel в свой основной фрейм. Код выглядит следующим образом:

hits.java

 // Import necessary classes.
import java.util.Random;

public class hits {
// Create random object.
Random rand = new Random();

// Declare variables.
int card;
String cardVal, cardPic;

// Instantiate the needed classes.
main s = new main();
cards t = new cards();

// Constructor for the class.
public hits() {
    // Randomly generate a number (0 - 9).
    card = rand.nextInt(10);

    // Populate the array.
    t.runCards();

    // Assign the cards according to the num. generated.
    cardVal = t.deck[card][0];
    cardPic = t.deck[card][1];
}
// Run Method
public void runHits() {
    // Add the card chosen to the GUI.
    s.a.setText("hello");
    s.dealerCards.add(s.a);
}
}
  

У меня есть «hello» в качестве текста для метки, потому что я хотел посмотреть, возможно, мой массив не заполняется, но даже это не работает. Если это поможет, вот мойmain.java также (конструктор и основной метод):

 // Constructor for the main class.
public main() {
    // Setup the MAIN container.
    f1.getContentPane().setLayout(new GridLayout(0, 1));
    f1.setSize(200, 200);
    f1.add(dealerName);
    f1.add(dealerCards);
    f1.add(userCards);
    f1.add(userName);

    // Setup the inner panels.
    dealerCards.setLayout(new GridLayout(1, 2));
    dealerCards.add(b);
    userCards.setLayout(new GridLayout(1, 6));
    userCards.add(c);
    userCards.add(d);
}
// Build the frame.
public void GUILaunch() {
    // Display Frame
    f1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    f1.setVisible(true);
}
// Main method.
 public static void main(String args[]) {
     // Distribute the dealer's/player's starting hands.
     hits deal = new hits();
     deal.runHits();

     // Launch the GUI
     main gui = new main();
     gui.GUILaunch();
}
  

Надеюсь, я предоставил достаточно информации, чтобы помочь вам понять, что здесь происходит. Итак, подводя итог: как я могу добавить свою jlabel (из другого класса), содержащую случайно выбранную карту, в мой основной фрейм

Заранее спасибо.

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

1. что это за a атрибут, на который вы ссылаетесь вот так: s.a.setText("hello"); ? Я что-то упускаю?

2. это название моей JLabel … извините, вы не смогли его увидеть; я объявил его в своем основном классе

3. пожалуйста, изучите соглашения об именовании Java и придерживайтесь их

4. @kleopatra уже сделала .. это имя просто temp. ваши ответы не очень помогают, поэтому, пожалуйста, даже не утруждайте себя…..

5. я беспокоюсь или нет — это не ваше решение 😉 Для вашего долгосрочного успеха здесь вам лучше играть по норме

Ответ №1:

Deal.runHits() добавляет метку к основному объекту, которым владеет deal, а не к объекту gui.

Я бы предложил следующее :

Создайте в вашем основном классе экземпляр hits, а в hits — экземпляр объекта cards… итак, вы получаете что-то вроде этого

 public class main {

private hits hits_instance

//constructor

main(){ hits_instance = new hits(); }

//this method will add your cards

public void addCards(){
// frame = whatever frame you are using
frame.add(hits_instance.getCards());

}

}

public class hits {

private cards cards_instance;

hits(){ cards_instance= new cards();}

public JLabel getCards() {return cards_instance.getCard(randomNumber);}
}
  

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

1. Да, это сработало, добавив его во фрейм изнутри основного класса. К сожалению, что-то не работает с моим массивом и в нем не отображаются значения… но, по крайней мере, я вижу, что там появляется строка. Спасибо за вашу помощь. 🙂

2. последний вопрос… таким образом, я никак не могу установить значение объекта swing из другого класса… нравится то, чего я пытался достичь?

3. попробуйте отправить объект JSwing, с которым вы хотите работать, либо в качестве параметра в методе, либо в конструкторе.. public void addJLabel(фрейм JFrame) {frame.add(label1);} общедоступный класс class1 { частный JFrame frame_to_work_with; class1 (фрейм JFrame) {frame_to_work_with=frame;} }