Как изменить текст в JTextArea, когда я нажимаю кнопку?
Я пытаюсь создать игру "Выбери свое приключение", где, когда я нажимаю кнопку, текст меняется на нужную сцену. Тем не менее, в строке 71, когда я пытаюсь установить текст TextArea, он говорит "Исключение в потоке"AWT-EventQueue-0" java.lang.Error: Неразрешенная проблема компиляции: adventureArea не может быть решена". Помогите, пожалуйста?!
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.Border;
public class TheGame extends JPanel implements ActionListener{
/**
* @param args
*/
private int numClicks1 = 0;
private int numClicks2 = 0;
String gameText = "You wake up in the morning feeling like a sir. As is tradition, you need electronics of any kind to keep your mind running (going outside is out of the question. Nothing exciting in the real world). There are many options available to you, but the internet and games are the ones that appeal the most. Do you want to surf the web or use an app?";
private static final long serialVersionUID = 1L;
JButton option1;
JButton option2;
public TheGame(){
JPanel buttonPane = new JPanel(new BorderLayout(1,1));
JPanel textPane = new JPanel(new BorderLayout(1,1));
option1 = new JButton("Click here for teh interwebs");
option1.addActionListener(this);
option1.setPreferredSize(new Dimension(300, 50));
option1.setVisible(true);
option2 = new JButton("Click here for teh entertainments");
option2.addActionListener(this);
option2.setPreferredSize(new Dimension(300, 50));
option2.setVisible(true);
JTextArea adventureArea = new JTextArea();
adventureArea.setFont(new Font("Serif", Font.PLAIN, 16));
adventureArea.setLineWrap(true);
adventureArea.setWrapStyleWord(true);
adventureArea.setEditable(true);
adventureArea.setText(gameText);
JScrollPane adventureScroll = new JScrollPane(adventureArea);
adventureScroll.setPreferredSize(new Dimension(350, 350));
adventureScroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
Border adventureSpace = BorderFactory.createEmptyBorder(0,10,10,10);
Border adventureBorder = BorderFactory.createTitledBorder(adventureSpace, "TECHNOLOGY!!!");
adventureScroll.setBorder(adventureBorder);
adventureScroll.setVisible(true);
textPane.add(adventureScroll, BorderLayout.CENTER);
buttonPane.add(option1,BorderLayout.NORTH);
buttonPane.add(option2,BorderLayout.SOUTH);
add(buttonPane, BorderLayout.SOUTH);
add(textPane, BorderLayout.CENTER);
setVisible(true);
buttonPane.setVisible(true);
textPane.setVisible(true);
}
@Override
public void actionPerformed(ActionEvent e) {
if(e.getSource()==option1){
//numClicks1++;
//gameText="The internet: A wondrous place full of knowledge, videos, stories, memes, and everything else. Like every place, it has a dark and a light side. Where go?";
adventureArea.append("The internet: A wondrous place full of knowledge, videos, stories, memes, and everything else. Like every place, it has a dark and a light side. Where go?");
}else if (e.getSource()==option2){
numClicks2++;
};
/* if(numClicks1==1){
gameText="The internet: A wondrous place full of knowledge, videos, stories, memes, and everything else. Like every place, it has a dark and a light side. Where go?";
}else if (numClicks2==1){
};*/
}
private static void createAndShowGUI() {
JFrame frame = new JFrame("The Game");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
TheGame theContentPane = new TheGame();
theContentPane.setOpaque(true);
frame.setContentPane(theContentPane);
JFrame.setDefaultLookAndFeelDecorated(true);
frame.pack();
frame.setSize(800, 600);
frame.setVisible(true);
}
public static void main(String[] args) {
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
}
}
1 ответ
Решение
Это просто потому что adventureArea
является локальным полем вашего конструктора, а не членом вашего класса.
Вместо этого ниже декларации JButton option2;
добавлять private final JTextArea adventureArea;
И в вашем конструкторе TheGame
, вместо JTextArea adventureArea = new JTextArea();
замени это this.adventureArea = new JTextArea();
Побочные примечания:
- Никогда не используйте
setPreferredSize()
вместо этого используйте соответствующийLayoutManager
или дать подсказки о том, чего вы пытаетесь достичь. Например, ваши кнопки могут быть размещены внутриJPanel
сGridLayout
(чтобы они оба получили одинаковый размер), а затем вы помещаете эту панель наSOUTH
изBorderLayout
, ДляJTextArea
укажите желаемое количество строк и столбцов (например, 24 строки на 80 столбцов):new JTextArea(24, 80);
, Это автоматически распространяется на область прокрутки и, в свою очередь, на родительское окно. - Старайтесь правильно делать отступы в своем коде, это позволяет избежать глупых ошибок и значительно упрощает чтение кода другими.
- Не называйте оба
frame.pack();
а такжеframe.setSize(800, 600);
последний победит. благоприятствоватьpack()
надsetSize()
, - Все компоненты видны по умолчанию, не нужно вызывать
setVisible(true)
на них. Только контейнер верхнего уровня (Windows) должен быть явно видимым.