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