点击后如何创建标签? (我必须在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);
答案 0 :(得分:2)
你了解范围的概念吗? JLabel v
是本地范围的,无法从actionPerformed
外部访问。您可以将Frame.add(v);
放在 actionPerformed
内。然后你需要revalidate()
和repaint()
框架,就像在运行时添加组件时应该做的那样
附注
null布局会导致很多问题,因此您应该考虑使用布局管理器。有关详细信息,请查看Laying out Components Within a Container。
应在Event Dispatch Thread上运行Swing应用程序。您可以将main
中的代码包装在SwingUtilities.invokeLater(...)
中。详情请见Initial Threads
请注意setBounds
的硬编码值。这将导致只有一个添加的标签可见。我强烈建议您查看FlowLayout
或BoxLayout
等布局管理器。一种布局,可以动态添加组件"自然" 。
框布局示例
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();
}
});
}
}
答案 1 :(得分:2)
您似乎没有事件驱动环境的概念,并且正在以程序化的方式思考......
此...
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旨在与布局管理器一起工作,如果没有它们,屏幕无法更新就会出现问题,此外,像素完美布局是现代用户界面设计中的错觉,您无法控制字体,渲染管道或目标系统的其他方面,可能会影响像文本这样的大型元素的渲染。