Java 如何从Jbutton actionlistener创建JLabel实例?
我试图在actionlistener事件中创建一个JLabel,因此请不要发布任何新的JLabel;actionlistener事件之外的实例。Main是JFrame,Credits是Jbutton,Oracle是我想要创建的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
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();
}
}
我冒昧地去掉了你书名中那些恼人的问号。仅供参考,如果你再把它们放进去的话,它们会吸引你的选票。对不起,语法错误,我不得不赶时间。你缺乏时间管理技能不是我们的问题。