#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;} }