如何在单击后在actionPerformed中创建标签?

时间:2014-03-28 02:06:33

标签: java swing user-interface scope jlabel

点击后如何创建标签? (我必须在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);

2 个答案:

答案 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的硬编码值。这将导致只有一个添加的标签可见。我强烈建议您查看FlowLayoutBoxLayout等布局管理器。一种布局,可以动态添加组件"自然"


框布局示例

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旨在与布局管理器一起工作,如果没有它们,屏幕无法更新就会出现问题,此外,像素完美布局是现代用户界面设计中的错觉,您无法控制字体,渲染管道或目标系统的其他方面,可能会影响像文本这样的大型元素的渲染。
  • 通读并理解Initial Threads
  • 通读并使用Code Conventions for the Java Programming Language