#java #user-interface #methods #method-call
#java #пользовательский интерфейс #методы #метод-вызов
Вопрос:
В попытке привести в порядок свой (очень простой) код пользовательского интерфейса я разделил кнопку и текстовое поле на два отдельных класса, с основным для создания фрейма и запуска. Кнопка должна влиять на содержимое текстового поля при нажатии, поэтому я использовал mouseEvent
. Однако я не могу вызвать метод моего текстового поля, поскольку объект текстового поля хранится в main, поэтому нет объекта, для которого можно использовать метод. Все методы являются общедоступными, а все атрибуты являются частными. Вся помощь приветствуется, спасибо.
Я пытался создать объект public statiic
безрезультатно, я не уверен, есть ли что-то очевидное, чего мне здесь не хватает.
Для контекста mouseEvent
необходимо вызвать метод rename(String)
из объекта текстового поля, известного как tf, в классе gui1
редактировать:
(основной)
public interface gui1{
public static void main(String[] args) {
textfieldobj tf = new textfieldobj("You should press button 1",100,100, 150,20);
buttonObject b = new buttonObject("new button!");
(в классе buttonObject)
public class buttonObject extends JButton implements{
JButton b;
public buttonObject(String text){
JButton b=new JButton(text);
b.setBounds(100,100,60,60);
b.addMouseListener(new MouseListener() {
public void mouseClicked(MouseEvent e) {
tf.setText("You Did It");//problem area
b.setEnabled(false);
(в классе textfield)
public void setText(String newtext) {
text = newtext;
super.setText(newtext);
}
Комментарии:
1. Пожалуйста, приведите несколько примеров кода.
2. Да, извините, я забыл
3. Может быть, добавьте аргумент
buttonObject
и передайте текстовое поле, для которого вы хотите задать текст? Затем вызовите его следующим образомbuttonObject b = new buttonObject("new button!", tf)
4. это выполняется, но кнопка и текстовое поле не имеют диалога и очень малы. Я начинаю думать, что это было бесплодное начинание с самого начала, и я должен держать его в одном классе, как нормальный человек?
5. Просто предложение по стандартному улучшению — имена классов и интерфейсов, а также конструкторы должны начинаться с заглавной буквы («class ButtonObject», «TextFieldObj»), а методы и переменные со строчными буквами («setText», «String text»)
Ответ №1:
textfieldobj
buttonObject
Зачем вы изобретаете все эти колеса? JTextField
и JButton
являются ли классы для представления текстового поля и кнопки, вам не нужно создавать вокруг них ничего не делающие обертки.
Кнопка должна влиять на содержимое текстового поля при нажатии
Это плохой дизайн; вы не хотите, чтобы ваша кнопка должна была знать о текстовом поле; если это так, нет никакого способа использовать указанную кнопку для чего-либо, кроме как изменить это точное текстовое поле.
итак, я использовал MouseEvent .
Да, это то, что нужно использовать. Но, просто .. добавьте слушателя в то место, которое знает как о кнопке, так и о поле. Это может быть main, но это подводит нас к другому вопросу:
public static void main(...
это не место для написания кода. Создайте объект, вызовите для него какой-нибудь метод ‘go’, и это единственная строка, которая должна быть у вашего main. Вы хотите уйти от static
asap, вот как вы это делаете.
Итак, что-то вроде:
public class MainApp {
// frames, layout managers, whatever you need as well
private final JButton switchTextButton;
private final JTextField textField;
public MainApp() {
this.switchTextButton = new JButton("Switch it up!");
this.textField = new JTextField();
// add a panel, add these gui elements to it, etc.
setupListeners();
}
private void setupListeners() {
// hey, we have both the button and the textfield in scope here.
switchTextButton.addActionListener(evt -> {
textField.setText("Hello!");
});
}
}