如何在点击后创建标签?(我必须在actionPerformed方法中创建一个标签,不要问我为什么)ty !
public static void main (String [] args)
{
JFrame Frame = new JFrame ();
Frame.setSize(WIDTH_FRAME,HEIGHT_FRAME);
Frame.setLayout(null);
JButton Button = new JButton("x");
Button.setBounds(a,b,c,d);
Button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
JLabel v = new JLabel ("xxxxxxxxxx");
v.setBounds(50,50,50,50);
Frame.add(v);
Frame.revalidate();
Frame.repaint();
}
});
Frame.add(Button);
Frame.setVisible(true);
你理解作用域的概念吗?JLabel v
具有本地作用域,不能从actionPerformed
外部访问。你可以把Frame.add(v);
放在actionPerformed
里面。然后你需要revalidate()
和repaint()
帧,当你在运行时添加组件时应该这样做
-
null布局会导致很多问题,所以你应该考虑使用布局管理器。更多细节请参见在容器内布局组件。
-
Swing应用程序应该在事件调度线程上运行。可以通过将
main
中的代码包装到SwingUtilities.invokeLater(...)
中来实现。在Initial Threads 查看更多信息 注意
setBounds
的硬编码值。这将导致只有一个添加的标签可见。我强烈建议查看像FlowLayout
或BoxLayout
这样的布局管理器。 一个可以使动态添加组件更加"自然"的布局。
Box Layout示例
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.Box;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.SwingUtilities;
public class BoxLayoutDemo {
private Box box;
private int count = 1;
public BoxLayoutDemo() {
box = Box.createVerticalBox();
JButton button = createButton();
JScrollPane scroll = new JScrollPane(box);
scroll.setPreferredSize(new Dimension(200, 300));
JFrame frame = new JFrame();
frame.add(scroll);
frame.add(button, BorderLayout.NORTH);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
private JButton createButton() {
JButton button = new JButton("Add Label");
button.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
box.add(new JLabel("JLabel " + count));
box.add(Box.createVerticalStrut(10));
box.revalidate();
box.repaint();
count++;
}
});
return button;
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable(){
public void run() {
new BoxLayoutDemo();
}
});
}
}
您似乎没有事件驱动环境的概念,而是以过程方式思考…
…
Button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
JLabel v = new JLabel ("xxxxxxxxxx");
v.setBounds(50,50,50,50);
}
});
在执行时不调用actionPerformed
方法,因此当您按
v
还没有创建。Frame.add(v); // this does not work
尽管v
有actionPerformed
方法的本地内容,不能从外部引用。
actionPerformed
只有当Button
在某些支付中被操作(即用户点击它)时才会被调用。
相反,你应该做一些更像…
Button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
JLabel v = new JLabel ("xxxxxxxxxx");
v.setBounds(50,50,50,50);
Frame.add(v);
}
});
但是现在你有另一个问题,Frame
只有main
方法的局部上下文。您可以通过将Frame
声明为final
来纠正这个问题…
final JFrame Frame = new JFrame ();
指出:
大部分内容都是迭代的,并支持peeskillet(+1),这样做是因为它很重要,并且可以将答案四舍五入
- 不要使用
null
布局。Swing是为布局管理器而设计的,如果没有布局管理器,你将会遇到没完没了的屏幕更新问题,此外,像素完美的布局在现代用户界面设计中是一种错觉,你无法控制字体、渲染管道或目标系统的其他方面,这些方面可能会影响像文本这样的大元素的渲染。 - 通读并理解初始线程
- 通读和使用Java编程语言的代码约定