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



如何在点击后创建标签?(我必须在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的硬编码值。这将导致只有一个添加的标签可见。我强烈建议查看像FlowLayoutBoxLayout这样的布局管理器。

  • 一个可以使动态添加组件更加"自然"的布局。

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

尽管vactionPerformed方法的本地内容,不能从外部引用。

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编程语言的代码约定

相关内容

  • 没有找到相关文章

最新更新