我只想在点击按钮时移动按钮,我也想更改标签文字。
我编写了移动按钮的代码,它对我来说很好。但是,当我想将标签文本更改为不同的名称时,它不会发生。
按钮正在从其位置移动或标签文本已更改。但我想一次执行两个操作,即按钮点击事件。我尽我所能尝试了很多东西。有人可以帮助我吗?
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();
}
});
}
}
答案 0 :(得分:1)
你不能像这样移动按钮,布局管理器告诉它应该在哪里。调用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 :(得分:1)
您需要为包含JLabel的类提供一个接受String的公共方法,并在其他对象希望更改标签所包含的文本时调用,如:
public void setLabelText(String text) {
label.setText(text);
}
然后,任何引用JLabel显示对象的对象都可以轻松更改标签的文本。
关于移动按钮,您需要阅读布局管理器。 JPanels默认使用FlowLayout,这不接受组件的setBounds(...)或setLocation(...)。