Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在单击后执行的操作中创建标签?_Java_Swing_User Interface_Scope_Jlabel - Fatal编程技术网

Java 如何在单击后执行的操作中创建标签?

Java 如何在单击后执行的操作中创建标签?,java,swing,user-interface,scope,jlabel,Java,Swing,User Interface,Scope,Jlabel,单击后如何创建标签?(我必须在actionPerformed方法中创建一个标签,不要问我为什么)ty 你理解范围的概念吗JLabel v在本地范围内,无法从执行的操作外部访问。你可以把Frame.add(v)在执行的操作中。然后您需要revalidate()和repaint()帧,就像您在运行时添加组件时应该做的那样 旁注 空布局会导致许多问题,所以您应该研究如何使用布局管理器。请查看以了解更多详细信息 Swing应用程序应在事件调度线程上运行。您可以通过将代码包装在main中的SwingU

单击后如何创建标签?(我必须在actionPerformed方法中创建一个标签,不要问我为什么)ty


你理解范围的概念吗<代码>JLabel v在本地范围内,无法从执行的
操作外部访问。你可以把
Frame.add(v)在执行的
操作中
。然后您需要
revalidate()
repaint()
帧,就像您在运行时添加组件时应该做的那样


旁注

  • 空布局会导致许多问题,所以您应该研究如何使用布局管理器。请查看以了解更多详细信息

  • Swing应用程序应在事件调度线程上运行。您可以通过将代码包装在
    main
    中的
    SwingUtilities.invokeLater(…)
    中来实现。更多信息请访问

  • 请注意
    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();
            }
        });
    }
}

你理解范围的概念吗<代码>JLabel v
在本地范围内,无法从执行的
操作外部访问。你可以把
Frame.add(v)在执行的
操作中
。然后您需要
revalidate()
repaint()
帧,就像您在运行时添加组件时应该做的那样


旁注

  • 空布局会导致许多问题,所以您应该研究如何使用布局管理器。请查看以了解更多详细信息

  • Swing应用程序应在事件调度线程上运行。您可以通过将代码包装在
    main
    中的
    SwingUtilities.invokeLater(…)
    中来实现。更多信息请访问

  • 请注意
    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();
            }
        });
    }
}

您似乎没有事件驱动环境的概念,并且正在以程序化的方式思考

这个

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.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设计用于布局管理器,如果没有布局管理器,您将无法解决屏幕更新的问题。此外,像素完美的布局在现代用户界面设计中是一种幻觉,您无法控制字体,渲染管道或目标系统的其他方面,这些方面可能会影响文本等大型元素的渲染程度
  • 通读并理解
  • 通读并使用

您似乎没有事件驱动环境的概念,并且以程序化的方式思考

这个

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.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设计用于布局管理器,如果没有布局管理器,您将无法解决屏幕更新的问题。此外,像素完美的布局在现代用户界面设计中是一种幻觉,您无法控制字体,渲染管道或目标系统的其他方面,这些方面可能会影响文本等大型元素的渲染程度
  • 通读并理解
  • 通读并使用

您需要调用
Frame.revalidate();Frame.repaint()在运行时添加组件时也是如此。你能给我一个例子吗?为什么你需要这个例子?我只是告诉你你需要做什么<代码>帧。添加(v);Frame.revalidate();Frame.repaint()
@MadProgrammer似乎是这样。我编辑了我的代码,你能检查一下吗?但是如何实例化框架呢?只需“JFrame”?您需要调用
Frame.revalidate();Frame.repaint()在运行时添加组件时也是如此。你能给我一个例子吗?为什么你需要这个例子?我只是告诉你你需要做什么<代码>帧。添加(v);Frame.revalidate();Frame.repaint()
@MadProgrammer似乎是这样。我编辑了我的代码,你能检查一下吗?但是如何实例化框架呢?只是“JFrame”?我放了最后的但当我