Как изменить текст JLabel и позицию JButton одновременно

Я просто хочу переместить кнопку при нажатии на нее, а также изменить текст ярлыка.

Я написал код для перемещения кнопки, и он отлично работает для меня. Но когда я хочу изменить текст ярлыка на другое имя, этого не происходит.

Либо кнопка перемещается со своего места, либо текст меток изменяется. Но я хочу выполнить оба действия сразу, то есть на событие нажатия кнопки. Я пробовал так много всего, что мог. Может ли кто-то помочь мне?

import java.awt.EventQueue;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class JavaGUI extends JPanel {

    private Control control = new Control();
    private Keys keys = new Keys("Original starting value.");

    public JavaGUI() {        
        this.add(keys);
        this.add(control);
    }

    private class Control extends JPanel {

        public Control() {
            this.add(new JButton(new AbstractAction("Update") {

                @Override
                public void actionPerformed(ActionEvent e) {
                    System.out.println("Command: " + e.getActionCommand());
                    keys.string = String.valueOf(System.nanoTime());
                    //keys.label.setText(keys.string);          
                   //If I remove these comments button will not move. bt I want both...
                    JButton j = (JButton) e.getSource();
            j.setLocation(j.getX()+10,j.getY()+10);
                }
            }));
        }
    }

    private class Keys extends JPanel {

        private String string;
        private JLabel label = new JLabel();

        public Keys(String s) {
            this.string = s;
            label.setText(s);
            this.add(label);
        }
    }

    private void display() {
        JFrame f = new JFrame("JavaGUI");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.add(this);
        f.pack();
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                new JavaGUI().display();
            }
        });
    }
}
1
nl ja de
Я не вижу причин для расширения трех панелей. Просто продолжайте экземпляры.
добавлено автор Andrew Thompson, источник
«весь код очень дорог». Не по вашему вопросу домашнее животное.
добавлено автор Andrew Thompson, источник
Я не могу читать, чтобы читать бормотание текста. Можете ли вы правильно использовать клавишу смены в начале предложений и слов заклинания?
добавлено автор Andrew Thompson, источник
«Может ли кто-нибудь помочь мне?» Неизвестно на этом этапе. Немногие попытаются создать такой нечетный графический интерфейс. У меня на самом деле нет мотивации, чтобы попытаться помочь вам в этом (что это в любом случае - еще один смертельно сломанный GUI-конструктор?), И именно поэтому я сделал комментарий к одному аспекту кода, который выскочил у меня как плохой дизайн.
добавлено автор Andrew Thompson, источник
На самом деле я разрабатываю головоломку 3 * 3. Я хочу добавить часы в игре d. Но при добавлении часов блоки не двигаются. Так вы хотите, чтобы я показал d-код. Если вы скажете, что я отправляю код.
добавлено автор user1952211, источник
Хорошо, ну чувак. У вас есть ответ на мой вопрос.
добавлено автор user1952211, источник
я не могу понять, что значит. можете ли вы объяснить это?
добавлено автор user1952211, источник
весь код очень хорош. Как изменить текст метки с помощью движущейся кнопки.
добавлено автор user1952211, источник

2 ответы

Вам нужно предоставить класс, который содержит JLabel общедоступный метод, который принимает String, и который вызывается, когда другие объекты хотят изменить текст, хранящийся на ярлыке, например:

public void setLabelText(String text) {
   label.setText(text);
}

Тогда любой объект со ссылкой на объект отображения JLabel может легко изменить текст метки.

Что касается вашей движущейся кнопки, вы захотите ознакомиться с менеджерами макетов. JPanels использует FlowLayout по умолчанию, и это не принимает setBounds (...) или setLocation (...) компонентов.

1
добавлено
@ShyamalPandya: он может двигаться, но он не будет стабильным, если оставить макет как FlowLayout. Измените размер вашего графического интерфейса, и ваша кнопка будет «отключаться». Вы захотите узнать о менеджерах макетов, и в этом помогут учебные пособия.
добавлено автор Hovercraft Full Of Eels, источник
Я пробовал этот код, и, что интересно, кнопка перемещается, если текст ярлыка не обновляется. Почему это так?
добавлено автор Shyamal Pandya, источник
Я не могу получить ваши слова. можете ли вы объяснить это больше.
добавлено автор user1952211, источник
Я не думаю, что это правильно. зачем вызывать метод setLabelText вместо setText. И я также меняю макет. Тем не менее его не работает друг.
добавлено автор user1952211, источник

Вы не можете переместить кнопку именно так, менеджер компоновки сообщает, где она должна быть. Вызов setText запускает эффект менеджера компоновки для всей иерархии компонентов. Если вы действительно хотите это сделать, вы должны установить нулевой менеджер макетов и управлять всеми размерами и местоположениями всех компонентов вручную.

Даже если ваша кнопка двигалась в исходном коде, она не была правильно раскрашена, как только она покинула свое первоначальное место - вы можете случайно оскорбить Swing, но не полностью.

Рабочее решение:

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class MovingButton {
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                buildFrame();
            }
        });
    }

    private static void buildFrame() {
        JFrame f = new JFrame("Test");
        f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

        JPanel p = new JPanel();
        p.setPreferredSize(new Dimension(500, 500));
        p.setLayout(null);

        final JLabel label = new JLabel("Starting Text on Label");
        label.setLocation(200, 0);
        label.setSize(label.getPreferredSize());
        p.add(label);

        final JButton b = new JButton("Button");
        b.setSize(b.getPreferredSize());
        b.setLocation(0, 0);
        p.add(b);
        b.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                b.setLocation((int)b.getLocation().getX() + 20, (int)b.getLocation().getY() + 20);
                label.setText(String.valueOf(System.nanoTime()));
            }
        });


        f.add(p);
        f.pack();
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }
}
1
добавлено
Вот ты где...
добавлено автор lbalazscs, источник
Я имею в виду, что я отредактировал свой ответ, включив в него полный рабочий код, где кнопка перемещается, а ярлык обновляется ...
добавлено автор lbalazscs, источник
Его работа bt я просто хочу знать, что не так в моем коде ......
добавлено автор user1952211, источник
Привет, дорогие. Работает. Очень спасибо вам, брату ........ Спасибо
добавлено автор user1952211, источник
Я пробовал ваш код, но он не работает.
добавлено автор user1952211, источник
Что ты имеешь в виду
добавлено автор user1952211, источник
Могу ли вы дать мне какое-либо решение в этом коде дорого.
добавлено автор user1952211, источник
pro.jvm
pro.jvm
3 503 участник(ов)

Сообщество разработчиков Java Scala Kotlin Groovy Clojure Чат для нач-их: @javastart Наш сайт: projvm.com projvm.ru Наш канал: @proJVM Вакансии: @jvmjobs Конфы: @jvmconf

Java & Co
Java & Co
2 370 участник(ов)

Можно обсуждать с матом и без всё, что касается жабы, вплоть до холиваров. НЕ ИМЕЕТ ОТНОШЕНИЯ К САЙТУ JAVARUSH.RU ПРАВИЛА - https://t.me/javarush/75723 Вакансии сюда - https://telegram.me/joinchat/B7IzvUCnfo6d8t3yIxKguQ По вопросам - @thedude

learn.java
learn.java
1 888 участник(ов)

Чат для начинающих и не только Статистика: https://combot.org/chat/-1001083535868 Основной чат - @jvmchat

Java Underground
Java Underground
169 участник(ов)

https://vk.com/javatutorial

Javanese Questions
Javanese Questions
109 участник(ов)

Чат предназначен для обмена знаниями строго в формате в вопрос-ответ. Тема — Java, Kotlin и Android. Вопрос должен быть предварительно прогуглен, понятно и грамотно сформулирован, помечен хэштегами. Ответ — тем более. Куски кода размером в несколько строк можно писать прямо здесь, для больших кусков кода стоит использовать http://gist.github.com/, http://pastebin.com/, https://codeshare.io/ или любой аналогичный сервис. В некоторых случаях можно прикреплять скриншоты. Стикеры и гифки запрещены. Дополнять и уточнять вопросы и ответы — редактированием исходного сообщения. Обсуждения должны приводить к редактированию вопроса/ответа и удаляться. По хештегам можно искать существующие вопросы и овтеты: #вопрос #ответ #git #generics #java #server #awt #javafx #swing #kotlin #anko #tornadofx #ktor #android #recyclerView #performance #arch #network #permissions #storage #async