Java 如何从Jbutton actionlistener创建JLabel实例?

Java 如何从Jbutton actionlistener创建JLabel实例?,java,swing,actionlistener,Java,Swing,Actionlistener,我试图在actionlistener事件中创建一个JLabel,因此请不要发布任何新的JLabel;actionlistener事件之外的实例。Main是JFrame,Credits是Jbutton,Oracle是我想要创建的Jlabel实例 代码如下: Credits.addActionListener(new ActionListener() { public void actionPerformed (ActionEvent e) { JLabel Ora

我试图在actionlistener事件中创建一个JLabel,因此请不要发布任何新的JLabel;actionlistener事件之外的实例。Main是JFrame,Credits是Jbutton,Oracle是我想要创建的Jlabel实例

代码如下:

 Credits.addActionListener(new ActionListener() {
    public  void actionPerformed (ActionEvent e)
    { 
      JLabel Oracle = new JLabel();
      Oracle.setBounds(100,300,300,300);
      Oracle.setText("HI");
     Main.add(Oracle);
     }
 });
建议:

首先也是最重要的是,不要设定任何东西的界限。使用设置边界。。。建议您使用空布局,这通常是新手Swing程序的标志,并且这些程序非常死板,难以更新、增强和调试。改用布局管理器。 接下来,接受JLabel的容器Main的布局管理器是键。有些不太适合添加组件,例如GroupLayout,而有些则更好,例如BoxLayout。 添加或删除组件后,调用revalidate并在容器上重新绘制。 作为一项不会直接影响您的问题的附带建议,为了帮助我们现在和将来帮助您自己,请编辑您的代码并更改您的变量名称以符合:所有类名都以大写字母开头,方法/变量名以小写字母开头。 如果您还需要更多帮助,请考虑创建和发布。 例如,带有解释性注释的代码:

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import javax.swing.*;

@SuppressWarnings("serial")
public class AddALabel extends JPanel {
   private static final int PREF_W = 300;
   private static final int PREF_H = 300;

   // The JPanel that gets the JLabels. GridLayout(0, 1) will stack them
   // in a single column
   private JPanel receivingPanel = new JPanel(new GridLayout(0, 1));

   // wrap the above JPanel in the below one, and add it 
   // BorderLayout.PAGE_START so that the newly added JLabels 
   // bunch to the top
   private JPanel wrapPanel = new JPanel(new BorderLayout());

   // put the outer JPanel, the wrapPanel into a JScrollPane
   private JScrollPane scrollpane = new JScrollPane(wrapPanel);

   // Holds text that goes into the newly created JLabel
   private JTextField textField = new JTextField("Foo", 10);

   public AddALabel() {
      // wrap the receiving panel.
      wrapPanel.add(receivingPanel, BorderLayout.PAGE_START);
      scrollpane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);

      JPanel northPanel = new JPanel();
      northPanel.add(textField);
      // add a JButton that does our work. Give it an Action/ActionListener
      northPanel.add(new JButton(new AddLabelAction("Add a Label")));

      setLayout(new BorderLayout());
      add(northPanel, BorderLayout.PAGE_START);
      add(scrollpane, BorderLayout.CENTER);
   }

   @Override
   public Dimension getPreferredSize() {
      if (isPreferredSizeSet()) {
         return super.getPreferredSize();
      }
      return new Dimension(PREF_W, PREF_H);
   }

   // the code for our Action/ActionListener
   private class AddLabelAction extends AbstractAction {
      public AddLabelAction(String name) {
         super(name);
      }

      @Override
      public void actionPerformed(ActionEvent e) {
         // get text from JTextField
         String text = textField.getText();

         // create JLabel and insert above text
         JLabel label = new JLabel(text);

         // add JLabel to receiving JPanel
         receivingPanel.add(label);

         // revalidate and repaint receiving JPanel
         receivingPanel.revalidate();
         receivingPanel.repaint();
      }
   }

   // create our GUI in a thread-safe way
   private static void createAndShowGui() {
      AddALabel mainPanel = new AddALabel();

      JFrame frame = new JFrame("AddALabel");
      frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
      frame.getContentPane().add(mainPanel);
      frame.pack();
      frame.setLocationByPlatform(true);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}

我认为您所缺少的只是对pack方法的调用,这里是我如何获得您想要的结果的:

public class Main extends JFrame {

    final JButton credits;

    public Main()
    {
        super("JLabel from JButton actionlistener");
        setSize(100, 100);        
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationByPlatform(true);

        credits = new JButton("Credits");

        credits.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent ae)
            {
                JLabel oracle = new JLabel();
                oracle.setText("Oracle licenses are out of price");
                Main.this.add(oracle);
                Main.this.pack();
            }
        });

        getContentPane().setLayout(new FlowLayout());
        add(credits);
        setVisible(true);
    }

    public static void main(String[] args) {
        new Main();
    }

}

我冒昧地去掉了你书名中那些恼人的问号。仅供参考,如果你再把它们放进去的话,它们会吸引你的选票。对不起,语法错误,我不得不赶时间。你缺乏时间管理技能不是我们的问题。