我是一名新的Java学习者。
我正在创建一个GUI应用程序。
此类从用户处获取一个数字,并在Frame上显示一个表。
当我运行我的课程时,我输入一个数字并单击JButton,但我的框架上的JLabel未显示。
它没有告诉我为什么不。
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;
import java.awt.event.*;
//this Frame class use the association
class Frame {
JFrame f;
JButton jb,jbclear;
JTextField jt;
JLabel jl1[]=new JLabel[10];
EventHandler hand=new EventHandler();
//constructor
Frame(){
f=new JFrame("Hello");
f.setSize(500,500);
f.setLayout(null);
JLabel jl=new JLabel("Enter the number");
jl.setBounds(30,10,100,20);
f.getContentPane().add(jl);
jt=new JTextField();
jt.setBounds(170,10,50,20);
f.add(jt);
jb=new JButton("Click");
jb.setBounds(270,50,80,30);
f.add(jb);
jb.addActionListener(hand);
jbclear=new JButton("Clear");
jbclear.setBounds(270,90,80,30);
f.add(jbclear);
jbclear.addActionListener(hand);
f.setVisible(true);
}
class EventHandler implements ActionListener{
public void actionPerformed(ActionEvent e){
if(e.getSource()==jb){
int num=Integer.parseInt((jt.getText()));
for(int i=0;i<10;i++){
int n=(num*i);
String s=String.valueOf(num)+" X "+i+" = "+n;
jl1[i]=new JLabel(s);
}
for(int i=0,k=80;i<10;i++){
jl1[i].setBounds(30,k,150,10);
f.add(jl1[i]);
jl1[i].setVisible(true);
k=k+30;
}
}
if(e.getSource()==jbclear){
for(int i=0;i<10;i++){
jl1[i].setText("");
}
}
}
}
public static void main(String [] args){
new Frame();
}
}
我们可以在创建和显示JFrame后添加组件吗?
答案 0 :(得分:1)
您创建了标签jl1[i]=new JLabel(s)
,但它们未添加到容器中。
不要使用null layout / setBounds(),而是选择合适的一个(例如GridLayout
或BoxLayout
)
答案 1 :(得分:1)
你的问题是下一个:
1)将所有组件添加到同一个组件中,例如f.getContentPane().add()
,因为您使用f.getContentPane().add()
和f.add()
添加了不同的容器。
2)如果将组件添加到可见的Frame / Panel / Container,则必须在添加后调用容器上的revalidate()
和repaint()
方法,因为如果没有这些方法,添加的组件将是不可见的。我以下一种方式改变你的ActionListener
(它做你想做的事):
class EventHandler implements ActionListener{
public void actionPerformed(ActionEvent e){
if(e.getSource()==jb){
int num=Integer.parseInt((jt.getText()));
for(int i=0;i<10;i++){
int n=(num*i);
String s=String.valueOf(num)+" X "+i+" = "+n;
jl1[i]=new JLabel(s);
}
for(int i=0,k=80;i<10;i++){
jl1[i].setBounds(30,k,150,10);
f.getContentPane().add(jl1[i]);
k=k+30;
}
f.getContentPane().revalidate();
f.getContentPane().repaint();
}
if(e.getSource()==jbclear){
for(int i=0;i<10;i++){
f.getContentPane().remove(jl1[i]);
}
f.getContentPane().revalidate();
f.getContentPane().repaint();
}
}
}
我建议您尝试使用LayoutManager代替setBounds()
方法并使用null布局。
答案 2 :(得分:1)
for(int i=0;i<10;i++){
int n=(num*i);
String s=String.valueOf(num)+" X "+i+" = "+n;
jl1[i]=new JLabel(s);
}
for(int i=0,k=80;i<10;i++){
jl1[i].setBounds(30,k,150,10);
f.add(jl1[i]);
jl1[i].setVisible(true);
好的,您要将JLabel
添加到JFrame
,更准确地添加到框架的内容窗格中,但您还没有在{{1}上调用repaint()
更新GUI。只要在完成添加JFrame
后立即致电f.repiant()
,也可以获得一些临时满意的输出。
我们可以在创建和显示JFrame后添加组件吗?
是的,但是我们应该使用正确的布局管理器。添加组件后,我们应该调用labels
和revalidate()
来适当地呈现GUI。
现在还有更多的东西:
repaint()
布局(或绝对布局),Null
,您不需要在此类组件上调用true
,但应用程序窗口除外setVisible(true)
JFrame
就是这么做的。<强>教程:强>